three.js关键帧动画KeyframeTrack、AnimationClip、AnimationMixer

2023-12-19

参考资料: threejs中文网

threejs qq交流群:814702116

关键帧动画

打开课件案例源码,你可以看到物体从一个位置移动到另一个位置的动画效果,移动过程中也出现过颜色变化。

课件源码效果具体描述,就是 0 3秒**物体逐渐从坐标**原点**移动端**x轴100**位置,然后**3 6秒 物体逐渐从 x轴100 移动到 z轴100 位置,同时 2~5秒 时间内,把物体从 红色 逐渐改变为 蓝色

关键帧动画解释

所谓关键帧动画,你可以理解为在时间轴上,选择几个关键的时间点,然后分别定义这几个时间点对应物体状态(比如位置、姿态、颜色等),然后基于几个关键的 时间——状态 数据,生成连续的动画。

课件源码 位置 关键帧数据( 时间——状态 )

  • 0秒:坐标原点
  • 3秒:x轴上100坐标
  • 6秒:z轴上100坐标

课件源码 颜色 关键帧数据( 时间——状态 )

  • 2秒:红色
  • 5秒:蓝色

1. 创建关键帧动画 AnimationClip

  • 1.1 给需要设置关键帧动画的模型命名
  • 1.2 设置关键帧数据 KeyframeTrack
  • 1.3 基于关键帧数据 KeyframeTrack ,创建关键帧动画 AnimationClip
// 给需要设置关键帧动画的模型命名
mesh.name = "Box";
const times = [0, 3, 6]; //时间轴上,设置三个时刻0、3、6秒
// times中三个不同时间点,物体分别对应values中的三个xyz坐标
const values = [0, 0, 0, 100, 0, 0, 0, 0, 100];
// 0~3秒,物体从(0,0,0)逐渐移动到(100,0,0),3~6秒逐渐从(100,0,0)移动到(0,0,100)
const posKF = new THREE.KeyframeTrack('Box.position', times, values);
// 从2秒到5秒,物体从红色逐渐变化为蓝色
const colorKF = new THREE.KeyframeTrack('Box.material.color', [2, 5], [1, 0, 0, 0, 0, 1]);
// 1.3 基于关键帧数据,创建一个clip关键帧动画对象,命名"test",持续时间6秒。
const clip = new THREE.AnimationClip("test", 6, [posKF, colorKF]);

1.1 模型命名

你如果你想给一个模型对象设置关键帧动画,比如一个网格模型mesh、一个层级模型group,模型需要有一个名字,没有的话,可以通过 .name 属性命名。

mesh.name = "Box";

1.2 KeyframeTrack 设置关键帧数据

KeyframeTrack 参数1是一个字符串,字符串内容是模型对象的 名字.属性 构成,比如 Box.position 表示模型位置,比如 Box.material.color 表示模型颜色,参数2是时间轴上取的几个关键帧时间点,参数3是时间点对应的物体状态。

位置 关键帧数据( 时间——状态 )

  • 0秒:坐标原点
  • 3秒:x轴上100坐标
  • 6秒:z轴上100坐标
// 给名为Box的模型对象的设置关键帧数据KeyframeTrack
const times = [0, 3, 6]; //时间轴上,设置三个时刻0、3、6秒
// times中三个不同时间点,物体分别对应values中的三个xyz坐标
const values = [0, 0, 0, 100, 0, 0, 0, 0, 100];
// 创建关键帧,把模型位置和时间对应起来
// 0~3秒,物体从(0,0,0)逐渐移动到(100,0,0),3~6秒逐渐从(100,0,0)移动到(0,0,100)
const posKF = new THREE.KeyframeTrack('Box.position', times, values);

颜色 关键帧数据( 时间——状态 )

  • 2秒:红色
  • 5秒:蓝色
