我已经到处寻找解决我的平滑旋转问题的方法。我可以让它 99% 正常工作,但是有一个小问题一直困扰着我。除非目标发生剧烈变化,否则旋转工作正常。基本思想是我有一个球和一个球员,当球员接触到球时,他会改变球的方向和速度。球员正确地跟随球,但是当他与球接触或球的位置被重置,从而使角度之间的增量大于 45 度时,球员会立即跳起来接球。这是我部分工作的代码。感谢您提前提供任何帮助。
var newFacing = Math.atan2(theBall.y-player.y,theBall.x-player.x);
var diff = (Math.abs(newFacing) - Math.abs(player.facing));
if (diff < Math.PI*0.1 && diff > -Math.PI*0.1){
player.facing = newFacing;
}else if (diff > Math.PI) {
player.facing -= Math.PI*0.1;
} else {
player.facing += Math.PI*0.1;
}
if (player.facing > Math.PI) {
player.facing -= Math.PI*2;
} else if (player.facing < -Math.PI) {
player.facing += Math.PI*2;
}
更新:更改了 || 到 && 并添加了一个条件以确保我不会高于或低于 PI 弧度。在某些角度仍然存在一些奇怪的旋转问题。例如,如果球从球员下方经过,他将顺时针旋转而不是逆时针顺时针旋转。有时,球员会在再次跟踪球之前进行完整的 360 度测量。如果不追踪它,我不确定是什么条件导致了这种情况。