2011-11-16 143 views
7

我應該在這裏說明這一點,我不在數學人員附近。我在另一個問題中發現的代碼似乎有點工作...除了它導致我放置的對象大部分在屏幕外旋轉。圍繞中心vector2點的物體的旋轉

下面的代碼:

public void Update(GameTime gameTime) 
{ 
    Location = RotateAboutOrigin(Center, Origin, 0.01f); 
} 

public Vector2 RotateAboutOrigin(Vector2 point, Vector2 origin, float rotation) 
{ 
    var u = point - origin; //point relative to origin 

    if (u == Vector2.Zero) 
     return point; 

    var a = (float)Math.Atan2(u.Y, u.X); //angle relative to origin 
    a += rotation; //rotate 

    //u is now the new point relative to origin 
    u = u.Length() * new Vector2((float)Math.Cos(a), (float)Math.Sin(a)); 
    return u + origin; 
} 

位置由圍繞中心載體的任意位置點擊鼠標設置。

中心是我點擊時放置的對象的中心(你猜對了)。這是通過簡單地劃分紋理的高度和寬度來確定的。

原產地是vector2我試圖旋轉。它靜態設置爲384,384。


盡我所知,它得到兩個向量之間的距離,然後使用atan2來確定角度。其餘的事對我來說是個謎。我知道我應該知道一切都做了什麼,而且我準備在春季開始上大學時(僅延遲十年)。我試着讀過它們,但我迷路了。任何幫助,將不勝感激。另外,如果你有一個很好的傻瓜網站,你可以推薦,我很樂意通讀它。

+0

http://stackoverflow.com/questions/7846775/how-to-gradually-rotate-an-object-to-face-another-turning-the-shortest-distance – Olle89

回答

10

這裏是一個另類:

public Vector2 RotateAboutOrigin(Vector2 point, Vector2 origin, float rotation) 
{ 
    return Vector2.Transform(point - origin, Matrix.CreateRotationZ(rotation)) + origin; 
} 

它的「翻譯成世界原點,旋轉,然後轉回「位。

無論原點在哪裏相對於世界原點,這都會以'旋轉'弧度圍繞'原點'旋轉'點'。該觸發發生在'CreateRotationZ()'內置函數中。要了解它如何應用trig,請在框架中反映該方法。

編輯:固定變量名

2

儘管基礎理論可能有點難以理解,但使用它並不需要知道它的全部(站在巨人的肩膀上以及所有這些),但使用matricies可以輕鬆完成。

要旋轉向量繞原點:

Vector2.Transform(PosComponent.Direction, Matrix.CreateRotationZ(-0.1f)) 

哪裏PosComponent.Direction是我的矢量和-0.1f是想轉動(以弧度,不度)的量。

由於您想要圍繞原點以外的其他東西旋轉矢量,因此您需要先移動矢量,然後旋轉,然後將其移回。這基本上是你上面的代碼正在做的,除了獲得角度並使用trig來做旋轉。

不要做旋轉:

  1. 你得到相對於原點的點(在你的代碼),
  2. 然後旋轉要麼
    • 利用三角函數得到的角度,對其進行操作然後重新計算矢量(如在你的代碼中),或者使用matricies(如我的代碼中),
  3. 最後將向量移回(如在您的代碼中)。

這個問題,我的答案,也許有些用處的理解TRIG:Get position of point on circumference of circle, given an angle?