2012-03-04 222 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;