2012-03-04 265 views
0

我有一個船的紋理,正好在船的端口下面是一個導彈的紋理。當我旋轉船舶時,我需要導彈停留在相對於船舶的相同位置(即,在港口翼下)。我讀過一些文章以及與此(抱歉,這是一個有點亂)想出了:圍繞一個點旋轉

 private void RotateWeapons() 
    { 
     float x, y; 
     /* 
     x = leftMissile.X + (radius * (float)Math.Cos(Rotation)); 
     y = leftMissile.Y + (radius * (float)Math.Sin(Rotation)); 
     */ 

     leftMissile = Vector2.Transform(leftMissile - center, Quaternion.CreateFromAxisAngle(Vector3.Backward, Rotation)) + center; 

     //leftMissile.X = x; 
     //leftMissile.Y = y; 
    } 

leftMissileVector2描述導彈的中間,center是船的中心爲Vector2。它幾乎可以工作,精靈圍繞中心旋轉。問題是,它並沒有停留在港口翼上的同一點上。

這是正常的: This is normal

這是90度,這進一步的斷翼: 90 Degree Rotation

並旋轉180度時,它甚至不是在船上了: 180 Degree Rotation

+0

我想嘗試從旋轉計算中刪除'center',看看它是如何影響結果的。 – ChrisF 2012-03-04 22:11:29

+0

我試圖從開始和結束時獨立地取消中心。它也做了同樣的事情...... – Jack 2012-03-05 00:08:57

+0

嗯 - 紋理是如何定義的以及每個紋理是(0,0)? – ChrisF 2012-03-05 00:14:00

回答

2

你應該考慮做的是保持你的船的導彈的保持不變(readonly偏移

//non-rotated, where is the missile relative to the ship? 
readonly Vector2 missileOffset = new Vector2(5.0f, 2.0f); 

這使得物體保持在船的相對空間中。然後,您只需簡單地轉換偏移量,然後將其添加到船的位置:

//rotation of ship as quaternion 
Quaternion rotation = Quaternion.CreateFromAxisAngle(Vector3.Backward, angle); 
//the final position for the missile 
Vector2 leftMissile = Vector2.Transform(missileOffset, rotation) + shipPosition; 

這將使導彈在適當的位置。然後,假設你使用SpriteBatch,只是在路過角度既旋轉兩個艦和導彈:

batch.Begin(); 
batch.Draw(shipTex, shipPosition, null, Color.White, angle, Vector2.Zero, 1.0f, SpriteEffects.None, 1.0f); 
batch.Draw(missileTex, leftMissile, null, Color.White, angle, Vector2.Zero, 1.0f, SpriteEffects.None, 1.0f); 
batch.End(); 
+0

這工作很好!非常感謝!!! – Jack 2012-03-05 00:27:45

0

如果你有一個向前的向量和中心,是很容易calc下它。

enter image description here

  1. 正常化邁進。

    Forward.Normalize();

  2. 獲取正常矢量轉發。

    Normal.X = Forward.Y; Normal.Y = -Forward.X;

  3. 獲取導彈的位置。 MissilePos = CenterShip - Forward * OffsetY(+或 - )Normal * OffsetX;