http://codepen.io/AlexKM/pen/JGEMjZ

turnTo: function (X, Y) {
    var angleDiff = 0,
        targetA = this.angleToPoint({
            x: X,
            y: Y
        }),
        dronA = this.angle;
    ///   If the angle difference can't be reached in a frame
    if (Math.abs(targetA - dronA) > this.turnSpeed * 1.25) {
        this.workingAngle = true;
        angleDiff = targetA - dronA;
        while (angleDiff < 0)
            angleDiff += 2 * Math.PI;
        while (angleDiff > 2 * Math.PI)
            angleDiff -= 2 * Math.PI;

        if (angleDiff >= Math.PI) {
            this.turningLeft = true;
        } else {
            this.turningRight = true;
        }

    } else ///  if the diff is negligible, reach it to save CPU
        this.angle = targetA;
},


更新处理实际转向的功能代码段:

    // apply turning
    if (this.turningLeft) {
        this.angle -= this.turnSpeed;
    }
    else if (this.turningRight) {
        this.angle += this.turnSpeed;
    }


红点-无人机面对
橙色点-指示无人机是否向左或向右旋转
青色点-表示无人机是否正在重新计算角度/正在执行三角测量

如果确实可以在testDrone.turnSpeed变量的一帧内到达鼠标角度,则代码DOES包含一个有助于平滑的部分。

大约有一半的时间,它转动并工作平稳。另一半抖动,交替向左和向右旋转并连续计算触发。

这可能是什么原因?

最佳答案

不错的脚本。 :)

我认为抖动可能是显示器(帧速率(fps)+处理时间)与刷新率之间差异的函数。我之所以这样说,是因为有时它看起来很平滑,有时又有些肿块,而且就鼠标位置/移动而言,似乎并没有什么特别的模式。

您是否考虑过在requestAnimationFrame()上使用setTimeout()See MDN HERE,其中指出...

这将要求您的动画函数在浏览器执行下一次重新绘制之前被调用。回调次数通常为每秒60次,但按照W3C的建议,通常将与大多数Web浏览器中的显示刷新率匹配。

有关限制requestAnimationFrame调用特定帧速率的信息,请参见markEthis StackOverflow question的响应。

希望能有所帮助。 :)

10-08 09:33