// 从2秒到5秒,物体从红色逐渐变化为蓝色
const colorKF = new THREE.KeyframeTrack('Box.material.color', [2, 5], [1, 0, 0, 0, 0, 1]);

1.3 创建关键帧动画 AnimationClip

基于关键帧数据 KeyframeTrack ,创建关键帧动画 AnimationClip ,这样就可以利用关键帧里面的数据生成一个关键帧动画,用于接下来的动画播放。

下面代码基于关键帧数据posKF、colorKF,创建一个clip关键帧动画对象 AnimationClip ,命名为 test ,动画持续时间6秒。

// 1.3 AnimationClip表示一个关键帧动画,可以基于关键帧数据产生动画效果
// 创建一个clip关键帧动画对象,命名"test",动画持续时间6s
// AnimationClip包含的所有关键帧数据都放到参数3数组中即可
const clip = new THREE.AnimationClip("test",6,[posKF, colorKF]);

2.1 AnimationMixer 播放关键帧动画 AnimationClip

前面代码,已经编辑好一个模型mesh的关键帧动画 AnimationClip ,如果你想播放动画,就要借助播放器 AnimationMixer

//包含关键帧动画的模型对象作为AnimationMixer的参数创建一个播放器mixer
const mixer = new THREE.AnimationMixer(mesh);

执行播放器 AnimationMixer .clipAction() 方法返回一个 AnimationAction 对象, AnimationAction 对象用来控制如何播放,比如 .play() 方法。

//AnimationMixer的`.clipAction()`返回一个AnimationAction对象
const clipAction = mixer.clipAction(clip); 
//.play()控制动画播放,默认循环播放
clipAction.play(); 

2.2 mixer.update() 更新播放器 AnimationMixer 时间

如果想播放动画开始变化,需要周期性执行 mixer.update() 更新播放器 AnimationMixer 时间数据,比如你可以在 requestAnimationFrame 创建的可以周期性执行的函数中,更新播放器时间数据。

function loop() {
    requestAnimationFrame(loop);
}
loop();

通过 Clock 对象辅助获取每次loop()执行的时间间隔。

const clock = new THREE.Clock();
function loop() {
    requestAnimationFrame(loop);
    //clock.getDelta()方法获得loop()两次执行时间间隔
    const frameT = clock.getDelta();
}
loop();

执行 mixer.update() 更新播放器 AnimationMixer 时间数据

function loop() {
    requestAnimationFrame(loop);
    const frameT = clock.getDelta();
    // 更新播放器相关的时间
    mixer.update(frameT);
}
loop();

如果你不想用 requestAnimationFrame 重新创建一个循环执行函数,也可以在index.js文件渲染循环中引入 mixer.update() 的代码

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

