three.js 关键帧动画

效果:

代码:

<template><div><el-container><el-main><div class="box-card-left"><div id="threejs" style="border: 1px solid red"></div><div class="box-right"><el-button type="primary" @click="start">循环播放</el-button><el-button type="primary" @click="start_once">播放一次</el-button><el-button type="primary" @click="start_clamp">保持播放结束效果</el-button><el-button type="primary" @click="stop">结束动画</el-button><el-button type="primary" @click="pausedFn">暂停</el-button><el-button type="primary" @click="time_scale">2倍速循环播放</el-button><el-button type="primary" @click="time_duration">控制动画播放特定时间开始(2秒)</el-button><div style="margin-top: 20px;"></div><el-progress:percentage="percentage":format="format"></el-progress><el-button-group><el-button icon="el-icon-minus" @click="decrease">播放速度</el-button><el-button icon="el-icon-plus" @click="increase">播放速度</el-button></el-button-group><el-slider v-model="value1" @change="change"></el-slider>动画播放(拖动任意时间状态)</div></div></el-main></el-container></div>
</template>
<script>
// 引入轨道控制器扩展库OrbitControls.js
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js";
import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader.js";
// 效果制作器
import { EffectComposer } from "three/examples/jsm/postprocessing/EffectComposer.js";
// 渲染通道
import { RenderPass } from "three/examples/jsm/postprocessing/RenderPass.js";
// 发光描边OutlinePass
import { OutlinePass } from "three/examples/jsm/postprocessing/OutlinePass.js";
import {CSS2DObject,CSS2DRenderer,
} from "three/examples/jsm/renderers/CSS2DRenderer.js";export default {data() {return {value1: 0,percentage: 20,name: "",scene: null,camera: null,renderer: null,effectComposer: null,mesh: null,geometry: null,group: null,material: null,texture: null,position: null,outlinePass: null,clock: null,mixer: null,clip_action: null,request_animation_frame: null,canvasWidth: 1000,canvasHeight: 800,color: [],meshArr: [],};},created() {},mounted() {this.name = this.$route.query.name;this.init();},methods: {goBack() {this.$router.go(-1);},// 动画播放(拖动任意时间状态)change(e) {console.log("e:", e);this.clip_action.paused = true;this.clip_action.clampWhenFinished = true;this.clip_action.time = 0.1 * e;},format(percentage) {return percentage / 10 + "倍";},increase() {this.percentage += 10;if (this.percentage > 100) {this.percentage = 100;}this.clip_action.timeScale = this.percentage / 10;},decrease() {this.percentage -= 10;if (this.percentage < 0) {this.percentage = 0;}this.clip_action.timeScale = this.percentage / 10;},init() {//  创建场景对象this.scene = new this.$three.Scene();// 创建立方几何体对象this.geometry = new this.$three.BoxGeometry(60, 50, 90);// 创建材质对象this.material = new this.$three.MeshBasicMaterial({color: 0xaabbdd,});// 创建网格对象this.mesh = new this.$three.Mesh(this.geometry, this.material);this.scene.add(this.mesh);this.clock = new this.$three.Clock();this.animation();// 调用play方法// clip_action.play();// 创建相机对象this.camera = new this.$three.PerspectiveCamera(60, 1, 0.01, 2000);this.camera.position.set(300, 300, 300);this.camera.lookAt(0, 0, 0);// 创建网格辅助对象const axesHelper = new this.$three.AxesHelper(100);this.scene.add(axesHelper);const gridHelper = new this.$three.GridHelper(300,20,0xffaaaa,0xaabbcc);this.scene.add(gridHelper);// 创建渲染器对象this.renderer = new this.$three.WebGLRenderer();this.renderer.setSize(1000, 800);this.renderer.render(this.scene, this.camera);window.document.getElementById("threejs").appendChild(this.renderer.domElement);const controls = new OrbitControls(this.camera, this.renderer.domElement);controls.addEventListener("change", () => {this.renderer.render(this.scene, this.camera);});},// 创建关键帧的方法animation() {// 给模型定义namethis.mesh.name = "Box";// 定义时间范围const time = [0, 3, 6, 8, 10]; // 对应时间轴上的0,3,6秒// 定义0,3,6秒对应的坐标值const values = [0, 0, 0, 100, 0, 0, 0, 0, 100, 0, 100, 0, 0, 0, 0];// 创建关键帧 KeyframeTrack(params: String, timeRange: Array, valueRange: Array)// params 模型的属性,timeRange: 时间范围,valueRange: 值范围const position_kf = new this.$three.KeyframeTrack("Box.position",time,values);// 设置在2-6秒内颜色变化,颜色三个数一组表示 rgb格式的/*** .setRGB ( r, g, b ) thisr — 红色通道值在1和0之间。g — 绿色通道值在1和0之间。b — 蓝色通道值在1和0之间。设置颜色的RGB值。*/const color_kf = new this.$three.KeyframeTrack("Box.material.color",[2, 6],[1, 0.2, 0.3, 0.1, 0.8, 0.3]);// 创建关键帧动画对象  AnimationClip(name:String, time:Number, value: Array)const clip = new this.$three.AnimationClip("clip_name", 10, [position_kf,color_kf,]);// 创建动画播放器this.mixer = new this.$three.AnimationMixer(this.mesh);this.clip_action = this.mixer.clipAction(clip);},renderFun() {this.renderer.render(this.scene, this.camera);const frameT = this.clock.getDelta();// 更新播放器相关的时间(如果不更新,则没有动画效果)if (this.mixer) {this.mixer.update(frameT);}this.request_animation_frame = window.requestAnimationFrame(this.renderFun);},start() {this.clip_action.loop = this.$three.LoopRepeat;this.clip_action.paused = false;// play() 控制动画播放,默认循环播放this.clip_action.play();this.renderFun();},start_once() {this.clip_action.loop = this.$three.LoopOnce;// play() 控制动画播放,默认循环播放this.clip_action.play();this.renderFun();},start_clamp() {// 物体状态停留在动画结束的时候this.clip_action.clampWhenFinished = true;this.clip_action.loop = this.$three.LoopOnce;// play() 控制动画播放,默认循环播放this.clip_action.play();this.renderFun();},stop() {// play() 控制动画播放,默认循环播放this.clip_action.stop();// // 物体状态停留在动画结束的时候this.clip_action.clampWhenFinished = true;// this.renderFun();},pausedFn() {console.log(this.clip_action.paused);if (this.clip_action.paused) {this.clip_action.paused = false;} else {this.clip_action.paused = true;}this.renderFun();},time_scale() {this.clip_action.timeScale = 2;this.clip_action.play();this.renderFun();},time_duration() {// 控制动画播放特定时间段;需要设置为非循环模式、同时设置动画播放完定留在结束状态,// 设置为非循环模式this.clip_action.loop = this.$three.LoopOnce;this.clip_action.clampWhenFinished = true;this.clip_action.time = 2; // 动画开始时间// this.clip_action.duration = 2; // 动画结束时间this.clip_action.play();this.renderFun();},},
};
</script>
//
<style lang="less" scoped>
.box-card-left {display: flex;align-items: flex-start;flex-direction: row;width: 100%;.box-right {img {width: 500px;user-select: none;}}
}
</style>

 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【网络安全】【密码学】【北京航空航天大学】实验二、数论基础(中)【C语言和Java实现】

实验二、数论基础&#xff08;中&#xff09; 一、实验内容 1、扩展欧几里得算法&#xff08;Extended Euclid’s Algorithm&#xff09; &#xff08;1&#xff09;、算法原理 已知整数 a , b ,扩展的欧几里得算法可以在求得 a , b 的最大公约数的同时&#xff0c;找到一对…

openssl3.2 - 在VS2019下源码调试openssl.exe

文章目录 openssl3.2 - 在VS2019下源码调试openssl.exe概述笔记先看一个用.bat调用openssl干活的实例VS2019调试参数设置设置 - 命令参数设置 - 工作目录设置 - 环境变量将命令行中需要的文件拷贝到exe目录单步调试备注END openssl3.2 - 在VS2019下源码调试openssl.exe 概述 …

微信/QQ/百度网盘/QQ邮箱上传附件/网络上传文件很慢怎么办?

文章目录 前言解决 前言 继上一次遇到这个问题没几天&#xff0c;期间也断断续续遇到过一点 以为还是因为硬件原因&#xff0c;再一次进行长按关机键放静电&#xff0c;但是这次就没有效果了&#xff0c;上传还是超级慢。 此时我就以为我的电脑坏了&#xff0c;差点拿去修 直到…

【AI】AI和医疗大数据(1/3)

目录 一、医疗大数据有哪些 二、医疗大数据的特性 1. 隐私性 2. 复杂性 3. 不均衡性 4. 时序性 三、医疗大数据的目标和挑战 博主曾经在医疗智能设备领域创业&#xff0c;由于当时选择的模式过于复杂&#xff0c;包括了机械硬件、智能终端软硬件、院后微信生态做随访服务…

经典目标检测YOLO系列(二)YOLOv2算法详解

经典目标检测YOLO系列(二)YOLOv2算法详解 YOLO-V1以完全端到端的模式实现达到实时水平的目标检测。但是&#xff0c;YOLO-V1为追求速度而牺牲了部分检测精度&#xff0c;在检测速度广受赞誉的同时&#xff0c;其检测精度也饱受诟病。正是由于这个原因&#xff0c;YOLO团队在20…

CRM系统进行市场营销,这些功能可以派上用场。

现如今的企业想要做好营销&#xff0c;不仅仅依赖于一句玄之又玄的slogan亦或是电子邮件的狂轰乱炸。要想做好市场活动营销需要一个前提——那就是CRM管理系统发挥作用的地方。但CRM系统关于营销的功能太多了——对于不太了解的人来说很容易不知所措。那么&#xff0c;CRM系统做…

【小白专用】C# 连接 MySQL 数据库

C# – Mysql 数据库连接 1. 配置环境 #前提&#xff1a;电脑已安装Mysql服务&#xff1b; Visual Studio 安装Mysql依赖库&#xff1a; 工具 -> NuGet 包管理器 -> 管理解决方案的 NuGet程序包 —> 搜索&#xff0c; 安装Mysql.Data (Oracle); (安装成功后&…

leetcode 每日一题 2024年01月11日 构造有效字符串的最少插入数

题目 2645. 构造有效字符串的最少插入数 给你一个字符串 word &#xff0c;你可以向其中任何位置插入 “a”、“b” 或 “c” 任意次&#xff0c;返回使 word 有效 需要插入的最少字母数。 如果字符串可以由 “abc” 串联多次得到&#xff0c;则认为该字符串 有效 。 示例 …

vscode中如何解决 Comments are not permitted(JSON中不允许注释)

vs code中如何解决Comments are not permitted&#xff08;JSON中不允许注释&#xff09;&#xff1f; 简单几步&#xff0c;让你轻松解决。 1.使用vscode打开json文件后&#xff0c;一些注释显示如图所示&#xff0c;有红色波浪线&#xff0c;影响阅读 2. 悬浮在波浪线报错信…

Redis系列-15.Redis的IO多路复用原理解析

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring源码、JUC源码、Kafka原理、分布式技术原理、数据库技术&#x1f525;如果感觉博主的文章还不错的…

ROS使用二维激光雷达+超声波实现室内自主定位

引言&#xff1a;为了降低初学者入门无人机的学习成本&#xff0c;超维空间提供了一种基于二维激光超声波实现室内定位的ROS无人机。基本原理是二维激光通过cartographer自主定位模式实现水平方向的定位&#xff0c;超声波提供高度信息。其中location_to_mavros功能包同时订阅位…

计算机网络必考大题

TCP / IP 五层协议或OSI七层参考模型 CRC校验码&#xff08;也称为循环冗余码&#xff09; 1、根据生成多项式P(x)确定除数&#xff1b; 2、给生成多项式的P(x)的最高阶补0&#xff1b; 3、给信息位(补0后)与除数做异或运算&#xff0c;得到余数。 不相同为1 ^ 4、得到的余数补…