three.js学习 06 - 结合GSAP(补间动画)设置各种动画效果(运动效果与双击暂停动画等效果)

news2024/12/29 7:32:38

1. GSAP简介

GSAP👍🏼是前端业内非常有名的一个动效库,有大量的优秀的网站都在使用它。它不仅能在原生JS的环境下使用,也能配合各种当前流行的框架进行使用。
通过使用它,非常多原本实现起来很有难度的交互动画效果,都能快速高效的实现。

2.安装GSAP

官网地址:https://greensock.com/#elLoginHeaderPopup_menu
推荐参考的中文文档地址:https://gsap.framer.wiki/stated

npm i gsap

3.gsap如何对three的cube进行旋转与移动操作的操作


// 设置动画
gsap.to(cube.position,{ x : 5 , duration: 5})  //参数解释:让(要操作的对象,{哪一条轴:运动到什么位置,duration:花费多少秒})
// 设置旋转
gsap.to(cube.rotation,{ x : 2 * Math.PI , duration: 5})  

function render() {
    renderer.render(scene, camera) //渲染器
    requestAnimationFrame(render) //requestAnimationFrame==》请求动画帧 接收一个渲染函数  渲染下一帧的时候就会执行render函数
}

render() //一开始的时候渲染一下

4. gsap如何对three的cube进行速度的控制

大家可以在这里玩一玩官网上给出的不同速度参数的效果再进行自定义的配置
官方文档地址如下:https://greensock.com/docs/v3/Eases
速度效果
将上图中的ease参数后面对应的参数名写到to()中,即可实现各种贝塞尔曲线效果的动画


// 设置动画
gsap.to(cube.position,{ x : 5 , duration: 2, ease: "bounce.inOut"})  //参数解释:让(要操作的对象,{哪一条轴:运动到什么位置,duration:花费多少秒})
// 设置旋转
gsap.to(cube.rotation,{ x : 2 * Math.PI , duration: 2, ease: "power4.in"})
    
function render() {
    renderer.render(scene, camera) //渲染器
    requestAnimationFrame(render) //requestAnimationFrame==》请求动画帧
}

render() //一开始的时候渲染一下

5. 动画完成开始时候通过gsap获取反馈

通过自带的onComplete和onStart函数即可实现


gsap.to(cube.position, {
    x: 5,
    duration: 5,
    ease: "bounce.out",
    onComplete: () => {
        console.log('动画完成了:');
    },
    onStart: () => {
        console.log('动画开始了:');
    }
}) //参数解释:让(要操作的对象,{哪一条轴:运动到什么位置,duration:花费多少秒})

5. 通过gsap设置cube的动画重复次数往返运动效果,延迟执行时间

// 设置动画
gsap.to(cube.position, {
    x: 5,
    duration: 5,
    ease: "bounce.out",
    repeat:3,//重复次数
    // repeat:-1,//-1表示无限循环
    yoyo:true,//开启往返运动
    delay:2,//延迟两秒移动
    onComplete: () => {
        console.log('动画完成了:');
    },
    onStart: () => {
        console.log('动画开始了:');
    }
})

6.通过鼠标的双击事件开始/停止动画

let animate1 = gsap.to(cube.position, {
    x: 5,
    duration: 5,
    ease: "bounce.out",
    repeat:3,//重复次数
    // repeat:-1,//-1表示无限循环
    yoyo:true,//开启往返运动
    // delay:2,//延迟两秒移动
    onComplete: () => {
        console.log('动画完成了:');
    },
    onStart: () => {
        console.log('动画开始了:');
    }
})
// 双击暂停/开始动画
window.addEventListener('dblclick', () => {
    console.log(animate1);
    if (animate1.isActive()) {   //是否处于运动的状态
        animate1.pause() //暂停
    } else {
        animate1.resume() //恢复
    }
})

gsap操作

7. 页面完整代码

import * as THREE from 'three'
// 导入轨道控制器
import {
    OrbitControls
} from 'three/examples/jsm/controls/OrbitControls'
// console.log(THREE);

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

// 基础内容

// 1.创建场景
const scene = new THREE.Scene()
// 2.创建相机
const camera = new THREE.PerspectiveCamera(
    75,
    window.innerWidth / window.innerHeight,
    0.1,
    1000
) //透视相机(角度,宽高比,近端,远端)

camera.position.set(0, 0, 10) //修改相机位置

scene.add(camera) //将相机添加到场景中

