threejs tween补间动画(七)

news2024/10/7 4:29:30

1.引入依赖

import * as THREE from 'three'
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js'//引入相机轨道控制器
import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js'//引入GLTF模型加载器
import { DRACOLoader } from 'three/addons/loaders/DRACOLoader.js';//大模型解压加载器(draco解析器)
import { RGBELoader } from "three/examples/jsm/loaders/RGBELoader.js"//加载hdr文件作为环境贴图

2.创建场景

const scene = new THREE.Scene()
// 在场景中添加坐标辅助器
const axesHelper = new THREE.AxesHelper(10)//数据表示坐标轴的长度
scene.add(axesHelper)//将坐标轴添加到场景中

3.创建透视相机

const camera = new THREE.PerspectiveCamera(
    45,//视角,可视范围
    window.innerWidth / window.innerHeight,//摄像机的宽高比
    0.1,//摄像机最近能看到的距离
    1000//摄像机最远能看到的距离
)
// 设置相机的位置
camera.position.x = 8
camera.position.y = 8
camera.position.z = 8
camera.lookAt(0, 0, 0)//摄像机的朝向

4.创建渲染器

const renderer = new THREE.WebGLRenderer()
renderer.setSize(window.innerWidth, window.innerHeight)//渲染器的尺寸大小
document.body.appendChild(renderer.domElement)//renderer.domElement就是canvas元素

5.添加相机轨道控制器

// 添加相机轨道控制器
const controls = new OrbitControls(camera, renderer.domElement)
controls.enableDamping = true //打开惯性阻尼
controls.dampingFactor = 0.05//阻尼系数
controls.autoRotate = false//是否自动旋转(围绕着lookAt的坐标旋转)

6.开始渲染

window.addEventListener('resize', () => {
    camera.aspect = window.innerWidth / window.innerHeight//重置相机的宽高比
    camera.updateProjectionMatrix()//更新相机的投影矩阵
    renderer.setSize(window.innerWidth, window.innerHeight)//重置渲染器的宽高比
})

function animate() {
    TWEEN.update()//更新补间动画
    controls.update()
    renderer.render(scene, camera)//渲染=相机+场景
    requestAnimationFrame(animate)//下一帧继续调用渲染函数
}
animate()

于是得到这样的一个画面
在这里插入图片描述

7.创建几何体

// 创建一个球体
const ball = new THREE.SphereGeometry(5, 32, 16);
let textureLoader = new THREE.TextureLoader()//创建纹理加载器
let texture = textureLoader.load('./img/Earth.png')//加载纹理图片
texture.colorSpace = THREE.SRGBColorSpace//添加颜色深度
//创建材质
const material = new THREE.MeshBasicMaterial({
    map: texture
});
const cube_ball = new THREE.Mesh(ball, material);//创建网格
cube_ball.position.x = -10//设置几何体的位置
scene.add(cube_ball);

得到如下场景
在这里插入图片描述

8.添加补间动画

const tween = new TWEEN.Tween(cube_ball.position)//将物体的起始位置传入tween
//第一个参数:到达的位置;第二个参数:所花的时间,链式调用onUpdate
tween.to({ x: 10 }, 2000).onUpdate(() => {
    console.log(cube_ball.position.x, 99999);
})
// tween.repeat(Infinity)//重复次数,infinity表示循环,直接写数字表示循环的次数
// tween.yoyo(true)//循环往复运动
// tween.delay(0)//延迟,补间动画延迟一秒钟运行 
tween.easing(TWEEN.Easing.Quadratic.InOut) //设置缓动函数

let tween2 = new TWEEN.Tween(cube_ball.position)//设置第二段动画
tween2.to({ x: -10 }, 2000).onUpdate(() => {
})

//第一段从x:-10移动到x:10
//第二段从x:10移动到x:-10
tween.chain(tween2)//第一段动画完成后链接第二段动画
tween2.chain(tween)//第二段动画完成后链接第一段动画

