Three.js--》Gsap动画库基本使用与原理

news2024/11/14 13:31:23

目录

Gsap动画库使用讲解

Gsap动画库基本使用

修改自适应画面及双击进入全屏

设置stats性能监视器


Gsap动画库使用讲解

GSAP的全名是GreenSock Animation Platform,是一个从flash时代一直发展到今天的专业动画库,今天将其与three.js进行结合,看看能够创作出怎样的效果,首先我们先要理解动画渲染循环的原理:three.js可以借助HTML5的API请求动画帧 window.requestAnimationFrame 实现动画渲染,如下:

// 周期性执行,默认理想状态下每秒钟执行60次
function render(){
  cube.rotateY(0.01) // 周期性旋转,每次旋转0.01弧度
  renderer.render(scene,camera) // 周期性执行相机的渲染功能,更新canvas画布上的内容
  requestAnimationFrame(render) // 接下来渲染下一帧的时候就会调用render函数
}
// 先开始就渲染一下
render()

Gsap动画库基本使用

首先进行第三方库的安装,终端执行如下命令即可:

npm install gsap

安装完成之后,导入动画库即可:

// 导入动画库
import gsap from 'gsap';

可以参考 官网 这里使用ease,来实现动态曲线变化率:

当然gsap还有许多好玩的属性,可以对动画进行精准的操作,如下:

当然如果想对动画进行暂停还启动的效果也是可以的,我们可以设置一个监听事件,当动画处于运动状态下,双击屏幕进行动画暂停,当动画处于暂停状态下,双击屏幕进行动画启动,如下我们对正方体的移动进行监听限制,但是不限制正方体的旋转,效果如下:

当然你也可以设置一下设置控制器阻尼,相关介绍可参考官方文档,如下给出解释:

修改自适应画面及双击进入全屏

不知道大家有没有发现,启动项目打开浏览器给出你画面的时候是正常,可一旦你修改浏览器尺寸大小,3d动画效果是不会随着你浏览器尺寸的变化而变化的,最后呈现的结果永远是那个像素大小

经过如下设置可以修改3d画面的分辨率大小值,代码如下:

// 监听画面变化,更新渲染界面
window.addEventListener('resize',()=> {
  // 更新摄像头
  camera.aspect = window.innerWidth / window.innerHeight
  // 更新摄像机的投影矩阵
  camera.updateProjectionMatrix()
  // 更新渲染器
  renderer.setSize(window.innerWidth,window.innerHeight)
  // 设置渲染器的像素比
  renderer.setPixelRatio(window.devicePixelRatio)
})

解决完自适应画面后,接下来实现双击进入全屏的效果,这个实现与上面讲解到的双击暂停和启动动画效果是一致的,无非是调用进入全屏和退出全屏的相关API函数而已,代码如下:

window.addEventListener('dblclick',()=>{
  const fullScreenElement = document.fullscreenElement
  if(!fullScreenElement){
    // 双击控制屏幕,让画布对象进入全屏
    renderer.domElement.requestFullscreen()
  }else{
    // 退出全屏,使用document对象
    document.exitFullscreen()
  }
})

设置stats性能监视器

我们在进行3d动画构建的时候,也可以设置一个计算渲染帧率的FPS。要知道three.js每执行WebGL渲染器 .render() 方法一次,就在canvas画布上得到一帧图像,不停地周期性执行 .render() 方法就可以更新canvas画布内容,一般场景越复杂往往渲染性能越低,也就是每秒执行 .render() 的次数越低。

通过stats.js库可以查看three.js当前的渲染性能,具体说就是计算three.js的渲染帧率(FPS),所谓渲染帧率(FPS),简单说就是three.js每秒钟完成的渲染次数,一般渲染达到每秒钟60次为最佳状态。其使用步骤如下:

先引入Stats库(three.js自带):

// 引入Stats性能监视器
import Stats from 'three/examples/jsm/libs/stats.module'

创建stats对象:

