在Three.js中动画 简单案例

      在Three.js中,动画是指在场景中创建和控制对象的运动和变化。模型是指通过Three.js加载的3D对象,可以是几何体、网格或复杂的模型文件(如.obj或.gltf)。动画可以存在于模型中,也可以单独定义。

编辑关键帧:
关键帧动画是通过关键帧KeyframeTrack和剪辑AnimationClip两个API来完成,实际开发中如果需要制作一个复杂三维模型的帧动画,比如一个人走路、跑步等动作,一般情况是美术通过3dmax、blender等软件编辑好,不需要程序员用代码实现。

播放关键帧
通过操作AnimationAction和混合器AnimationMixer两个API播放已有的帧动画数据。

混合器THREE.AnimationMixer()的参数是案例代码中编写的两个网格模型的父对象group,实际开发中参数Group也可以是你加载外部模型返回的模型对象。

播放关键帧动画的时候,注意在渲染函数render()中执行mixer.update(渲染间隔时间)告诉帧动画系统Threejs两次渲染的时间间隔,获得时间间隔可以通过Threejs提供的一个时钟类Clock实现。

总结
1.需要一个父级的组,在其中加入网格对象,命名网格对象
2.编辑关键帧
(1) 运用KeyframeTrack和剪辑AnimationClip两个API
(2) new THREE.KeyframeTrack可以在关键帧中设置位置,颜色,缩放等属性,用时间点和变化的数值
(3) 设置播放时间duration
(4)创建剪辑clip对象,命名,持续时间,关键帧。
3.播放关键帧
操作AnimationAction和混合器AnimationMixer两个API播放
(1) new THREE.AnimationMixer(group);播放组中所有子对象的帧动画
(2)clip作为参数,通过混合器clipAction方法返回一个操作对象AnimationAction
(3)通过操作Action设置播放方式,调节播放速度,是否循环
(4)开始播放
4.渲染
(1)创建时钟对象
(2)执行渲染操作,请求再次渲染,渲染下一帧,更新混合器相关时间。

效果
 

源码: 



<template>
  <div ref="container"></div>
</template>


<script setup lang="ts">
//导入资源
import { ref, onMounted, onUnmounted } from 'vue';
import * as THREE from 'three';

//引入加载器
import {RGBELoader} from "three/examples/jsm/loaders/RGBELoader";
import {OrbitControls} from "three/examples/jsm/controls/OrbitControls";
import {GLTFLoader} from "three/examples/jsm/loaders/GLTFLoader";

const container =  ref(null);
let scene = undefined;
let camera = undefined;
let renderer = undefined;
let controls = undefined; //控制器
const model = ref(null);
const mixer = ref(null);
const clock = ref(null);

//加载完毕后执行
onMounted(() => {

    //渲染器
    renderer = new THREE.WebGLRenderer({
      antialias:true,
    // alpha:true
    });
    renderer.setSize( window.innerWidth, window.innerHeight );
    container.value.appendChild(renderer.domElement);

    //场景
    scene = new THREE.Scene();
    scene.background = new THREE.Color( 0xf0f0f0 );

    //相机
    camera = new THREE.PerspectiveCamera( 50, window.innerWidth / window.innerHeight, 1, 10000 );
    camera.position.set(15,15,15);
    //  camera.lookAt(new THREE.Vector3(0,0,0));
    camera.lookAt( scene.position );
    scene.add(camera);

    //灯光
    var light = new THREE.DirectionalLight( 0xffffff, 1 );
    light.position.set( 3, 1, 1 ).normalize();//向量属性向量转换为单位向量,方向设置为和原向量相同,长度为1
    light.intensity=1.5;//强度
    scene.add(light);


    //动画网格模型
    var material1 = new THREE.MeshLambertMaterial({
      color:0x0000ff
    });
    var geometry1 = new THREE.BoxGeometry(5,2,3);
    var mesh1 = new THREE.Mesh(geometry1, material1);
    mesh1.name="Box";
    mesh1.position.set(0,2,0);

    var material2 = new THREE.MeshLambertMaterial({
      color:0x00ff00
    });
    var geometry2 = new THREE.SphereGeometry(1, 50, 50);
    var mesh2 = new THREE.Mesh(geometry2, material2);
    mesh2.name="Sphere";
    mesh2.position.set(0,5,0);

    var group = new THREE.Group();
    group.add(mesh1,mesh2);
    scene.add(group);

    controls = new OrbitControls(camera, renderer.domElement);
    controls.update();


    //编辑group子对象网格模型mesh1和mesh2的帧动画数据
    //创建名为Box对象的关键帧数据
    var times = [0, 10];//关键帧事件数组,离散时间点序列
    var values = [0,0,0,10,0,0]//与时间点对应的值组成的数组
    //创建位置关键帧对象:0时刻对应位置0,0,0,10时刻对应位置150,0,0
    var posTrack = new THREE.KeyframeTrack('Box.position', times, values);
    //创建燕娥关键帧对象:10时刻对应颜色1,0,0    20时刻对应颜色0,0, 1
    var colorKF = new THREE.KeyframeTrack('Box.material.color', [10, 20], [1, 0, 0, 0, 0, 1]);
    // 创建名为Sphere对象的关键帧数据,从0-20时间段,尺寸scale缩放3倍
    var scaleTrack = new THREE.KeyframeTrack('Sphere.scale', [0, 20], [1, 1, 1, 3, 3, 3]);

    //duration 决定了默认的播放时间,一般取所有帧动画的最大事件
    //duration偏小,帧动画数据无法播放完,偏大,播放完帧动画会继续空播放

    var duration = 20;

    //多个帧动画座位元素创建一个剪辑clip对象,命名“default”,持续时间20
    var clip = new THREE.AnimationClip("default", duration, [posTrack, colorKF, scaleTrack]);

    // 播放编辑好的关键帧

    //group作为混合器的参数,可以播放group中所有子对象的帧动画
    var mixer = new THREE.AnimationMixer(group);
    //剪辑clip作为参数,通过混合器clipAction方法返回一个操作对象AnimationAction
    var AnimationAction = mixer.clipAction(clip);
    //通过操作Action设置播放方式
    AnimationAction.timeScale = 20;//默认1,可以调节播放速度
    // AnimationAction.loop = THREE.LoopOnce; //不循环播放
    AnimationAction.play();//开始播放

    //创建一个时钟对象Clock
    var clock = new THREE.Clock();

    // 渲染场景
    const animate = () => {
      requestAnimationFrame(animate);
      renderer.render(scene, camera);

      //clock.getDelta()方法获得两帧的时间间隔
      //更新混合器相关时间
      mixer.update(clock.getDelta());
    };

  animate();

})
</script>



