2015-04-29 109 views
3
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弧度表示)时,它会一直顺时针转到新的光标位置(如红色所示)。但是,我想要的路径是直接进入新角度(绿色箭头)。角度动画与atan2

enter image description here

编辑:

这是我想出了,似乎工作。我能改善吗?

  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)); 

回答

3

你必须考虑到atan2的输出只能在-pi到+ pi的范围内。如果atan2的输出与前一个角度之间的差值大于pi,那么您知道发生了一些回绕,并且必须通过加/减2 * pi来进行更正。

+0

适用于一次旋转,但在第二次旋转时做同样的事情。我假设我必须继续添加/减去2pi,但是我已经完成了很多旋转。 – John

+0

您可以使用模运算符来避免重复的加/减 - http://stackoverflow.com/questions/16505559/how-can-i-use-modulo-operator-in-javascript。 –

+0

谢谢,我有一些工作。我将它添加到OP,我可以简化它吗? – John