tween.start()//启动补间动画

在这里插入图片描述

9.tween的回调函数

 tween.onStart(() => { })//动画开始的时候的回调
 tween.onComplete(()=>{})// 完成的时候的回调
 tween.stop(()=>{})// 停止的时候的回调
 tween.onUpdate(()=>{})// 更新时的回调

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Cesium入门:Camera的关键知识点

作者: 还是大剑师兰特 ,曾为美国某知名大学计算机专业研究生,现为国内GIS领域高级前端工程师,CSDN知名博主,深耕openlayers、leaflet、mapbox、cesium,canvas,echarts等技术开发,欢迎加微信(gis-dajianshi),一起交流。 查看本专栏目录 - 本文是第 078篇文章 文章目录…

【第十七课】区域经济分析-探索性空间数据分析方法

一、前言 要素的属性及位置是 GIS数据的固有信息。此信息将用于创建视觉上可 进行分析的地图。统计分析有助于从 GIS 数据中提取只靠查看地图无法直接 获得的额外信息,例如各属性值如何分配,数据中是否存在空间趋势或者要素 是否能够形成空间模式。因此…

Zed+AD9361项目独立移植到windows中

首先下载HDL和NO-OS项目 git clone --recursive https://github.com/analogdevicesinc/hdl git clone --recursive https://github.com/analogdevicesinc/no-OS下载完成后需要更换版本,要与ubuntu中下载的vivado版本相同,使用如下命令进行查看版本&…

使用go语言来完成复杂excel表的导出导入

使用go语言来完成复杂excel表的导出导入(一) 1.复杂表的导入 开发需求是需要在功能页面上开发一个excel文件的导入导出功能,这里的复杂指定是表内数据夹杂着一对多,多对一的形式,如下图所示。数据杂乱而且对应不统一。…

原来链表如此简单

由于顺序表(数组)的插入、删除操作需要移动大量的元素,影响了运行效率,因此引入了线性表的链式存储——单链表。单链表通过一组任意的存储单元来存储线性表中的数据元素,不需要使用地址连续的存储单元,因此…

从Multisim到SmartEDA:开启电路设计智能革命

随着科技的飞速发展,电路设计领域也迎来了前所未有的变革。从传统的Multisim软件到新兴的SmartEDA平台,这一转变不仅代表了技术的进步,更预示着电路设计领域即将解锁全新的潜能。 一、Multisim的辉煌与局限 Multisim作为一款经典的电路设计…

比亚迪电池展厅OLED透明屏项目方案

一、项目概述 为满足比亚迪电池展厅在温州地区的现代化展示需求,我们计划于2024年6月实施OLED透明屏项目。该项目旨在通过采用先进的OLED透明屏技术,为展厅提供独特且高效的展示方式,提升观众体验,展示比亚迪电池技术的先进性和创…

「6.25更新日志」JVS·智能BI、逻辑引擎(服务编排)功能更新说明

项目介绍 JVS是企业级数字化服务构建的基础脚手架,主要解决企业信息化项目交付难、实施效率低、开发成本高的问题,采用微服务配置化的方式,提供了 低代码数据分析物联网的核心能力产品,并构建了协同办公、企业常用的管理工具等&am…

使用内部转换处理事件

在异或状态下处理具有内部转换的事件 此示例显示在异或(OR)状态下使用内部转换处理三个事件时会发生什么。 在异或状态下处理一个事件 此示例显示内部转换的行为。该图表使用outgoing转换的隐式排序。 起初,图表处于休眠状态。状态A处于活…

计算机毕业设计Thinkphp/Laravel+vue高校图书馆借阅系统_i0521

图书馆借阅系统,主要的模块包括首页、个人中心、会员管理、会员等级管理、图书分类管理、图书信息管理、图书借阅管理、借阅服务评价管理、超时费用管理、留言板管理、系统管理等功能。系统中管理员主要是为了安全有效地存储和管理各类信息,还可以对系统…