<style scoped>

</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/125603.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据结构与算法C语言版学习笔记(5)-串,匹配算法、KMP算法

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、串的定义二、串的存储结构1.顺序结构2.链式结构 三、串的朴素的模式匹配算法&#xff08;暴力匹配算法&#xff09;1.背景2.假设我们要从下面的主串 S"…

app自动化测试(Android)--显式等待机制

WebDriverWait类解析 WebDriverWait 用法代码 Python 版本 WebDriverWait(driver,timeout,poll_frequency0.5,ignored_exceptionsNone)参数解析&#xff1a; driver&#xff1a;WebDriver 实例对象 timeout: 最长等待时间&#xff0c;单位秒 poll_frequency: 检测的间隔步…

华为L410上制作内网镜像模板02

原文链接&#xff1a;华为L410上制作离线安装软件模板02 hello&#xff0c;大家好啊&#xff0c;今天给大家带来第二篇在内网搭建Apache服务器&#xff0c;用于安装完内网操作系统后&#xff0c;在第一次开机时候&#xff0c;为系统安装软件的文章&#xff0c;今天给大家介绍在…

nodejs+vue+python+PHP+微信小程序南七街道志愿者服务平台的设计与实现-计算机毕业设计推荐

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…

PCIe寄存器之二

关键字索引&#xff1a; CAP_PM 对应&#xff1a;Capabilities: [c0] Power Management CAP_MSI 对应&#xff1a;Capabilities: [c8] MSI CAP_MSIX对应&#xff1a;Capabilities: [e0] MSI-X CAP_EXP 对应&#xff1a;Capabilities: [70] Express (v2) Endpoint 以上 [] 内的…

【云栖2023】张治国:MaxCompute架构升级及开放性解读

简介&#xff1a; 本文根据2023云栖大会演讲实录整理而成&#xff0c;演讲信息如下 演讲人&#xff1a;张治国|阿里云智能计算平台研究员、阿里云MaxCompute负责人 演讲主题&#xff1a;MaxCompute架构升级及开放性解读 活动&#xff1a;2023云栖大会 MaxCompute发展经历了…

网络基础(1)

目录&#xff1a; 1.了解局域网&#xff08;LAN&#xff09;和广域网&#xff08;WAN&#xff09; 2.认识“协议” 3.浅谈OSI七层模型 4.网络传输的基本流程 5.路由器这个设备 ---------------------------------------------------------------------------------------…

手写一个Webpack,带你了解构建流程

如果对前端八股文感兴趣&#xff0c;可以留意公重号&#xff1a;码农补给站&#xff0c;总有你要的干货。 前言 Webpack是一个强大的打包工具&#xff0c;拥有灵活、丰富的插件机制&#xff0c;网上关于如何使用Webpack及Webpack原理分析的技术文档层出不穷。最近自己也是发现…

