探索三维世界【4】:Three.js dat.gui gsap 的使用

news2025/1/19 14:23:21

探索三维世界【4】:Three.js & dat.gui & gsap 的使用

  • 1、dat.gui是什么?
  • 2、gsap的介绍与使用
    • 2.1、前提准备工作(绘制一个BoxGeometry)
    • 2.2、安装引入gsap动画库
    • 2.3、使用gsap动画
    • 2.4、配合事件使用
  • 3、使用dat.gui
    • 3.1、添加颜色选择器
    • 3.2、添加选择框
    • 3.3、自定义动画
    • 3.4、添加文件夹

1、dat.gui是什么?

在游览threejs的官方文档的时候,我们会发现他不单单是做了一个3D展示图形,他还提供了一个图形页面,用来控制3D对象的一些属性,在进行操作图形界面时,对应的3D对象物体的属性也会跟着进行改变,如下图:
在这里插入图片描述
这时也许你会好奇这个界面时如何做的,这就引入了这篇文章的重点了,也就是dat.gui,首先我们先熟悉一下他是做什么的:

dat.gui 是一个开源的前端 JavaScript 库,用于创建基于 web 界面的交互式调试界面。它提供了一个简单易用的 API,使用户可以轻松地创建各种控件,如滑块、复选框、下拉菜单、颜色选择器等,以便在浏览器中测试和修改代码时进行交互式的实验。
dat.gui GitHub地址:https://github.com/dataarts/dat.gui/blob/HEAD/API.md

2、gsap的介绍与使用

GSAP (GreenSock Animation Platform) 是一个 JavaScript 动画引擎,用于为 web 应用程序创建复杂的动态效果和交互式界面。它由 GreenSock 公司推出,是一个功能强大、高性能、易于使用且高度可定制的动画库。

GSAP 提供了一组灵活和强大的 API 让开发人员可以控制元素的属性、时间轴、缓动函数等,并能够在多平台上设计流畅而专业的动画效果,在网站和应用程序中创建出色的用户体验。

gsap官网:https://greensock.com/

2.1、前提准备工作(绘制一个BoxGeometry)

这里的话就直接上代码了,也不做过多的说明,其中对这一段代码不够熟悉的话可以查看这个分栏:https://blog.csdn.net/qq_44973159/category_12267425.html

这里新增了一个Orbit controls(轨道控制器),它可以使得相机围绕目标进行轨道运动。并且在最后添加了两个监听事件,其中分别是窗口改变大小后页面自适应&双击全屏&退出全屏展示

import * as THREE from 'three'
import {
    OrbitControls
} from 'three/examples/jsm/controls/OrbitControls.js'

var dir = false
// 场景
const scene = new THREE.Scene();
// 相机 (透视相机)  角度、宽高比、近端面、远端面
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
camera.position.set(0, 0, 5);
scene.add(camera);

// 几何体与材质
const geometry = new THREE.BoxGeometry(1, 1, 1);
const material = new THREE.MeshBasicMaterial({
    color: 0x00ff00
});
const cube = new THREE.Mesh(geometry, material);
// 设置位置
cube.position.set(0, 0, 0)
scene.add(cube);

// 渲染
const renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);

// 坐标轴辅助器
const axesHelper = new THREE.AxesHelper(5);
scene.add(axesHelper);

// 新增轨迹控制器
const controls = new OrbitControls(camera, renderer.domElement);
// 阻尼感   新增update()
controls.enableDamping = true

function render(time) {
    controls.update()
    renderer.render(scene, camera);
    requestAnimationFrame(render);
}

render();

window.addEventListener('resize', (e) => {
    // 宽高比
    camera.aspect = window.innerWidth / window.innerHeight;
    camera.updateProjectionMatrix();
    renderer.setSize(window.innerWidth, window.innerHeight);
    renderer.setPixelRatio(window.devicePixelRatio);
})

window.addEventListener('dblclick', () => {
    if (!document.fullscreenElement) {
        renderer.domElement.requestFullscreen()
    } else {
        document.exitFullscreen()
    }
})

2.2、安装引入gsap动画库

首先需要安装该库

npm i gsap

引入gsap

import gsap from 'gsap'

2.3、使用gsap动画

我们在对应的js当中当中直接使用gsap,如下代码:用于控制一个旋转的立方体 cube 的动画效果。gsap.to() 方法中传入了两个参数。

  • 第一个参数传入了需要变化属性的对象,即 cube.rotation,表示我们需要对立方体的旋转角度进行动态变化。
  • 第二个参数是一个配置对象,包含了一些选项来控制动画行为。这里使用了三个主要选项:
    • x:表示在 x 轴上应该旋转多少弧度,这里为 5 * Math.PI,即顺时针旋转了 5 PI(3.14)个弧度。
    • duration: 表示动画的总时间为 5 秒钟,即从开始到结束所需的时间。
    • ease: 表示缓动函数,这里的值为 ‘power1.inOut’ ,使用了一种名为 ‘power1.inOut’ 的缓动函数。它以易于开发人员理解的方式定义了运动的速度和加减速度曲线,使得动画更自然、流畅、可预测且可定制。
