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

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() //一开始的时候渲染一下

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

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

相关文章

一文吃透Http协议

Http 协议 1. 初始 Http Http 协议 , 是应用层最为广泛使用的协议 , Http 就是浏览器和服务器之间的桥梁. Http 是基于 TCP 协议实现的 , 通常我们输入搜索框中的网址 (URL) , 浏览器就会根据这个 URL 构造出一个 Http 请求 , 发送给服务器. 服务器就会返回一个 Http 响应(包…

基于空间矢量脉宽调制(SVPWM)的并网逆变器研究(Simulink)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

Doris(23):Doris的函数—字符串函数

1 append_trailing_char_if_absent(VARCHAR str, VARCHAR trailing_char) 如果s字符串非空并且末尾不包含c字符,则将c字符附加到末尾。 trailing_char只包含一个字符,如果包含多个字符,将返回NULL select append_trailing_char_if_absent(a,c);select append_trailing_cha…

RabbitMQ 工作队列模式 Work Queue Demo

工作队列模式,一个消息只能有一个消费者消费 生产者发送20条消息 消费者有两个 第一个消费 睡一秒取一个 第二个睡2秒取 public class WorkConsumerTest1 {public static void main(String[] args) throws IOException, TimeoutException {//1 创建连接工厂ConnectionFactor…

SpringCloud01

SpringCloud01 微服务入门案例 实现步骤 导入数据 实现远程调用 MapperScan("cn.itcast.order.mapper") SpringBootApplication public class OrderApplication {public static void main(String[] args) {SpringApplication.run(OrderApplication.class, args);}…

ETL工具 - Kettle 转换算子介绍

一、Kettle 转换算子 上篇文章对 Kettle 中的输入输出算子进行了介绍,本篇文章继续对转换算子进行讲解。 下面是上篇文章的地址: ETL工具 - Kettle 输入输出算子介绍 转换是ETL里面的T(Transform),主要做数据转换&am…

快解析动态域名解析,实现外网访问内网数据库

今天跟大家分享一下如何借助快解析动态域名解析,在两种特定网络环境下,实现外网访问内网mysql数据库。 第1种网络环境:路由器分配的是动态公网IP,且有路由器登录管理权限。如何实现外网访问内网mysql数据库? 针对这种…

如何自制云平台,并实现远程访问控制?

除了阿里、腾讯各种云,计算机大神们都想自己搭建IoT云平台。今天小编跟大家分享一种用UbuntuEMQXNode-RED方式自制IoT云平台的方法,并实现无公网IP随时访问远程数据! 第一步 Step1搭建EMQX服务器 1.搭建IoT平台需要一个服务器,这…

大公司为什么禁止SpringBoot项目使用Tomcat?

前言 在SpringBoot框架中,我们使用最多的是Tomcat,这是SpringBoot默认的容器技术,而且是内嵌式的Tomcat。同时,SpringBoot也支持Undertow容器,我们可以很方便的用Undertow替换Tomcat,而Undertow的性能和内…

thinkphp6结合layui增删改查综合案列

文章目录 技术栈实现代码实现数据库 本案例适合新手,特别是杠刚入门thinkphp和layui,但又不是特别熟悉这类 主要实现登录退出功能,用户模块的增删改查功能,分页功能是layui表单自带功能 效果图 左侧的菜单栏我没有写对应的页面&am…

最好的物联网教程:软硬结合——从零打造物联网

在大学里不同专业有着不同的追求:机械类与强电类专业学生追求的是 “机电合一” ,既懂机械又懂电气,整个电气机械自动化便能打通。弱电类专业学生追求的是 “软硬结合” ,既懂硬件又懂软件,整个电子产品便能打通。我作…

微服务保护 笔记分享【黑马笔记】

微服务保护 1.初识Sentinel 1.1.雪崩问题及解决方案 1.1.1.雪崩问题 微服务中,服务间调用关系错综复杂,一个微服务往往依赖于多个其它微服务。 如图,如果服务提供者I发生了故障,当前的应用的部分业务因为依赖于服务I&#xff…

文件的使用

文章目录 1.概念1.1定义:1.2分类1.2.1程序文件1.2.2数据文件1.概念2.存储方式 1.3文件名 2.文件的使用2.1文件指针2.2开闭函数2.3顺序读写2.3.1何为读写2.3.2读写函数1.字符输出fputc(输出到文件 写到文件中)2.字符输入fgetc(输入…

Spring 的创建和使用

目录 一. 创建 Spring项目 二. 存储 Bean 对象到Spring中 1. 添加Spring配置文件 2. 创建一个 Bean 对象 3. 将 Bean 存储到 Spring 容器中 三. 从 Spring 中获取并使用 Bean 对象 1. 创建 Spring 上下文 1.1 使用 ApplicationContext 作为Spring上下文 1.2 使用 Bea…

线性回归模型(7大模型)

线性回归模型(7大模型) 线性回归是人工智能领域中最常用的统计学方法之一。在许多不同的应用领域中,线性回归都是非常有用的,例如金融、医疗、社交网络、推荐系统等等。 在机器学习中,线性回归是最基本的模型之一&am…

深入理解 Linux 内核

Linux 内核系列文章 Linux 内核设计与实现 深入理解 Linux 内核 Linux 设备驱动程序 Linux设备驱动开发详解 文章目录 Linux 内核系列文章前言一、内存寻址1、内存地址2、硬件中的分段(1)段选择符 3、Linux 中的分段(1)Linux GDT&…

IPsec中IKE与ISAKMP过程分析(快速模式-消息1)

IPsec中IKE与ISAKMP过程分析(主模式-消息1)_搞搞搞高傲的博客-CSDN博客 IPsec中IKE与ISAKMP过程分析(主模式-消息2)_搞搞搞高傲的博客-CSDN博客 IPsec中IKE与ISAKMP过程分析(主模式-消息3)_搞搞搞高傲的博客…

九款顶级AI工具推荐

ChatGPT OpenAI开发的最强对话系统 地址:chat.openai.com ChatGPT能够在同一个会话期间内回答上下文相关的后续问题。其在短时间内引爆全球的原因在于,在网友们晒出的截图中,ChatGPT不仅能流畅地与用户对话,甚至能写诗、撰文、编…

【远程工具】- Tabby 下载、安装、使用、配置【ssh/Serial】-免安装、解压即用

目录 一、Tabby 概述 二、Tabby 下载、安装 三、Tabby 的使用  👉3.1 使用SSH协议连接Linux开发主机  👉3.2 使用Serial(串口)协议连接开发板 一、Tabby 概述 在远程终端工具中,secureCrt 和 XShell 是两款比较有名的远程工具,但…

尚融宝26-投标

目录 一、需求 (一)投资人投标 (二)流程 二、标的详情 (一)需求 (二)后端 (三)前端 三、计算收益 (一)四种还款方式 &#…