three.js关键帧动画KeyframeTrack、AnimationClip、AnimationMixer 的相关文章

  • THREE.js 正交相机缩放到鼠标点

    我正在为我们的 THREE js 应用程序开发正交相机 本质上 该相机将以 2D 方式向用户呈现场景 用户可以选择在 2D 和 3D 相机之间切换 该相机将允许平移和缩放到鼠标点 我可以进行平移 也可以进行缩放 但不能缩放到鼠标点 这是我的
  • 在Three.js中,如何翻译Vector3?

    我创建了一个Vector3 called ori 我已经填充了它的坐标 x y 和 z 现在 我该如何平移该矢量 例如沿 z 轴 的指示值 我试过这个 ori translateZ 100 这给我一个错误 TypeError 无法读取未定义
  • Three.js 在平面上旋转相机

    我的应用程序中有一个相机 camera new THREE PerspectiveCamera 75 window innerWidth window innerHeight 0 1 1000 camera position z 1 cam
  • Three.js ShaderMaterial 灯光问题

    你好 这是我的代码的一部分 地球仪 function createGlobe var normalMap THREE ImageUtils loadTexture images earth normal 2048 jpg var surfa
  • 如何将 3D 模型从 Cinema4D 导出到 Three.js?

    如果我有一个网格建模4D影院 我怎样才能将其导出three js http github com mrdoob three js3D JS 引擎 另外 导出材料也很方便colors for 多边形选择 为此 我刚刚为 Cinema4D 编写
  • 向几何体添加细分

    我正在尝试向球体添加细分 如下所示 http stemkoski github com Three js Subdivision Cube html http stemkoski github com Three js Subdivisio
  • Three.jsmaterialLoader不加载嵌入的纹理图像

    我使用 Material toJSON 提供的方法导出 Three js 材质 结果如下 metadata version 4 5 type Material generator Material toJSON uuid 8E6F9A32
  • 获取网格顶点的最佳方法 Three.js

    我是 Three js 的新手 所以也许我不会以最佳方式解决这个问题 我创建的几何图形如下 const geo new THREE PlaneBufferGeometry 10 0 然后我对其进行旋转 geo applyMatrix new
  • 从数组 THREE.js 创建纹理

    我正在研究地形生成器 但我不知道如何处理颜色 我希望能够生成一张占据整个 PlaneGeometry 的图像 我的问题是如何根据我的高度图创建一个覆盖整个 PlaneGeometry 没有环绕 的单个图像 我可以想到一种方法 但我不确定它是
  • 绕局部轴旋转

    我正在尝试实现一个对象 围绕一个位置 POI 兴趣点 飞行并面向它 当您按 WASD 时 您可以更改 POI 的旋转 A 和 D gt 更改 y 轴 W 和 S 更改 x 轴 正如您在演示中看到的 http jsbin com yodusu
  • 给定 3D 空间中的一条线,如何找到从它到一点的角度?

    我在 3D 空间中有两组点 我想画一条穿过两组点的中心的线 然后找到从该线到每个点的角度 从那里开始 我将根据两个角度的接近程度来确定两组中的匹配点 我知道如何找到每组点的中心 只需将它们平均在一起 并且我知道如何将它们匹配 甚至考虑到它们
  • 如何在 Three.js 中从三角面获取多边形?

    我在网上查了一下是否有人遇到同样的问题 我正在使用 Three js 我有一个 3DObject 其中可能包含孔 面是三角形的 假设我想从上面看到它 我的目标是获得一个代表顶面周长的多边形 这对我来说意味着不再有三角面 而只有 1 个多边形
  • 将球体 a 旋转到自身的 b 点

    我试图弄清楚如何将球体从 A 点旋转到 B 点 我找到了一些Unity3d代码 Quaternion rot Quaternion FromToRotation pointA pointB sphere transform rotation
  • 在 React 中渲染 Three.js 元素?

    我正在尝试制作一个渲染 Three js 场景的 React 组件 但是 每当我尝试安装组件而不是看到正在渲染的任何类型的场景时 我只看到文本 object HTMLCanvasElement 正在显示 这是我的组件 import Reac
  • 调试 Three.js 中的低 FPS

    我正在处理 Three js WebGL 场景 当我缩小时 我注意到 60 FPS 以便所有观察结果 约 20 000 个三角形 都在视图中 但当我放大时 FPS 非常低 因此只有一个小三角形的子集在视野中 我想弄清楚是什么导致了这种差异
  • Three.js - 如何翻译几何图形

    我有一个脚本 可以定位各种宽度 高度和深度的立方体 并且正在努力根据 xAxis yAxis 和 zAxis 也有所不同 将它们准确地排列起来 var geometry new THREE BoxGeometry width height
  • THREE.JS,忽略父级的轮换

    我试图使子对象跟随父级位置并表现得像一个普通的子对象 但是我希望它保持其旋转不变 在不影响性能的情况下 最好的方法是什么 我的CPU预算很紧张 已经运行了2个工作线程并且有很多对象 是否有设置只允许孩子的位置受到影响 同样重要的是 当父级旋
  • 开始使用 Three.js 中的行进立方体

    我是 Three js 的新手 正在寻找教程来帮助我开始了解如何在 Three js 中使用 Marching Cubes 到目前为止 我在 Three js 中看到的一些使用它的项目对我来说有点复杂 所以一个简单的教程会很好 谢谢 像您一
  • 三-mtl-loader 错误:THREE.MeshPhongMaterial:.shading 已被删除 -> 对象不可见

    昨天我问了这个问题 未捕获的类型错误 THREE MTLLoader 不是构造函数 2 0 https stackoverflow com questions 47741644 uncaught typeerror three mtlloa
  • 渲染 ThreeJS 应用程序第一帧时的性能问题

    目前 当我渲染以下内容时 我的 ThreeJS 应用程序的性能受到很大影响第一帧 它会导致 Edge 和 IE 11 浏览器冻结 5 秒 并弹出窗口指示 此窗口没有响应 这可能会吓到我的用户 使用 Chrome 的性能分析器 问题似乎来自几

