【问题标题】:Missile System Math Problem (very few code)导弹系统数学问题(很少的代码)
【发布时间】:2011-09-02 03:47:43
【问题描述】:

我希望导弹按照以下规则跟随玩家:
- 当玩家相对于导弹位于右侧时,以固定速率向右改变旋转
- 否则以相同的速度向左旋转

            if (missile.Rotation > 0 && missile.Rotation < Math.PI)
            {
                if (angle > missile.Rotation && angle < missile.Rotation + Math.PI)
                {
                    missile.Rotation += 0.05f;
                }
                else
                {
                    missile.Rotation -= 0.05f;
                }
            }
            else
            {
                if (angle < missile.Rotation && angle > missile.Rotation - Math.PI)
                {
                    missile.Rotation -= 0.05f;
                }
                else
                {
                    missile.Rotation += 0.05f;
                }
            }  
            missile.Position += new Vector2((float)(5 * gameTime.ElapsedGameTime.TotalSeconds * Math.Cos(missile.Rotation)), (float)(5 * gameTime.ElapsedGameTime.TotalSeconds * Math.Sin(missile.Rotation)));

使用此代码,某些导弹似乎出现错误,当我与玩家一起跳跃时,导弹进入无法停止的无限循环(它们会绕圈飞行)

坐标系类似于XNA(360/0°在右侧,270°在顶部...)

谁能帮帮我?

【问题讨论】:

  • 我还以为是真正的导弹..
  • angle = 从导弹到玩家的角度
  • @Bojan K:那些不是有 [Ada] 标签而不是 [C#] 吗? :) ...至于问题,您不使用 MathHelper.Lerp() 或类似方法是否有特定原因?
  • @Martin Sojka,是的,我想知道哪个白痴会为此使用 C#,这就是我检查它的原因。我也不知道 [xna] 是什么..

标签: c# xna


【解决方案1】:

使用欧拉角是一种非常低效的方法。使用向量要容易得多。

设 P 是玩家的位置,M 是导弹的位置。您需要从中计算两个向量:MP 和 Mr 其中 MP = 从导弹到玩家的向量,Mr 是指向导弹右侧的向量。现在计算向量 MP 和 Mr 之间的点积。结果的符号告诉你向哪个方向转动导弹。如果为正则顺时针转动导弹,如果为负则逆时针转动导弹。

为什么会这样?

两个向量A和B的点积可以写成:

Ax.Bx + Ay.By

还有:

|A|.|B|.cos (theta)

其中 theta 是两个向量之间的角度,|x|是向量 x 的大小。这给了我们:

cos (theta) = (Ax.Bx + Ay.By) / (|A|.|B|)

由于我们只想知道值 cos (theta) 的符号,正值是 +- 90 度之间的角度,负值是 90 到 270 度之间的角度,我们只需要计算出分子的符号,分母总是正的!因此点积的符号会告诉我们目标在哪一边。

但是,您在想,向量不是比角度更难使用吗?我不需要做一些三角函数来计算导弹的右矢量吗?

理想情况下,您根本不应该将欧拉角用于任何事情。您应该使用矩阵来存储世界中对象的位置和旋转。导弹的右向量只是导弹位置/方向矩阵的第一行(或第一列,取决于您如何设置系统)。矩阵是渲染硬件用来绘制对象的东西,因此使用它们不会增加任何开销(事实上,使用角度会增加开销,因为需要将角度符号转换为矩阵进行渲染)。

编辑:你的代码最终应该是这样的:

if (VectorDotProduct (missile.right, player.pos - missil.pos) > 0)
{
   missile.rotate clockwise
}
else
{
   missile.rotate anti-clockwise
}

【讨论】:

  • 另外:XNA 提供了一套非常全面的向量和矩阵操作方法,使这变得非常简单。
猜你喜欢
  • 2016-10-16
  • 2020-05-15
  • 2010-12-21
  • 1970-01-01
  • 1970-01-01
  • 2018-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多