回归预测 | Matlab实现PCA-PLS主成分降维结合偏最小二乘回归预测

回归预测 | Matlab实现PCA-PLS主成分降维结合偏最小二乘回归预测 目录 回归预测 | Matlab实现PCA-PLS主成分降维结合偏最小二乘回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 Matlab实现PCA-PLS主成分降维结合偏小二乘回归预测&#xff08;完整源码和数据) 1.输…

【19】c++11新特性 —>线程异步

什么是异步&#xff1f; async的两种方式 //方式1 async( Function&& f, Args&&... args ); //方式2 async( std::launch policy, Function&& f, Args&&... args );函数参数&#xff1a; f:任务函数 Args:传递给f的参数 policy:可调用对象f的…

微信的通讯录联系人,有没有什么办法导出来做备份

6-10 这是可以做到的&#xff0c;并且很简单&#xff0c;对于需要把微信通讯录备份出来&#xff0c;或者离职交接的人来说&#xff0c;本文非常适合阅读&#xff0c;只是一个简单的方法&#xff0c;即可快速地把微信的通讯录搞出来&#xff0c;本质其实就是使用正确的工具就行…

C++指针访问数组 函数中用指针传参

用指针访问数组 在函数中用指针传参

2023 年最新腾讯官方 QQ 机器人(QQ 群机器人 / QQ 频道机器人)超详细开发教程

注册 QQ 开放平台账号 QQ 开放平台是腾讯应用综合开放类平台&#xff0c;包含 QQ 机器人、QQ 小程序、QQ 小游戏 等集成化管理&#xff0c;也就是说你注册了QQ 开放平台&#xff0c;你开发 QQ 机器人还是 QQ 小程序都是在这个平台进行部署上线和管理。 如何注册 QQ 开放平台账…

小程序day05

使用npm包 Vant Weapp 类似于前端boostrap和element ui那些的样式框架。 安装过程 注意:这里建议直接去看官网的安装过程。 vant-weapp版本最好也不要指定 在项目目录里面先输入npm init -y 初始化一个包管理配置文件: package.json 使用css变量定制vant主题样式&#xff0…

记误删Linux的python与yum

根据各路大神的方法整理一下自己解决的步骤 注意&#xff1a;不要手贱删python2&#xff01;想用python3就安装并用python3命令 重新安装python2 查看系统版本&#xff1a; cat /etc/redhat-release进入默认的安装地址&#xff1a;注意查看一下rpm文件是不是删干净了&#x…

Python---列表的循环遍历,嵌套

循环遍历就是使用while或for循环对列表中的每个数据进行打印输出 while循环&#xff1a; list1 [貂蝉, 大乔, 小乔]# 定义计数器 i 0 # 编写循环条件 while i < len(list1):print(list1[i])# 更新计数器i 1 for循环&#xff08;推荐&#xff09;&#xff1a; list1 [貂…

Spring Boot 3.0正式发布及新特性解读

目录 【1】Spring Boot 3.0正式发布及新特性依赖调整升级的关键变更支持 GraalVM 原生镜像 Spring Boot 最新支持版本Spring Boo 版本版本 3.1.5前置系统清单三方包升级 Ref 个人主页: 【⭐️个人主页】 需要您的【&#x1f496; 点赞关注】支持 &#x1f4af; 【1】Spring Boo…

2023.11.8 hadoop学习-概述,hdfs dfs的shell命令

目录 1.分布式和集群 2.Hadoop框架 3.版本更新 4.hadoop架构详解 5.页面访问端口 6.Hadoop-HDFS HDFS架构 HDFS副本 7.SHELL命令 8.启动hive服务 1.分布式和集群 分布式: 多台服务器协同配合完成同一个大任务(每个服务器都只完成大任务拆分出来的单独1个子任务)集 群:…

phpstudy本地快速搭建网站,实现无公网IP外网访问

文章目录 [toc]使用工具1. 本地搭建web网站1.1 下载phpstudy后解压并安装1.2 打开默认站点&#xff0c;测试1.3 下载静态演示站点1.4 打开站点根目录1.5 复制演示站点到站网根目录1.6 在浏览器中&#xff0c;查看演示效果。 2. 将本地web网站发布到公网2.1 安装cpolar内网穿透2…

使用ESP8266构建家庭自动化系统

随着物联网技术的不断发展&#xff0c;家庭自动化系统变得越来越受欢迎。ESP8266是一款非常适合于构建家庭自动化系统的WiFi模块。它小巧、低成本&#xff0c;能够实现与各种传感器和执行器的连接&#xff0c;为家庭带来智能化、便利化的体验。在本篇文章中&#xff0c;我们将向…