web课程大作业-科技强国、航天科技

文章目录 概叙科技强国的概述实例分析 代码截图代码连接 概叙 科技强国的概述 一个科技强国在全球范围内具备领先的科技创新能力和竞争力,能够在多个高科技领域内引领创新潮流和技术发展。成为科技强国通常依赖于以下几个关键因素: 经济实力&#xff1…

液体冷却装置

每天一篇行业发展资讯,让大家更及时了解外面的世界。 更多资讯,请关注B站/公众号【莱歌数字】,有视频教程~~ 在这期中,我们的重点是液体基冷却解决方案。这些专利显示了不同发明者所关注的一些显著特征。 嵌入式微通道冷却包 一…

Centos7.9升级OpenSSH版本

升级前先多开几个ssh窗口或者打开telnet,因为升级ssh可能会导致ssh无法登录 一、查看当前版本 ssh -V 升级后的版本 二、开始升级OpenSSH 1.备份配置文件 cd /etc/ssh cp sshd_config{,.bak} cd /etc/pam.d cp sshd{,.bak}2.下载OpenSSH https://mirrors.aliy…

python 函数(方法):递归、匿名函数、闭包函数、装饰器

文章目录 一、递归1.1 什么是递归?1.2 递归的原理及作用1.3 递归的分类1.4 在使用递归时的注意事项1.5 递归的使用 二、匿名函数三、闭包函数3.1 闭包函数和正常函数的使用区别 四、装饰器(相当于 Java 中的面向切面编程) 一、递归 1.1 什么是…

针对VMWare无法使用鼠标功能键问题

在使用 VMWare 虚拟机的Ubuntu系统时发现无法使用许多鼠标带有额外的功能键,比如常用的前进后退,但是双系统中的Ubuntu没有问题,后来一搜发现是,虚拟系统中不支持这些功能键。因此我们对这个问题进行了解决。 解决方案 1.找到自…

使用 shell 脚本同步 yum 源建立本地私有仓库

文章目录 [toc]事出有因脚本内容前端展示 事出有因 有两方面原因做了这个事情: dockerhub 国内无法访问centos 7 要停止社区支持了 结合两个情况,不久的将来,可能国内也就没有对应的 yum 仓库了(现在想找 centos 7 之前的仓库&…

DC/AC电源模块一种效率与可靠性兼备的能源转换解决方案

DC/AC电源模块都是一种效率与可靠性兼备的能源转换解决方案 DC/AC电源模块是一种能够将直流电源(DC)转换为交流电源(AC)的设备。它在现代电子设备中扮演着非常重要的角色,因为许多设备需要交流电源才能正常运行。无论…

主播美颜工具:美颜SDK的技术原理与应用

美颜SDK不仅大幅提升了主播的颜值,还极大地改善了用户的观看体验。本文将从美颜SDK的技术原理、应用场景以及未来发展趋势等方面进行深入探讨。 一、美颜SDK的技术原理 美颜SDK的核心在于其强大的图像处理技术,通过实时图像处理算法,对视频中…

无人机螺旋桨理论教学培训课程

本文档为一份详细的关于TYTO机器人公司提供的电机和螺旋桨理论及其实验操作的指南。指南首先概述了材料、实验目标以及实验的介绍部分,随后详细阐述了理论问题、实验步骤和附录内容。实验目的在于通过实际测试来测量和理解不同螺旋桨参数对无人机性能的影响&#xf…

OpenCV cv::Mat到 Eigen 的正确转换——cv2eigen

在进行计算机视觉项目时,我们经常需要处理相机位姿的变换。最近,我在项目中遇到了一个看似简单但实际上颇具挑战性的问题:从 OpenCV 的 cv::Mat 格式转换到 Eigen 库的格式。这个过程中遇到了一些问题,但最终找到了一个稳健的解决…