围绕一个点旋转

时间:2012-03-04 21:07:09

标签: c# xna sprite

我有一艘船的纹理,就在船的机翼下方是导弹纹理。当我旋转船时,我需要导弹保持在相对于船的相同位置(即在港口翼下)。我读了一些文章并想出了这个(对不起,它有点乱):

        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;
    }

leftMissile是描述导弹中间的Vector2,而centerVector2的船中心。它几乎可以工作,精灵围绕中心旋转。问题是,它并没有停留在港口机翼的同一点上。

这是正常的: This is normal

这是90度,它离机翼更远: 90 Degree Rotation

当旋转180度时,它甚至不再在船上了: 180 Degree Rotation

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分:0)

如果你有一个前向矢量和中心,很容易计算它。

enter image description here

  1. 向前规范化。

    Forward.Normalize();

  2. 获取正常的向量。

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

  3. 获取导弹的位置。

    MissilePos = CenterShip - 转发* OffsetY(+或 - )正常* OffsetX;