我有一艘船的纹理,就在船的机翼下方是导弹纹理。当我旋转船时,我需要导弹保持在相对于船的相同位置(即在港口翼下)。我读了一些文章并想出了这个(对不起,它有点乱):
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
,而center
是Vector2
的船中心。它几乎可以工作,精灵围绕中心旋转。问题是,它并没有停留在港口机翼的同一点上。
这是正常的:
这是90度,它离机翼更远:
当旋转180度时,它甚至不再在船上了:
答案 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)
如果你有一个前向矢量和中心,很容易计算它。
向前规范化。
Forward.Normalize();
获取正常的向量。
Normal.X = Forward.Y; Normal.Y = -Forward.X;
获取导弹的位置。
MissilePos = CenterShip - 转发* OffsetY(+或 - )正常* OffsetX;