// 创建stats对象
const stats = new Stats()
// stats.domElement:web 页面上输出计算结果,一个div元素
document.body.appendChild(stats.domElement)

每次渲染时都调用一下stats的更新函数:

左上方就会出现状态监听器,帧率随着每次是渲染画面的变化而变化:

当然这个性能监听器有三种监听模式,默认是监听帧率,当然你也可以选择监听渲染时间,或者是选择监听流量,这都是可以自由选择的, 如下:

当然如果你想改变其初识位置,比如说放置到右上角的话,可以通过以下方式进行:

本文只是简单的讲解了一下gsap动画库的简单使用,想要更深学习的话可以参考官方文档或者关注博主专栏学习更深一步的three.js知识,给出本文代码笔记:

import * as THREE from 'three';

// 导入轨道控制器
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls'
// 导入动画库
import gsap from 'gsap';
// 引入Stats性能监视器
import Stats from 'three/examples/jsm/libs/stats.module'

// 1.创建场景
const scene = new THREE.Scene();
// 2.创建相机
const camera = new THREE.PerspectiveCamera(75,window.innerWidth/window.innerHeight,0.1,1000)
// 设置x、y、z轴坐标,即设置相机位置
camera.position.set(0,0,10)
// 将相机添加到场景之中
scene.add(camera)
// 3.添加物体,创建几何体
const cubeGeometry = new THREE.BoxGeometry(1,1,1) // 设置几何体大小
const cubeMaterial = new THREE.MeshLambertMaterial({color:0xff0000}) // 设置几何体材质
// 根据几何体和材质创建物体
const cube = new THREE.Mesh(cubeGeometry,cubeMaterial)

// 修改物体的位置
cube.position.y = 1.5
// 将几何体添加到场景之中
scene.add(cube)
// 4.初始化渲染器
const renderer = new THREE.WebGLRenderer()
// 设置渲染的尺寸大小
renderer.setSize(window.innerWidth,window.innerHeight)
// 将webgl渲染的canvas内容添加到body上
document.body.appendChild(renderer.domElement)

// 创建地面网格参照
const planeGeometry = new THREE.PlaneGeometry(30,30) // 平面几何的宽高
const PlaneMateial = new THREE.MeshStandardMaterial({color:0xF8F8FF}) // 几何平面的颜色
const plane = new THREE.Mesh(planeGeometry,PlaneMateial)
plane.rotation.x = -0.5*Math.PI
plane.position.set(0,0,0)
scene.add(plane)
// 添加坐标轴辅助器
const axesHelper = new THREE.AxesHelper(5) // 数值代表线的长度
scene.add(axesHelper) // 添加到场景之中
// 设置动画
gsap.to(cube.position, {x:5,duration:5,ease: "power2.inOut",
  // 设置重复次数:最开始的一次+你设置的次数;如果想无限次循环下去,设置 -1
  repeat:-1,
  // 设置往返运动
  yoyo:true,
  // 设置延迟时间,延迟2秒运动
  delay:2,
  onStart:()=>{
    console.log('动画开始');
  },
  onComplete:()=>{
    console.log('动画结束')
  }
})
gsap.to(cube.rotation,{x:2*Math.PI,duration:5,ease: "power2.inOut",
  repeat:-1,
  yoyo:true
})

window.addEventListener('dblclick',()=>{
  const fullScreenElement = document.fullscreenElement
  if(!fullScreenElement){
    // 双击控制屏幕,让画布对象进入全屏
    renderer.domElement.requestFullscreen()
  }else{
    // 退出全屏,使用document对象
    document.exitFullscreen()
  }
})

// 创建轨道控制器
const controls =  new OrbitControls(camera,renderer.domElement)
// 设置控制器阻尼,让控制器更有真实效果,但必须在动画循环里调用 .update()
controls.enableDamping = true

