我在其轴上模拟地球的旋转。由于地球在其轴上的一次完整旋转等于
(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)
答案 0 :(得分:2)
requestAnimationFrame
使用每帧可用的最佳帧时间,它可以稍微改变并在几秒钟内修改运动。
我无法解释你的惊人结果,但是当需要纯粹依赖时间的动作时,可以做的是将动作乘以自上次渲染以来的时间:
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 );
}
但是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 );
}