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

Cha*_*ner 2 c# math xna artificial-intelligence rotation

我有这个代码转向面对目标并向他们移动:

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);
Run Code Online (Sandbox Code Playgroud)

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

此外,如果您可以告诉我如何应用该旋转考虑到deltaTime也会很好,但我可以尝试解决这个问题.

谢谢!

Col*_*ell 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;
Run Code Online (Sandbox Code Playgroud)

目标是否在移动最终无关紧要.你与此代码问的问题是,"哪里是目标,现在和我有什么做的去面对它?" 如果目标的位置在后续帧中发生变化,那么您需要移动的方向也将发生变化,并且对象将开始以相反的方向旋转,正如我假设您想要的那样.