乐趣区

关于前端:Threejs-几个简单的动画

本文简介

点赞 + 关注 + 珍藏 = 学会了

还记得当初学 CSS 时,有点根底后立即就想搞点动画进去玩一下。

在理解了 Three.js 的根底概念之后也有这个想法。

简略的动画能够进步 Three.js 初学者 的学习趣味和信念。

本文会从初学者的角度登程解说几个简略的动画,包含:平移、旋转、缩放、跳跃。

筹备工作

在开始制作动画前,须要把根底的元素创立进去,之后所有动画案例都是基于上面的代码。

根底元素包含:

  1. 场景
  2. 摄像机
  3. 渲染器
  4. 立方体
  5. 辅助坐标轴

<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』辅助坐标轴》。

动画原理

这里讲的动画次要是指物体静止的成果。

第一个想到静止无关的 APIsetInterval,这个 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.05

function 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 = 0

function 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 款根底滤镜(原理篇)》

点赞 + 关注 + 珍藏 = 学会了
代码仓库

退出移动版