gsap.to(cube.rotation, {
    x: 5 * Math.PI,
    duration: 5,
    ease: 'power1.inOut'
})

2.4、配合事件使用

这里定义了一个名为 animation 的常量,它调用了 gsap.to() 方法。方法的第一个参数是要变化属性的对象,即 cube.position,表示需要对立方体的位置进行动态变化。第二个参数是一个配置对象,包含以下选项:

  • x: 表示在 x 轴上面应该移动多少距离,这里为 5。
  • duration: 表示动画效果的总时间长度为 5 秒。
  • ease: 表示缓动函数,这里使用了 ‘power1.inOut’,让动画效果开始时速度慢然后加速到最大,再减速完成整个动画过程。
  • repeat: 表示重复播放的次数,这里设置为无限次,即 -1,意味着立方体将无限循环移动。
  • yoyo: 表示是否在每次循环结束时反转动画,这里设置为 true,意味着它将在每次循环结束后反向旋转相同的距离。
  • delay: 表示延迟动画开始的时间,单位是秒,这里为 2 秒钟.
  • onStart: 回调函数,表示当动画开始时执行该函数,在这里用 alert 弹出消息 “动画开始”。
  • onComplete: 回调函数,表示动画完成时执行该函数,在这里用 alert 弹出消息 “动画完成”。

因此,这段代码意味着立方体将沿 x 轴向右移动 5 个单位(每次循环),以一定的缓动方式执行一个连续翻转的动画,并将在循环结束时反转动画并重复播放,直到无限次数。还设置了延迟 2 秒后开始动画效果,并在每次动画开始和完成时弹出相应的警告提示框。

const animation = gsap.to(cube.position, {
    x: 5,
    duration: 5,
    ease: 'power1.inOut',
    repeat: -1,
    yoyo: true,
    delay: 2,
    onStart: () => {
        alert("动画开始")
    },
    onComplete: () => {
        alert("动画完成")
    }
})

在通过对页面的点击事件来进行监听控制:

window.addEventListener('click', () => {
    if (animation.isActive()) {
        animation.pause()
    } else {
        animation.resume()
    }
})

在这里插入图片描述

3、使用dat.gui

首先我们还是在一个vue脚手架的项目当中实现,先安装dat.gui库

npm i dat.gui

引入dat.gui

import * as dat from 'dat.gui'

使用dat.gui,在使用之前需要new一个对象实例出来,再通过其add方法,向 GUI 添加新控制器。创建的控制器类型 从 的初始值推断。

在这里是往cube.position 对象上的 x 属性作为一个可调整的控制器,该控制器允许用户更改立方体沿 x 轴的位置。接下来,对该控制器进行了一些定制。使用 .min() 和 .max() 方法设置允许的值的范围,并将步进值设置为 0.01。然后给控制器取了一个名字 ‘移动x轴’。

在链式调用后面,使用 .onChange() 方法传递一个回调函数以响应控制器值的每次更改。当控制器的值发生变化时,回调函数将在控制台中输出消息“值已被修改:”并显示新的控制器值。

通过使用 .onFinishChange() 方法,向该控制器绑定一个另一个回调函数,该函数在用户停止拖动滑块时执行,即完全停止拖动控件以达到新值的过程结束。当该控制器的值不再更改时,此时回调函数将在控制台中输出消息“已完全停止:”并显示当前控制器值。

const GUI = new dat.GUI();
GUI.add(cube.position, 'x').min(0).max(10).step(0.01).name('移动x轴')
    .onChange((value) => {
        console.log('值被修改:', value)
    }).onFinishChange((value) => {
        console.log('完全停下来:', value)
    })

3.1、添加颜色选择器

这里调用 GUI.addColor() 方法来向 GUI 中添加新的颜色控件。该方法接受两个参数:第一个参数是一个包含要控制的初始值的对象,以及其他相关选项,这里设置初始颜色为黑色;第二个参数是控件的名称,可选。

然后使用 .onChange() 方法传递回调函数,以响应控制器值的每次更改。当用户更改控制器的值时,回调函数将在执行时接收所选颜色(由 CSS 颜色字符串表示),然后调用 cube.material.color.set() 方法设置立方体的颜色。

GUI.addColor({
    color: '#000'
}, 'color').onChange((value) => {
    cube.material.color.set(value)
})

3.2、添加选择框