随机推荐

  • 服务器安全最常见的5大威胁!

    服务器安全是将服务器的软件和硬件保护起来 以防止黑客对服务器构架和数据进行未经授权的访问及操作 也是网络安全体系中的重要组成部分 本文主要为大家介绍一下最常见的影响服务器安全的5大因素 一起来了解一下 1 电子邮件欺骗 电子邮件欺骗是一种网
  • 网络安全岗位面试题

    前言 介绍了网络安全岗位常见的面试题 仅供参考 一 常识部分 1 Linux服务器种用户关键信息存储在那个文件中 启动 停止 重启 开机自启mysql服务命令 如何查找 etc test txt文件中 password 关键字信息 如何精确
  • SpringCloud有什么优势

    SpringCloud是一个基于Spring Boot的微服务框架 它提供了许多工具和库 可以帮助开发者更容易地构建和部署分布式系统 以下是SpringCloud的一些主要优势 易于集成 SpringCloud提供了丰富的工具和库 可以帮助
  • 【思扬赠书 | 第1期】教你如何一站式解决OpenCV工程化开发痛点

    写在前面参与规则 参与方式 关注博主 点赞 收藏 评论 任意评论 每人最多评论三次 本次送书1 3本 取决于阅读量 阅读量越多 送的越多 思扬赠书 第1期活动开始了 机器视觉 缺陷检测 工业上常见缺陷检测方法 方法一 基于简单二值图像分析
  • 【华为OD】给定一个整数数组nums,请你在该数组中找出两个数,使得这两个数 的和的绝对值abs(nums[x] + nums[y])为最小值并按从小到大返回这 两个数以及它们和的绝对值

    题目描述 给定一个整数数组nums 请你在该数组中找出两个数 使得这两个数 的和的绝对值abs nums x nums y 为最小值并按从小到大返回这 两个数以及它们和的绝对值 每种输入只会对应一个答案 数组中同一 个元素不能使用两遍 输入
  • 2023年30米分辨率土地利用遥感监测数据

    改革开放以来 中国经济的快速发展对土地利用模式产生了深刻的影响 同时 中国又具有复杂的自然环境背景和广阔的陆地面积 其土地利用变化不仅对国家发展 也对全球环境变化产生了深刻的影响 为了恢复和重建我国土地利用变化的现代过程 更好地预测 预报土
  • 请解释Nginx代理中的正向代理和反向代理

    正向代理 Forward Proxy 和反向代理 Reverse Proxy 是Nginx代理模式中的两种主要类型 正向代理 Forward Proxy 是一种代理服务器 它允许客户端 用户 通过它访问远程服务器 在这种模式下 客户端发送的
  • 讲解module ‘tensorflow‘ has no attribute ‘Session‘

    目录 讲解module tensorflow has no attribute Session 错误原因 解决方案 总结 讲解module tensorflow has no attribute Session 在使用TensorFlow进
  • 广州软件第三方测试报告需要盖CNAS\CMA吗?怎么取费?

    CNAS CMA资质 1 CMA资质标识 根据报告接收方要求 第三方测试报告上是否加盖CMA标识 第三方测试机构执行标准为GB T25000 51和GB T25000 10标准 2 CNAS标识 ILAC MRA国际互认标识 通常第三方测试
  • SDN前沿技术【SMaRT-5G项目】

    目录 引言 节能方法 快速了解投资回报率 ROI ONF SMaRT 5G Initiative RAN 能量优化 方法 电池开 关方法 MIMO 睡眠和 RF 通道打开 关闭 高级睡眠模式 ASM RAN节能解决方案的
  • 【最新】2023年30米分辨率土地利用遥感监测数据

    改革开放以来 中国经济的快速发展对土地利用模式产生了深刻的影响 同时 中国又具有复杂的自然环境背景和广阔的陆地面积 其土地利用变化不仅对国家发展 也对全球环境变化产生了深刻的影响 为了恢复和重建我国土地利用变化的现代过程 更好地预测 预报土
  • Dubbo 注册中心挂了,consumer 还能不能调用 provider?

    在 Dubbo 中 如果注册中心 如 Zookeeper Nacos 等 出现故障 消费者 consumer 仍然可以调用提供者 provider 的服务 但需要满足以下条件 消费者和提供者之间的通信配置正确 消费者需要知道提供者的地址和端
  • Clion远程开发无法解析头文件,但是代码可以正常编译运行

    问题 当我在使用Clion进行远程开发时 需要用到Opencv库 我首先在CMakeLists txt添加了opencv库 如下 find package OpenCV REQUIRED INCLUDE DIRECTORIES OpenCV
  • 天眼情报分析——问题收集

    分为几类 一 代码实现问题 1 将两个字符串交替合并 这段代码错在逻辑错误 由于w1此时小于w2剩下的部分应该是w2而不是w1 我分析这位星友错误的原因应该是对底层逻辑实现没有深入理解 学到了不少 多多交流是好事 二 如何使用GitHub
  • NFS原理详解

    一 NFS介绍 1 什么是NFS 它的主要功能是通过网络让不同的机器系统之间可以彼此共享文件和目录 NFS服务器可以允许NFS客户端将远端NFS服务器端的共享目录挂载到本地的NFS客户端中 在本地的NFS客户端的机器看来 NFS服务器端共享
  • Java是怎么运行起来的?深入理解Java虚拟机

    介绍Java的工作原理和JVM的内部结构 微信搜索关注 Java学研大本营 Java虚拟机 JVM 是一个运行时环境 可以执行用Java编程语言编写的程序 Java语言是一种高级语言 它通过抽象和封装的机制 让开发者可以专注于业务逻辑和功能
  • 瑞芯微 rk3568的npu使用,部署unet网络

    文章目录 rk3568 1 6 0 1 在任一个ubuntu系统上安装RKNN Toolkit2 1 1 下载 1 2 安装 2 在机器端 板端 查看 RKNPU2的驱动 3 RKNN使用说明
  • Linux Centos 配置 Docker 国内镜像加速

    在使用 Docker 进行容器化部署时 由于国外的 Docker 镜像源速度较慢 我们可以配置 Docker 使用国内的镜像加速器 以提高下载和部署的效率 本文将介绍如何在 CentOS 系统上配置 Docker 使用国内镜像加速 步骤一
  • 南大通用的时间类型的使用解析

    示例sql create table TCK DATE TEXT id INTEGER not null date date DEFAULT TODAY
  • three.js关键帧动画KeyframeTrack、AnimationClip、AnimationMixer

    参考资料 threejs中文网 threejs qq交流群 814702116 关键帧动画 打开课件案例源码 你可以看到物体从一个位置移动到另一个位置的动画效果 移动过程中也出现过颜色变化 课件源码效果具体描述 就是 0 3秒 物体逐渐从坐