缓慢,彻底的转弯而不是立即面向目标

时间:2011-09-01 23:48:15

标签: c# math xna rotation artificial-intelligence

我有这个代码转向面对目标并朝着它们前进:

var x : Number = _targetPosition.value.x - _position.value.x;
var y : Number = _targetPosition.value.y - _position.value.y;

var targetAngle : Number = Math.atan2(y, x);

_angle.value = targetAngle; 
_velocity.value.setXY(Math.cos(targetAngle) * 90, Math.sin(targetAngle) * 90);

我怎么会转而说一个度数(或四分之一弧度或任何你想要使用的东西,我可以转换任何一种方式)而不是一帧?目标可能正在移动,所以我不能使用需要时间考虑的公式......它应该只是将X度转换为一帧而不是立即捕捉。

另外,如果你可以告诉我如何应用这种旋转,考虑到deltaTime也很棒,但我可以尝试解决这个问题。

谢谢!

1 个答案:

答案 0 :(得分:6)

除非你强迫你的程序在固定的时间步骤运行,否则任何未能将时间推移考虑在内的算法都可能不正确。根据硬件的不同,帧率可能会有很大差异;以80 FPS在您的计算机上运行的解决方案对Joe Superuser以$ 200 FPS运行游戏的$ 5000 Alienware不会产生相同的效果。

您需要计算物体当前角度与目标角度之间的差异,然后根据这两者之间的差异将其角度增加一定量,再乘以自上一帧开始经过的时间。

考虑以下内容(在我的头顶,未经测试)代码:

// Find the difference in angles, always going in the direction of least movement
var target = Math.atan2(x, y);
var difference = target - _angle.value;
if (difference > Math.PI)
{
    difference = ((2 * Math.PI) - difference);
}
if (difference < -Math.PI)
{
    difference = ((2 * Math.PI) + difference);
}
// Move the character's rotation a set amount per unit time
var delta = (difference < 0) ? -RotationChangePerSecond : RotationChangePerSecond;
_angle.value += delta * gameTime.ElapsedGameTime.TotalSeconds;

目标是否正在移动最终无关紧要。你问这个代码的问题是,“目前目标在哪里,我该怎么办才能面对它?”如果目标的位置在后续帧中发生变化,那么您需要移动的方向也会发生变化,并且对象将开始以相反的方向旋转,如我所假设的那样。