逐渐旋转一个对象来面对一个点?
问题描述:
我正在制作一款javascript游戏,我希望敌船能够朝指定点旋转。然后可以从他们的角度计算他们的运动。只有在船舶位于其目标的右下方时,以下代码才能起作用。如果船在左侧,则旋转至〜0度并在那里抖动。在右上角持续逆时针旋转。 我在这里做错了什么?任何关于更好的方法的建议?逐渐旋转一个对象来面对一个点?
obj.angle %= 360;
// Calculate angle to target point
var targetAngle = Math.atan2(obj.mode.dest.y - obj.y, obj.mode.dest.x - obj.x) * (180/Math.PI) + 90;
// Get the difference between the current angle and the target angle
var netAngle = Math.abs(obj.angle - targetAngle) % 360;
// Turn in the closest direction to the target
netAngle > 180 ? obj.angle += obj.shipType.turnSpeed : obj.angle -= obj.shipType.turnSpeed;
if(obj.angle < 0) obj.angle += 360;
if(obj.angle > 360) obj.angle -= 360;
我的问题是非常相似的this one,哪个更好解释了,但不幸的是,在C#中。
编辑:这里是工作的代码,任何人谁可能会发现它有用:
obj.angle %= 360;
var targetAngle = Math.atan2(obj.mode.dest.y - obj.y, obj.mode.dest.x - obj.x) * (180/Math.PI) + 90;
targetAngle = (targetAngle + 360) % 360;
if(obj.angle != targetAngle)
{
var netAngle = (obj.angle - targetAngle + 360) % 360;
var delta = Math.min(Math.abs(netAngle - 360), netAngle, obj.shipType.turnSpeed);
var sign = (netAngle - 180) >= 0 ? 1 : -1;
obj.angle += sign * delta + 360;
obj.angle %= 360;
}
这当然是在正确方向迈出的一步。但是,它仍然有一些怪癖。看看它是如何翻转的,然后在船只到达目标的右下角时转回来:http://jsfiddle.net/57hAk/4/。我也注意到它一次跳到45度的目标角度,但我还没有能够重现这一点。 – Austen 2012-08-06 18:25:10
好的,这里是左上角从3跳到135:http://jsfiddle.net/57hAk/5/ – Austen 2012-08-06 18:38:21
整理了一下并修正了过度旋转 – tobyodavies 2012-08-07 00:09:41