// 创建stats对象
const stats = new Stats()
// 修改stats位置,其原本的代码中存在top和left样式,如果想修改样式可以先将其原本样式删除
stats.domElement.style.position = 'absolute';
stats.domElement.style.removeProperty('left'); // 删除原本的 left 样式
stats.domElement.style.right = '0';
// stats.domElement:web 页面上输出计算结果,一个div元素
document.body.appendChild(stats.domElement)
// stats.setMode(0) // 默认模式
stats.setMode(1) // 设置监听渲染时间

export function render(){
  // 每次循环渲染时调用stats更新方法,来刷新时间
  stats.update()
  controls.update()
  renderer.render(scene,camera) // 周期性执行相机的渲染功能,更新canvas画布上的内容
  requestAnimationFrame(render) // 接下来渲染下一帧的时候就会调用render函数
}
// 先开始就渲染一下
render()

// 监听画面变化,更新渲染界面
window.addEventListener('resize',()=> {
  // 更新摄像头
  camera.aspect = window.innerWidth / window.innerHeight
  // 更新摄像机的投影矩阵
  camera.updateProjectionMatrix()
  // 更新渲染器
  renderer.setSize(window.innerWidth,window.innerHeight)
  // 设置渲染器的像素比
  renderer.setPixelRatio(window.devicePixelRatio)
})

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

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

相关文章

【DevOps视频笔记】1. DevOps的诞生

视频官网 目录 一、DevOps介绍 定义: 作用: 核心: 二、软件开发流程 三、流程图 一、DevOps介绍 定义: Development & Operations的缩写,也就是开发&运维DevOps 是一个不断提高效率并且持续不断工作的…

GPIO输出——LED闪烁、LED流水灯、蜂鸣器

1、STM32F1 GPIO 简介 GPIO ( General Purpose Input Output )通用输入输出口 可配置为 8 种输入输出模式 引脚电平: 0V~3.3V ,部分引脚可容忍 5V 输出模式下可控制端口输出高低电平,用以驱动 LED 、控制蜂鸣器、模拟通…

Spring 统一功能处理(拦截器)

文章目录 Spring拦截器1.统一用户登录权限校验1) SpringAOP 用户统一验证的问题2) Spring拦截器3) 拦截器实现原理4)同一访问前缀添加 2. 统一异常处理3. 统一数据返回格式1)统一数据返回的好处2)统一数据返回实现 Spring拦截器 SpringBoot统…

第13章 项目合同管理

文章目录 13.2.1 按信息系统 范围 划分的合同分类 4451、总承包合同2、单项工程承包合同3、分包合同 13.2.2 按项目 付款方式 划分的合同分类 4461、总价合同2、成本补偿合同(卖方有利)3、工料合同 13.3.1 项目合同的内容 44713.3.2 项目合同签订的注意事…

【设计模式】我终于读懂了迭代器模式。。。

看一个具体的需求 编写程序展示一个学校院系结构:需求是这样 要在一个页面中展示出学校的院系组成, 一个学校有多个学院, 一个学院有多个系。 如图: 传统的设计方案(类图) 传统的方式的问题分析 将学院看做是学校的子类&#xf…

深度学习(23):SmoothL1Loss损失函数