这里调用 GUI.add() 方法,将 cube 对象作为第一个参数传递给它,‘visible’ 作为第二个参数,以此将目标属性添加为可调整的控制器。然后使用 .name() 方法指定该控件的名称为“是否显示”。调用完后,用户可以使用控件上的复选框来切换立方体对象的可见性,从而决定它是否在场景中显示出来。

GUI.add(cube, 'visible').name('是否显示')

3.3、自定义动画

点击 GUI 上的“开启动画”按钮时,会触发 gsap.to() 方法,用于设置立方体沿着 x 轴移动的动画。该方法使用 GreenSock 动画引擎 (GSAP) 提供的 API,可以方便地控制动画的各种参数,例如 duration、ease 等。这里设置盒子从当前位置向右偏移 5 个单位,然后返回到原始位置。repeat:1 意味着重复一次完整动画, yoyo:true 表示在动画结束后,反向回播动画一遍。

GUI.add({
    fn: function () {
        gsap.to(cube.position, {
            x: 5,
            duration: 5,
            ease: 'power1.inOut',
            repeat: 1,
            yoyo: true
        })
    }
}, 'fn').name('开启动画')

3.4、添加文件夹

调用 GUI.addFolder() 方法来向 GUI 中添加新的文件夹控件。该方法接受一个参数,即此文件夹的名称。然后在文件夹中调用 folder.add() 方法两次。

第一次调用将 cube.position.z 添加至文件夹中,并指定控制器的最小值为 0,最大值为 10,步长为 0.01。 .name() 方法设置控制器的显示名称为“移动z轴”。通过这种方式,可以轻松修改立方体对象沿 z 轴的位置。

第二次调用将 cube.material.wireframe (线框属性)添加到文件夹中,并使用 .name() 方法指定控制器名称为“线框”。这样就可以通过单击控制台上的复选框来切换立方体对象的网格线框架可见性。

const folder = GUI.addFolder('文件夹(设置子操作)')
folder.add(cube.position, 'z').min(0).max(10).step(0.01).name('移动z轴')
folder.add(cube.material,"wireframe").name('线框')

最后看一下效果
在这里插入图片描述

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

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

相关文章

生物信息学知识点

生物信息学知识点 1. 序列比对:1.1 基本概念:1.2 全局比对和局部比对:1.3 空位罚分的改进:1.4 同源性和相似性:1.5 相似性矩阵:1.5.1 PAM:1.5.2 BLOSUM: 2. BLAST算法:2.…

React | React的过渡动画

✨ 个人主页:CoderHing 🖥️ React.js专栏:React的过渡动画 🙋‍♂️ 个人简介:一个不甘平庸的平凡人🍬 💫 系列专栏:吊打面试官系列 16天学会Vue 11天学会React Node专栏 &#…

Grafana之Clock Panel使用(06)

Clock Panel可以用来显示当前(各国)时间或用于倒计时,并支持每秒更新一次。 Clock plugin for Grafana | Grafana Labs Clock Panel也是Grafana Labs提供,但并非Native,需自行安装,安装命令如下: # grafana-cli plugins install grafana-clock-panel # systemctl …

前端面试题 — — vue篇

前端面试笔记之vue篇 前言1.数据双向绑定原理⭐⭐⭐2. VUE生命周期⭐⭐⭐3.组件之间如何传值⭐⭐⭐4.路由之间如何传参⭐5.谈一谈VUEX⭐⭐6.如何解决VUEX页面刷新数据丢失问题?⭐⭐7.computed和watch的区别?⭐⭐⭐8.如何封装axios?⭐9.Route和…

APP和小程序共同塑造现代化政务服务

随着移动互联网的飞速发展,政务服务也开始向移动端转移,政务App和小程序结合,可以使政府更好地实现数字化转型和提供优质的政务服务。本文将探讨政务App和小程序的结合优势,以及如何推进政务App和小程序的发展。 移动政务服务应用…

RTSP/RTP on TCP 协议抓包记录

仅做记录,无他。 RTSP OPTIONS 客户端发送: 服务端响应 RTSP DESCRIBE 客户端发送 服务端响应 RTSP SETTUP 客户端发送请求 服务端响应 RTSP PLAY 客户端发送请求 服务端响应 RTP包 这个比较复杂,得好好解析&#xff0…

Git 解决missing Change-Id in message footer

ERROR: commit b007456: missing Change-Id in message footer 无论是linux 还是 window 出现这个,提示都是一样的,按照提示执行就好,网上基本都是这么说的,有的基本都是抄来抄去。 window 遇到这个问题解决步䠫: …

数学天才陶哲轩主持白宫生成式AI工作组,李飞飞、Hassabis发表演讲

夕小瑶科技说 分享 来源 | 新智元 最近,「数学天才」陶哲轩表示,自己将领导白宫生成式人工智能工作组,就当前AI评估并收集意见。在陶哲轩看来,加入工作流的ChatGPT在数学专业领域中,并没有太多增值。 近来&#xff0c…