// 添加物体
// 创建一个几何体对象
const cubeGeometry = new THREE.BoxGeometry(1, 1, 1)
const cubeMaterial = new THREE.MeshBasicMaterial({
    color: 0xffff00
})
// 根据几何体和材质创建一个物体
const cube = new THREE.Mesh(cubeGeometry, cubeMaterial)

// 将几何体添加到场景中
scene.add(cube)

//初始化渲染器
const renderer = new THREE.WebGLRenderer()

//设置渲染的尺寸大小
renderer.setSize(window.innerWidth, window.innerHeight)
console.log(renderer);

// 将webgl渲染的canves内容添加到body上
document.body.appendChild(renderer.domElement)

// 使用渲染器,通过相机,将场景渲染进来
// renderer.render(scene, camera)


// 2023.04.26 使用控制器查看3d物体
// 创建轨道控制器
const controls = new OrbitControls(camera, renderer.domElement) //第一个参数是相机对象,第二个参数是渲染器

// 添加坐标轴辅助器
const axesHelper = new THREE.AxesHelper(5) //参数5代表长度
scene.add(axesHelper) //添加完成后出现坐标轴辅助器

// 2023.05.02  使用补间动画实现动画的操作
// 设置动画
let animate1 = gsap.to(cube.position, {
    x: 5,
    duration: 5,
    ease: "bounce.out",
    repeat: 3, //重复次数
    // repeat:-1,//-1表示无限循环
    yoyo: true, //开启往返运动
    // delay:2,//延迟两秒移动
    onComplete: () => {
        console.log('动画完成了:');
    },
    onStart: () => {
        console.log('动画开始了:');
    }
}) //参数解释:让(要操作的对象,{哪一条轴:运动到什么位置,duration:花费多少秒})
// 设置旋转
gsap.to(cube.rotation, {
    x: 2 * Math.PI,
    duration: 5,
    ease: "power4.in"
})
// 双击暂停/开始动画
window.addEventListener('dblclick', () => {
    console.log(animate1);
    if (animate1.isActive()) {
        animate1.pause() //暂停
    } else {
        animate1.resume() //恢复
    }
})

// 设置一个渲染函数,浏览器每次刷新重新加载渲染器
// function render(time) {
function render() {
    renderer.render(scene, camera) //渲染器
    requestAnimationFrame(render) //requestAnimationFrame==》请求动画帧 接收一个渲染函数  渲染下一帧的时候就会执行render函数
}

render() //一开始的时候渲染一下

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

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

相关文章

计算机必读基础书籍

计算机必读数据 一:故事背景1.1 前言1.2 提示 二:计算机组成2.1 是什么2.2 有什么2.2.1 计算机系统概述2.2.2 数据信息的表示2.2.3 运算方法与运算器2.2.4 存储系统2.2.5 指令系统2.2.6 中央处理器2.2.7 指令流水线2.2.8 总线系统2.2.9 输入输出 2.3 思维…

[MAY DAY]五一综合训练 之——最值问题

文章目录 > **## * 要赋值 !!!!!!! *** %#¥#%#*&!!!!要赋值一、双指针求最大连续和双指针算法分析: 注意&#xff…

Java学习笔记-03

目录 类与对象 类class 对象 修饰符private this关键字 构造函数 继承 权限修饰符 包package 状态修饰符final 类与对象 类 类是对现实生活中一类事物的抽象,里面包含了这类事物共有的属性(名词)和行为(动词)例如人类,人就是一个大类&#xff…

大规模MIMO系统中基于CSI的卷积神经网络定位