0. 基本介绍 SmoothL1Loss是一种常用的损失函数,通常用于回归任务中,其相对于均方差(MSE)损失函数的优势在于对异常值(如过大或过小的离群点)的惩罚更小,从而使模型更加健壮。 SmoothL1Loss的公式为: l o s s ( x , y ) { 0.5 …

机器人中的数值优化(三)—— 无约束最优化方法基础、线搜索准则

本系列文章主要是我在学习《数值优化》过程中的一些笔记和相关思考,主要的学习资料是深蓝学院的课程《机器人中的数值优化》和高立编著的《数值最优化方法》等,本系列文章篇数较多,不定期更新,上半部分介绍无约束优化,…

eureka自我保护模式详解(全网最全)

1. 什么叫自我保护模式? 当微服务客户端启动后,会把自身信息注册到Eureka注册中心,以供其他微服务进行调用。一般情况下,当某个服务不可用时(一段时间内没有检测到心跳或者连接超时等),那么Eure…

spring3:更简单的读取和存入对象

目录 1.存储 Bean 对象 1.1 前置⼯作:配置扫描路径(重要) 1.2 添加注解存储 Bean 对象 1.2.1.Controller[控制器] 1.2.2 Service[服务] 1.2.3 repoistory[仓库] 1.2.4 Configuration[配置] 1.2.5 Component[组件] 1.3为什么要这么多类…

Spring 创建和使用

文章目录 什么是 Bean ?1. 创建 Spring 项目1.创建一个 Maven 项目2. 添加 Spring 依赖1.配置 Maven 国内源2.添加 Maven 依赖 3.添加启动项 2.存储Bean对象1.创建 Bean2.注册 Bean3.获取并使用 Bean 对象1. 得到 Spring 对象常见方式有两种: 2. 获取 Bean 对象Bean 的三种获取…

SpringMVC中使用LocalDateTime、LocalDate等参数作为入参数据转换问题

1、接收GET请求方式及POST请求表单方式时间类型传参,需要自定义参数转换器或者使用ControllerAdvice配合initBind,不设置的话表单方式会报以下错误: 这种情况要和时间作为Json字符串时区别对待,因为前端json转后端pojo底层使用的是…

什么是Auto GPT-4? OpenAI 最新语言模型概览

动动发财的小手,点个赞吧! 人工智能正在快速发展,近年来最令人兴奋的发展之一是创建可以生成类似人类文本的语言模型。领先的人工智能研究机构 OpenAI 最近发布了其最新的语言模型 Auto GPT-4。 在什么是 Auto GPT-4? OpenAI 最新…

【Java笔试强训 29】

🎉🎉🎉点进来你就是我的人了博主主页:🙈🙈🙈戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔🤺🤺🤺 目录 一、选择题 二、编程题 🔥求正数数…

AtCoder Beginner Contest 300(D-G)

D - AABCC (atcoder.jp) (1)题目大意 给你个数N,问你不超过N的三个质数abc组成的数有多少个。 (2)解题思路 考虑到枚举的数不会特别多,因此预处理出1e6的质因子,暴力枚举即可。 (3&a…

在体育新闻文本中提取关键词可以使用什么技术

在体育新闻文本中提取关键词可以使用以下技术: 1. 领域词典: 通过构建体育领域的词汇表,将其中的词语作为关键词,可以较好地提取体育新闻中的关键词。 就当下的研究情况,国内外有哪些体育领域的词汇表http://t.csdn…

Reactive Streams介绍与应用分析

目录 一、Reactive Streams基本知识 (一)基本介绍 (二)反应式流的特点 基本特性1:事件驱动&变化传递 基本特性2:数据流 基本特性3:声明式 高级特性1:流量控制(回压) 高级特性2:异步边界 &…

ALBEF:基于动量蒸馏的视觉语言表示学习

Align before Fuse:Vision and Language Representation Learning with Momentum Distillation ALBEF:基于动量蒸馏的视觉语言表示学习 摘要 大规模的视觉和语言表征学习在各种视觉-语言任务上显示出有希望的改进。大多数现有的方法采用了基于Transform…

【平衡二叉搜索树(AVL)-- 旋转】

目录: 前言1、二叉搜索树的插入2、AVL树的旋转(1)右单旋(LL)(2)左单旋(RR)(3)右左双旋(LR)(4)左右…

第18章 项目风险管理

文章目录 18.1.2 风险的分类 54318.1.3 风险的性质 544项目风险管理6个过程(风险管理、识别风险、实施定性风险分析、实施定量风险分析、规划风险应对、控制风险)组织和干系人的风险态度影响因素18.3.3 规划风险管理的输出 550风险识别的原则18.4.2 识别…

vim编辑文件

目录 一、vi和vim (1)介绍 (2)相同点 (3)不同点 二、使用vim打开文件 三、使用vim编辑文件 (1)vim的四个模式 (2)命令模式下的编辑命令 删除 复制 …