Three.js(四)——动画与相机

292 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第4天,点击查看活动详情 >>

动画

想要立方体实现绕y轴旋转以及其他动画的效果,有以下几种写法:

简单写法

// 渲染循环
function render() {
// 执行渲染操作
    renderer.render(scene, camera);
    // 每次绕y轴旋转0.01弧度
    cube.rotateY(0.01);
    // 请求再次执行渲染函数render,渲染下一帧
    requestAnimationFrame(render);
}
render();

一般写法

// Time 上次执行结束的时间
let time = Date.now();

// Animations  动画
const tick = () => {
    // Time 当前时间
    const currentTtime = Date.now();
    const deltaTime = currentTtime - time;
    time = currentTtime;

    // Update objects
    // cube.position.x += 0.01;
    // 立方体绕y轴旋转(0.001*时间差)度
    cube.rotation.y += 0.001 * deltaTime;

    // Render
    renderer.render(scene, camera);
    window.requestAnimationFrame(tick);
}
tick();

优化写法

// Clock
const clock = new THREE.Clock();
// Animations
const tick = () => {
    // Clock
    const elapsedTime = clock.getElapsedTime();

    // 相机移动
    camera.position.y = Math.sin(elapsedTime);
    camera.position.x = Math.cos(elapsedTime);
    camera.lookAt(cube.position)

    // Render
    renderer.render(scene, camera);
    window.requestAnimationFrame(tick);
}
tick();

Clock补充

该对象用于跟踪时间。如果performance.now可用,则 Clock 对象通过该方法实现,否则回落到使用略欠精准的来实现。

getElapsedTime方法

获取自时钟启动后的秒数,同时将 .oldTime 设置为当前时间。 如果 .autoStart 设置为 true 且时钟并未运行,则该方法同时启动时钟。

Camera 相机

PerspectiveCamera 透视相机

const camera = new THREE.PerspectiveCamera(75, sizes.width / sizes.height, 1, 2000);

OrthographicCamera 正交相机

// 六个参数分别为:上下左右近远
const camera = new THREE.OrthographicCamera(-1, 1, 1, -1, 1, 2000);

透视相机和正交相机的区别就是可视体的设置方法不同:
透视相机的可视体是一个四锥体,而正交相机是一个长方体;
透视相机由四锥体投影到一个平面时,相同大小的网格离上顶面越近投影到far横截面自然更大,这个原理类似于手电光投影到墙面;
正交相机用长方体进行投影的话,同样大小的网格无论位于矩形的哪一个位置,其投影到far横截面的大小总是一样的,类似于平行光投影到墙面。
透视相机可视体如下:

cb7e492f5b86d57b0bca412275e13e5c.png

正交相机可视体如下:

d2d4e6b210a66bbba103b3b3756a48b7.png