为什么这个转速在Three.js中偏差(1/2)?

时间:2014-12-21 20:44:31

标签: javascript rotation three.js modeling

我在其轴上模拟地球的旋转。由于地球在其轴上的一次完整旋转等于

(2*Math.PI)

弧度,我想我可以计算地球每分钟(每帧)的旋转量

(2*Math.PI)/(24*60)

。我目前使用requestAnimationFrame()方法渲染60FPS,这意味着程序运行的每一秒,我应该模拟一小时的实际地球自转。我检查了Chrome中的javascript控制台,它的渲染速度为60FPS。然而,模拟似乎运行速度是原来的两倍,即,每12秒我得到一次完整的旋转而不是每24次。如果我将表达式更改为

(2*Math.PI)/(24*60*2)

,我突然得到正确的旋转速度,24秒= 1完全旋转。我很高兴我能够让这个程序工作,但是我很难理解为什么我需要将表达式乘以因子(1/2)为了实现这一点。有没有人有任何想法,为什么我可能会得到这种行为?提前谢谢。

我在渲染函数中使用的表达式是

earth.rotation.y += (2*Math.PI)/(24*60*2)

1 个答案:

答案 0 :(得分:2)

requestAnimationFrame使用每帧可用的最佳帧时间,它可以稍微改变并在几秒钟内修改运动。

  1. 我无法解释你的惊人结果,但是当需要纯粹依赖时间的动作时,可以做的是将动作乘以自上次渲染以来的时间:

    var lastDate = new Date();
    
    function render () {
    
        var now = new Date();
        var delay = now - lastDate;
        lastDate = now;
    
        earth.rotation.y += delay * your-rotation-coeff
    
        requestAnimationFrame( render );
        renderer.render( scene, camera );
    
    }
    
  2. 但是new Date()并不是最精确的JavaScript功能。它是performance.now()which is not available in all browsers。因此,您可以简单地使用功能Clock来完成所有这些功能并且可以更快地实现,而不是编写所有前四行加上回退代码,而不是写入所有前四行和回退代码:

    var clock = new THREE.Clock();
    
    function render () {
    
        earth.rotation.y += clock.getDelta() * your-rotation-coeff
    
        requestAnimationFrame( render );
        renderer.render( scene, camera );
    
    }