渲染动画的循环动态更新对象

动画的核心概念是在一段时间内以较小的数量更新对象的属性(通常是旋转和平移)。例如,如果你通过每十分之一秒将 X 位置增加 0.1 来平移一个物体,那么它将在 1 秒内在 X 轴上进一步增加 1 个单位,但是观察者会认为它已经平稳地移动到那个位置。时间而不是直接跳到新的位置。

为了帮助我们,我们在脚本中创建了一个渲染循环

var render = function () {
    requestAnimationFrame( render );
    //update some properties here
    renderer.render(scene, camera);
}

在上面的旋转立方体示例中,我们使用这个想法 - 小增量更新 - 每次请求新的动画帧时更改立方体的旋转。通过在每个帧上递增 cube 对象的 rotation.xrotation.y 属性,立方体似乎在这两个轴上旋转。

另一个例子是,将所需的更新分成其他函数并不罕见,在这些函数中,你可以执行其他计算和检查,同时保持渲染循环整洁。例如,下面的渲染循环调用四个不同的更新函数,每个函数用于更新场景中的单独对象(或者在 updatePoints() 的情况下为对象数组)。

//render loop
function render() {
    requestAnimationFrame( render );
    updateGrid();
    updateCube();
    updateCamera();
    updatePoints(pList);
    renderer.render( scene, camera);
}
render();

你可能会在网上的示例中注意到相机控件也是渲染循环的一部分。

controls = new THREE.OrbitControls( camera, renderer.domElement );
controls.enableDamping = true;
controls.dampingFactor = 0.25;
controls.enableZoom = true;
controls.autoRotate = true;

var render = function () {
    requestAnimationFrame( render );
    controls.update();
    renderer.render(scene, camera);
};

这是因为用于控制相机的脚本正在做同样的事情; 随着时间推移更新它。这些更改可能是由用户输入引起的,例如鼠标位置,或类似跟踪路径的程序。无论哪种情况,我们都只是为相机制作动画。