『Three.js』几个简单的入门动画(新手篇)


theme: smartblue

本文简介

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

还记得当初学 CSS 时,有点基础后立刻就想搞点动画出来玩一下。

在了解了 Three.js 的基础概念之后也有这个想法。

简单的动画可以提高 Three.js 初学者 的学习兴趣和信心。

本文会从初学者的角度出发讲解几个简单的动画,包括:平移、旋转、缩放、跳跃。

准备工作

在开始制作动画前,需要把基础的元素创建出来,之后所有动画案例都是基于下面的代码。

基础元素包括:

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

01.png

```html

```

此时页面就会出现一个坐标轴和一个黄色的立方体,接下来就控制这个立方体运动。

如果对上面的代码还不太理解,可以先看看 《『Three.js』起飞!》 ,坐标轴方面可以看看 《『Three.js』辅助坐标轴》

动画原理

这里讲的动画主要是指物体运动的效果。

第一个想到运动有关的 APIsetInterval ,这个 API 可以设定每隔一定时间段就执行一次。比如 setInterval(() => {}, 1000) ,就1秒执行1次里面的函数。但 setInterval 在做动画时可能会遭遇阻塞的情况。所以不能保证每次执行的时间间隔都相同。于是推荐使用 requestAnimationFrame()

最简单的动画就是每一帧动一下,比如平移、旋转、缩放等。

平移

平移可以理解成改变物体的位置。

在三维世界里,用 x、y、z 代表三个维度。

只要在每一帧都移动一下,不管是哪个维度都行,就可以做出一个平移动画。

比如,做一个以 x轴 方向的动画(来回移动)。

02.gif

```js // 省略部分代码......

// 注释掉原本的渲染方法,我们需要另外写一个。 // 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 计算新的步长。

03.gif

```js // 省略部分代码......

// 注释掉原本的渲染方法,我们需要另外写一个。 // 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

04.gif

```js 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 属性。

05.gif

```js 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个维度的值。

为了让跳跃效果更加舒服,可以使用三角函数去计算步长。

06.gif

```js 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款基础滤镜(原理篇)》

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值