本文简介
点赞 + 关注 + 珍藏 = 学会了
还记得当初学 CSS
时,有点根底后立即就想搞点动画进去玩一下。
在理解了 Three.js 的根底概念之后也有这个想法。
简略的动画能够进步 Three.js 初学者
的学习趣味和信念。
本文会从初学者的角度登程解说几个简略的动画,包含:平移、旋转、缩放、跳跃。
筹备工作
在开始制作动画前,须要把根底的元素创立进去,之后所有动画案例都是基于上面的代码。
根底元素包含:
- 场景
- 摄像机
- 渲染器
- 立方体
- 辅助坐标轴
<script type="module"> import * as THREE from '../js/Three/src/Three.js' // 引入 Three.js // 1、创立场景 const scene = new THREE.Scene() // 2、创立相机(相似人的眼睛,能够看到货色) // 创立透视相机 const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000) // 设置相机对象的地位 // 别离传入 x y z 轴的坐标 camera.position.set(10, 10, 10) camera.lookAt(scene.position) // 将相机增加到场景中 scene.add(camera) // 增加物体 // 创立几何体 const cubeGeometry = new THREE.BoxGeometry(1, 1, 1) // 设置几何体材质 const cubeMaterial = new THREE.MeshBasicMaterial({color: 0xffff00}) // 依据几何体和材质创立物体 const cube = new THREE.Mesh(cubeGeometry, cubeMaterial) // 将几何体增加到场景中 scene.add(cube) // 初始化渲染器 const renderer = new THREE.WebGLRenderer() // 设置渲染的尺寸大小 renderer.setSize(window.innerWidth, window.innerHeight) // 把渲染器增加到body里 // 将 webgl 渲染的 canvas 内容增加到 body document.body.appendChild(renderer.domElement) // 应用渲染器,通过相机将场景渲染进去 // renderer.render(scene, camera) // 增加坐标轴辅助器 const axesHelper = new THREE.AxisHelper(5) // 将坐标轴增加到场景中 scene.add(axesHelper) // 渲染 renderer.render(scene, camera)</script>
此时页面就会呈现一个坐标轴和一个黄色的立方体,接下来就管制这个立方体静止。
如果对下面的代码还不太了解,能够先看看 《『Three.js』腾飞!》 ,坐标轴方面能够看看 《『Three.js』辅助坐标轴》 。
动画原理
这里讲的动画次要是指物体静止的成果。
第一个想到静止无关的 API
是 setInterval
,这个 API
能够设定每隔肯定时间段就执行一次。比方 setInterval(() => {}, 1000)
,就1秒执行1次外面的函数。但 setInterval
在做动画时可能会遭逢阻塞的状况。所以不能保障每次执行的工夫距离都雷同。于是举荐应用 requestAnimationFrame()
。
最简略的动画就是每一帧动一下,比方平移、旋转、缩放等。
平移
平移能够了解成扭转物体的地位。
在三维世界里,用 x、y、z
代表三个维度。
只有在每一帧都挪动一下,不论是哪个维度都行,就能够做出一个平移动画。
比方,做一个以 x轴
方向的动画(来回挪动)。
// 省略局部代码......// 正文掉本来的渲染办法,咱们须要另外写一个。// renderer.render(scene, camera)let step = 0 // 静止步长function render() { if (cube.position.x >= 4) { step = -0.08 } if (cube.position.x <= 0) { step = 0.08 } cube.position.x += step // 批改立方体在 x轴 的地位 renderer.render(scene, camera) requestAnimationFrame(render) // 反复执行渲染办法}render()
如果想做变速动画,能够应用 cos
计算新的步长。
// 省略局部代码......// 正文掉本来的渲染办法,咱们须要另外写一个。// renderer.render(scene, camera)let step = 0 // 静止步长function render() { step += 0.1 cube.position.x = 2 + Math.cos(step) renderer.render(scene, camera) requestAnimationFrame(render) // 反复执行渲染办法}render()
旋转
旋转也是能够依据 x、y、z
轴方向进行旋转。
批改到的属性是 rotation
。
function render() { cube.rotation.x += 0.01 cube.rotation.y += 0.01 cube.rotation.z += 0.01 renderer.render(scene, camera) requestAnimationFrame(render)}render()
缩放
缩放也是有3个维度方向,同样也很简略,只须要批改立方体的 scale
属性。
let step = 0.05function render() { cube.scale.x += step cube.scale.y += step cube.scale.z += step if (cube.scale.x >= 2) { step = -0.05 } if (cube.scale.x <= 1) { step = 0.05 } renderer.render(scene, camera) requestAnimationFrame(render)}render()
跳跃
跳跃须要扭转2个维度的值。
为了让跳跃成果更加难受,能够应用三角函数去计算步长。
let step = 0function render() { step += 0.08 cube.position.x = 4 * (Math.cos(step)) cube.position.y = 3 * Math.abs(Math.sin(step)) renderer.render(scene, camera) requestAnimationFrame(render)}render()
总结
数学很重要!
代码仓库
⭐几个Three.js简略动画
举荐浏览
《『Three.js』腾飞!》
《『Three.js』辅助坐标轴》
《『Three.js』场景 Scene》
《Canvas 从入门到劝敌人放弃(图解版)》
《Canvas 10款根底滤镜(原理篇)》
点赞 + 关注 + 珍藏 = 学会了
代码仓库