Windows 环境解压 zip 压缩包乱码问题

前言 最近在接受他人上传的 ZIP 压缩包时,发现解压后文件名出现了乱码,记得自己很久以前似乎把系统的编码改为了 UTF,所以盲猜是压缩包发送人的系统使用了 GBK 编码,出现了错误。 正文 探索 搜了一下,发现了知乎上一…

360°VR全景图片,探索未知,畅游全景

随着科技的不断发展,人们对于视觉的需求越来越高,单一平面的图片已经无法满足人们的需要。360VR全景图片的出现填补了这个空白,它以其全景视角和互动体验,为我们带来了一场视觉盛宴。下面就让我们一起来探讨一下360VR全景图片的特…

网易云商·七鱼智能客服自适应 ProtoStuff 数据库缓存实践

需求背景 目前,网易云商七鱼智能客服数据库缓存使用了 spring-data-redis 框架,并由自研的缓存组件进行管理。该组件使用 Jackson 框架对缓存数据进行序列化和反序列化,并将其以明文 JSON 的形式存储在 Redis 中。 这种方式存在两个问题&…

(数字图像处理MATLAB+Python)第八章图像复原-第三、四节:图像复原代数方法和典型图像复原方法

文章目录 一:图像复原代数方法(1)无约束最小乘方复原(2)约束复原 二:典型图像复原方法(1)逆滤波复原A:概述B:程序 (2)维纳滤波复原A&a…

【C语言】负数取模、取余

文章目录 一. 关于“取整”1. 向0取整2. 向负无穷取整3. 向正无穷取整4. 四舍五入式的取整 二. 关于“取模”的本质三. 取余和取模的区别 一. 关于“取整” 首先谈谈关于数学取整的问题 1. 向0取整 C中的除法和取整规则都是向0取整,即所有小数都向 0 的方向取整&…

第四十一天学习记录:C语言进阶:笔试题整理Ⅱ

喝汽水问题&#xff1a;1瓶汽水1元&#xff0c;2个空瓶可以换一瓶汽水&#xff0c;输入价钱&#xff0c;可以喝多少汽水。&#xff08;编程实现&#xff09; #define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>int main() {int money 0;int total 0;int empty 0;s…

手把手教配置vsc中的c\c++环境

为了防止你之前所看vsc配置C\C视频或者教学不成功的残留影响&#xff0c;这边开始会对vsc进行一次卸载和删除缓存 打开控制面板--点击程序--点击卸载--卸载vsc 显示效果如下 点击是 上面三部完成vsc卸载&#xff0c;接下完成残留卸载 打开你的c盘&#xff0c;如图 点击进去&…

Vue3-黑马(十四)

目录&#xff1a; &#xff08;1&#xff09;vue3-进阶-router-令牌-前端路由 &#xff08;2&#xff09;vue3-进阶-router-令牌-前端路由 &#xff08;3&#xff09;vue3-进阶-pinia1 &#xff08;4&#xff09;vue3-进阶-pinia2 &#xff08;1&#xff09;vue3-进阶-rout…

vite3+vue3 项目打包优化

现在很多小伙伴都已经使用 Vite Vue3 开发项目了&#xff0c;如果你是 “前端架构师” 或者是 “团队核心” 的话&#xff0c;不得不可考虑的一个问题就是性能优化。 说到前端性能优化&#xff0c;个人认为主要有两个方面&#xff1a; 减少文件的体积&#xff0c;体积小了加载…

SIEM日志管理解决方案

如果管理员想知道管理的网络中发生了什么&#xff0c;以便洞察潜在的威胁并在它们变成攻击之前阻止它们&#xff0c;那么管理员需要查看网络日志。企业网络中的设备如路由器、交换机、防火墙、服务器&#xff0c;业务运行的应用程序&#xff0c;如数据库和web服务器等。所有这些…

SpringBoot核心运行原理解析之-------@EnableAutoConfiguration

核心运行原理 我们通常在使用Spring Boot时&#xff0c;只需要引入对应的starters,Spring Boot启动时变回自动加载相关依赖&#xff0c;配置相应的初始化参数&#xff0c;以最快捷&#xff0c;简单的形式对第三方软件进行集成&#xff0c;这边是Spring Boot的自动配置功能。下…

【服务器数据恢复】EMC NAS中的虚拟机数据恢复案例

服务器数据恢复环境&#xff1a; 北京某公司的EMC NAS&#xff0c;总共有3个节点&#xff0c;每个节点配置12块STAT硬盘。 NAS中存放有vmware虚拟机&#xff08;WEB 服务器&#xff09;和视频文件。 虚拟机通过NFS协议共享到ESX主机&#xff0c;视频文件通过CIFS协议共享给虚拟…