var diffx = (this.destination.x - pos.x), px = diffx / dist;
var diffy = (this.destination.y - pos.y), py = diffy / dist;
var angle = Math.atan2(diffy, diffx) - rot.z;
rot.set(0, 0, rot.z + angle / 24);
一个物体指向我的鼠标光标。我使用上面的代码来计算角度(弧度制)并在几个帧之内“动画”角度。然而,当
angle
变量从正数变为负数(在PI弧度处),它会顺时针旋转到新鼠标位置(如红色所示)。然而,我期望的路径是直接到达新角度(绿色箭头)。编辑:
这就是我想出来的解决方法,似乎有效。我能做得更好吗?
if(atan - this.lastAtan < -Math.PI)
atan += Math.PI * 2;
else if(atan - this.lastAtan > Math.PI)
atan -= Math.PI * 2;
this.lastAtan = atan;
var zrot = rot.z + (atan * 12 * Game.dt);
rot.set(0, 0, zrot % (Math.PI * 2));
this.lastAtan = atan
才是真正使其工作的关键。 - Jack Whithamif(atan - this.lastAtan < -Math.PI)
只对一次旋转成立,因为我只执行了atan += Math.PI * 2;
一次。在我的当前解决方案之前,我尝试使用一个名为rotations
的内部变量,并记录它穿过边界的次数,并每次旋转时添加2pi。然而,我的当前方法不需要内部状态。 - John