来源:投稿 作者:小灰灰 编辑:学姐 论文标题:CSI-based Positioning in Massive MIMO systems using Convolutional Neural Networks 摘要 研究了使用大规模MIMO(MaMIMO)系统的信道状态信息(CS…

mysql 基础操作命令集

目录 目录 数据库操作 查看库命令 使用某个库(可以不用分号 ;) 查看库下所有的表 显示一个表下的所有字段和类型 查看一个表的建表语句 查看表的内容 创建新数据库 创建新表,设定表的字段 插入一行数据 某字段更改数据…

OSI七层模型及各层功能概述

1.OSI的基本概念及原则 OSI是Open System Interconnect的缩写,意为开放式系统互联。其各个层次的划分遵循下列原则: (1)同一层中的各网络节点都有相同的层次结构,具有同样的功能。(2)同一节点…

运营商大数据是什么,是如何实现精准获客的

近年来,运营商大数据在市场之上发展迅速,各行各业的公司都在利用运营商大数据获取更加精准有效的企业信息和客户资源。例如,当企业在进行精准营销的过程之中,可以根据线索和条件快速获得更准确的客户名单,而不像传统的…

定时任务方案实现与对比

定时任务分类 定时任务分为分布式定时任务和单机定时任务两个大的方向,他们的适用场景不同。 单机定时任务在单台计算机上运行,其执行结果和单台机器上的数据有关,如对本地机器的缓存做核对、清理日志等。它的 优点 是简单易用,无…

玩着3dmax把Python学了-01

3ds Max 2022以前的版本要借助Python的api来实现Python编程达到编辑绘图脚本的功能,但是好消息来了,3ds Max 2022 起,MaxPlus 不再作为 3ds Max 的 Python API 包含在内。而是3ds Max 将 Python 3.7 的标准版本包涵其中了,位于 [3…

MySQL监控告警及可视化:Zabbix+Percona PMP实现(Part II)

MySQL监控告警及可视化:ZabbixPercona PMP实现(Part II) PMP插件安装PMP监控脚本配置Web界面导入PMP模板 服务器清单如下: 服务器IP配置OS版本服务器角色172.16.175.x4c8gCentOS 7.7MySQL Server172.16.175.y4c8gCentOS 7.7Zabbi…

Python——基于YOLOV8的车牌识别(源码+教程)

目录 一、前言 二 、完成效果 三、 项目包 四、运行项目 (教程) 一、前言 YOLOv8LPRNet车牌定位与识别https://www.bilibili.com/video/BV1vk4y1E7MZ/ 最近做了有一个车牌识别的小需求,今天完成了,在此记录和分享 首先&#x…

NECCS|全国大学生英语竞赛C类|听力|短篇新闻|听写填空|16:40~17:10+17:30~18:10

目录 一、听写填空 1. 题型 2. 技巧 (1)利用间隙 浏览全文 积极预测 (2)边听边记 (3)注重检查 二、短篇新闻 1. 试题解读 2. 解题技巧 (1)预测要点,有的放矢 …

【五一创作】机械臂速成小指南(二十四):逆运动学的雅可比方法

👨‍🏫🥰🥳需要机械臂相关资源的同学可以在评论区中留言哦🤖😽🦄 指南目录📖: 🎉🎉机械臂速成小指南(零点五)&#xff…

Redis消息队列

消息队列(Message Queue),字面意思就是存放消息的队列。最简单的消息队列模型包括3个角色: 消息队列:存储和管理消息,也被称为消息代理(Message Broker) 生产者:发送消…

【hello Linux】线程概念

目录 1. 线程概念的铺设 2. Linux线程概念 2.1 什么是线程 2.2 线程的优点 2.3 线程的缺点 2.4 线程异常 2.5 线程用途 3. Linux进程VS线程 4. Linux线程控制 4.1 POSIX线程库 4.2 创建线程 4.3 进程ID和线程ID 4.4 线程终止 4.5 线程等待 4.6 分离线程 Linux🌷 1…

FPGA时序约束(六)时序例外约束

系列文章目录 FPGA时序约束(一)基本概念入门及简单语法 FPGA时序约束(二)利用Quartus18对Altera进行时序约束 FPGA时序约束(三)时序约束基本路径的深入分析 FPGA时序约束(四)主时…

解除Word的编辑保护【简单版】

首先,我们遇到的情况是下图这样的: 点一下停止保护,是下图这样的: 开始解决: 第一种方式:另存为Word Xml 存好了, 打开如下图(我用VS打开的,最好找个能够格式化代码的编…

C++---区间DP---棋盘分割(每日一道算法2023.5.2)

注意事项: 涉及到"矩阵/二维前缀和"的一些知识,建议先理解那篇文章。 题目: 将一个 88 的棋盘进行如下分割:将原棋盘割下一块矩形棋盘并使剩下部分也是矩形,再将剩下的部分继续如此分割,这样割了…

echarts数据可视化-动态柱状图

效果如下: 此处用的echarts柱状图为:Axis Align with Tick 本文的要讨论的内容: 1、柱状图样式修改 2、多数据的缩放展示 柱状图样式修改 // 数据 const city reactive([{ value: 335, name: 长沙 },{ value: 310, name: 武汉 },{ value: …

C++类和对象 ——构造函数

C拷贝构造函数详解 什么是拷贝构造函数?拷贝构造函数的特征默认拷贝构造函数为什么需要显示定义构造函数?拷贝构造函数的调用场景什么时候不需要自己定义拷贝构造函数 什么是拷贝构造函数? 在现实生活中,拷贝构造函数就好像我们上…