Three.js--》Gui.js库的使用讲解

article/2025/10/8 14:09:42

目录

Gui.js库基本使用

使用three自带gui库实现基本操作

gui库实现下拉菜单和单选框

gui库分组方法实现

使用dat.gui第三方库


Gui.js库基本使用

gui.js说白了就是一个前端js库,对HTML、CSS和JavaScript进行了封装,学习开发3d技术时借助该库可以快速创建控制三维场景的UI界面,当然你也可以通过npm去安装第三方包的方式来获取该库的内容,为了方便,three.js官方中的扩展库当中也为我们提供了gui.js库,达到的效果大致一样但是使用的API可能不同,当然两种方式我都介绍一下吧。

使用three自带gui库实现基本操作

这个我百度了一下,好像之前three版本使用的是dat.gui库,而我现在下载是three.js使用的是另一个lil.gui库,这是两个不同的GUI库,虽然它们的作用相似,但是它们的用法和API有所不同,目前我下载的three.js库使用的就是lil.gui库,就姑且以它举例说明吧。

引入lil.gui库

// 引入gui.js库
import { GUI } from 'three/examples/jsm/libs/lil-gui.module.min.js'

创建一个GUI对象

// 实例化一个gui对象
const gui = new GUI()

在页面的右上角出现了这样一个类似控制器的界面:

改变GUI界面默认是style样式:如果想修改gui界面是css样式,比如说将位置设置在左上角,可以通过如下方式进行:

使用add方法快速创建UI交互界面:执行gui的.add()方法可以快速创建一个UI交互界面,比如一个拖动条,可以用来改变一个JavaScript对象属性的属性值,格式如下:

格式:.add(控制对象,对象具体属性,其他参数)

其他参数:可以是一个或多个,数据类型也可以不同,gui会自动根据参数形式,自动生成对应的交互界面,参数3和参数4分别是一个数字,交互界面是一个鼠标可以拖动的拖动条,可以在一个区间改变属性的值。

光源对象具有一个光照强度属性 .intensity ,可以通过gui拖动改变该属性:

再比如我想修改一个立方体的位置,mesh.position是JS对象,改变其xyz数值即可:

使用name方法命名GUI功能模块: 如果你不使用name方法的话,默认情况下GUI界面显示功能模块的名称是属性名称,如果相同属性名称但是功能不同的模块的话,我们就很难分清到底功能模块对应的功能是哪一个了,这里就需要调用name方法进行命名,如下:

使用step方法设置界面改变属性值的间隔:这个方法就是避免如果GUI界面某属性值的范围太大或者太小拖到的话很难把握准度准备的,如下:

使用onChange方法来执行某些代码: 这方法作用就是比如你拖到数值到达某个值或范围时就想执行你设定的一些代码,也是比较人性化的,如下我想改变颜色:

gui库实现下拉菜单和单选框

经过上文的操作,想必大家也都了解了gui库的一些基本操作,接下来开始讲解借助add方法创建新的UI交互界面,比如下拉菜单和单选框。

实现下拉框的方式很简单,将原本的书写范围的参数替换成一个数组或对象即可,如下:

如果想实现一个单选框的话很简单,只要是布尔类型的就行,这边我举个例子,通过单选框来控制立方体的旋转与否:

在渲染器函数处进行判断

gui库分组方法实现

当GUI交互界面需要控制的属性比较多的时候,为了避免混乱可以进行适当的分组,这样更清晰:

通过addFolder方法能够为当前的功能模块设置一个子菜单,凡是使用其定义的常量进行添加功能模块的,统统归属于当前子菜单中的内容。

当然子菜单默认是展开的,如果想默认是关闭的状态可以进行如下设置:

如果想进行套娃效果,比如说在子菜单中嵌套子菜单的话,可通过如下方式:

使用dat.gui第三方库

终端执行如下命令,安装第三方包:

npm install dat.gui

安装完成之后进行导入使用即可:

// 导入dat.gui
import * as dat from 'dat.gui'
const Gui = new dat.GUI()

相关操作和上文基本差不多,不过还是有一些出入的地方,这些就大家自行探索吧,博主在这就不再过多赘述。ok给出本文的笔记代码:

import * as THREE from 'three';
// 导入轨道控制器
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls'
// 引入gui.js库
import { GUI } from 'three/examples/jsm/libs/lil-gui.module.min.js'
// 实例化一个gui对象
const gui = new GUI()// 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)
// 修改物体的位置
// gui.add(cube.position,'x',[0,5,10])
// gui.add(cube.position,'y',{'left':-10,'center':0,'right':10})
const position = gui.addFolder('坐标位置')
const position1 = position.addFolder('坐标位置1')
position.close() // 默认是关闭状态position1.add(cube.position,'x',0,10)position.add(cube.position,'y',0,10)
position.add(cube.position,'z',-10,10)
scene.add(cube)
cube.position.y=2// 修改物体的颜色
const obj = {color:0x00ffff,bool:false
}
const color = gui.addFolder('物体颜色')
color.addColor(obj,'color').onChange(value=>{cube.material.color.set(value)
})
gui.add(obj,'bool').name('控制旋转')// 4.初始化渲染器
const renderer = new THREE.WebGLRenderer()
renderer.setSize(window.innerWidth,window.innerHeight)
document.body.appendChild(renderer.domElement)// 添加一个环境光
const ambient = new THREE.AmbientLight(0xffffff,0.9)
scene.add(ambient)
gui.add(ambient,'intensity',0,2).name('环境光源').step(0.01)
// 创建一个点光源
const pointLight = new THREE.PointLight(0xffffff,1.0)
pointLight.position.set(0,5,0)
scene.add(pointLight)
gui.add(pointLight,'intensity',0,5).name('点光源')// 创建地面网格参照
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) // 添加到场景之中// 创建轨道控制器
const controls =  new OrbitControls(camera,renderer.domElement)
// 设置控制器阻尼,让控制器更有真实效果,但必须在动画循环里调用 .update()
controls.enableDamping = trueexport function render(){if(obj.bool){cube.rotation.y+=0.05}// 每次循环渲染时调用stats更新方法,来刷新时间controls.update()renderer.render(scene,camera) // 周期性执行相机的渲染功能,更新canvas画布上的内容requestAnimationFrame(render) // 接下来渲染下一帧的时候就会调用render函数
}
// 先开始就渲染一下
render()

http://chatgpt.dhexx.cn/article/YHoSIm3u.shtml

相关文章

JSM的topic和queue的区别

在JMS(Java消息服务)中,Topic实现publish和subscribe语义。一条消息被publish时,它将发到所有感兴趣的订阅者,所以零到多个 subscriber(电脑词汇中解释为“用户“)将接收到消息的一个拷贝。但是…

小程序版 Three.js 框架下载及目录配置

1.库文件说明 由于微信官方提供的threejs适配库已经很久没有更新,而且开发者普遍反映使用起来很难用。 我这里分享的是独立的库文件,不需要npm安装,下载后将库文件放到项目中即可使用。 2.下载后的压缩包文件 3.解压后的文件夹结构 4.文件…

webpack使用Ammo.js - 在react中使用Ammo.js

真实麻烦啊 [我的项目仓库 Next.js项目 仅供参考](https://gitee.com/honbingitee/three-template-next.js/tree/feature%2Fphysics/)本文展示使用ammo.wasm.js 结合ammo.wasm.wasm的wasm版本使用方法1. 配置webpack2. 导出Ammo 修改ammo.wasm.js文件3. 删除语句 通过查找 this…

Vue里面使用threeJS 的 OrbitControls报错问题

vue使用 OrbitControls 首先需要按需引入 1、执行 npm install three --save-dev npm install three --save-dev 2 按需引入 import * as THREE from three import { OrbitControls } from three/examples/jsm/controls/OrbitControls.js; 3 使用鼠标控制器 /*** 创建渲染…

JSM 2019 | 数据驱动在滴滴,详解智能出行时代的统计思维

桔妹导读:当地时间7月27日至8月1日,统计学领域顶级学术会议 JSM(Joint Statistical Meetings)在美国丹佛成功举行。丹佛是美国科罗拉多州的首府和最大城市,紧靠景色秀丽的落基山,气候宜人。平均海拔1610米&…

JM

第3章 JMX-MBean的HelloWorld实例 3.1 前言 Boss Connecter这个项目用到的技术还真够多的,这一章是要用到的JMX技术。什么是JMX?在一篇网文中是这样说的:“JMX(Java Management Extensions)是一个为应用程序植入管理功能的框架。JMX是一套…

Three.js--》实现3d圣诞贺卡展示模型

目录 项目搭建 初始化three.js基础代码 加载环境模型 设置环境纹理 添加水面并设置阴影效果 实现幽灵小球的运动 实现相机切换和文字切屏 实现漫天星星和爱心样式 今天简单实现一个three.js的小Demo,加强自己对three知识的掌握与学习,只有在项目…

Three.js 点击模型,高亮发光模型外轮廓

最近在开发一个功能,在三维场景里有很多模型,需要点击模型,高亮对应的模型,代表选中了该模型。做起来还是稍微麻烦一些的。 具体效果 实现流程 主要的流程还是, Created with Raphal 2.3.0 开始 获取鼠标点 射线碰撞…

Three.js--》实现3d汽车模型展览搭建

目录 项目搭建 初始化three.js基础代码 添加汽车模型展示 动态修改汽车模型 今天简单实现一个three.js的小Demo,加强自己对three知识的掌握与学习,只有在项目中才能灵活将所学知识运用起来,话不多说直接开始。 项目搭建 本案例还是借助…

vue3中使用three.js

现在vue3的项目中,大部分是vitevue3typescriptpinia的技术栈 vue3项目中安装three.js pnpm i types/three three 注意:在package.json中查看他们的版本,如果版本不一致的话,可能导致ts不能识别three这个模块 导入three模块 impor…

three.js学习笔记(十九)——后期处理

介绍 后期处理是指在最终图像(渲染)上添加效果。人们大多在电影制作中使用这种技术,但我们也可以在WebGL中使用。 后期处理可以是略微改善图像或者产生巨大影响效果。 下面链接是Three.js官方文档中一些关于后期处理的示例: http…

JMM--

数据同步的八大原子操作 1.lock 作用于主内存中的变量,把一个变量标记为一条线程的独占状态。 2.unlock 作用于主内存中的变量,把一个处于锁定状态的变量释放出来,释放后的变量才能被其它线程锁定。 3.read 作用于主内存中的变量&#xff0c…

Three.js--》实现3d小岛模型搭建

目录 项目搭建 初始化three.js基础代码 设置环境背景 设置水面样式 添加天空小岛 今天简单实现一个three.js的小Demo,加强自己对three知识的掌握与学习,只有在项目中才能灵活将所学知识运用起来,话不多说直接开始。 项目搭建 本案例还…

JMS简介

jms即Java消息服务(Java Message Service)应用程序接口是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。Java消息服务是一个与具体…

java jsm_JSM 基础

JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。Java消息服务是一个与具体平台无关的API,绝大多…

JSM

消息中间件 消息中间件利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型,它可以在分布式环境下扩展进程间的通信。对于消息中间件,常见的角色大致也就有Producer&am…

【HLL】使用 HyperLogLog 去重案例

1.概述 HyperLogLog一个常用的场景就是统计网站的UV。 ##基数 简单来说,基数(cardinality,也译作势),是指一个集合(这里的集合允许存在重复元素)中不同元素的个数。例如看下面的集合: {1,2,3,4,5,2,3,9,7} 这个集合有9个元素,但是2和3各出现了两次,因此不重复的元素…

5redis-----------redis高级--GEO-查询附近的人、基数统计算法HLL 、布隆过滤器、缓存雪崩穿透击穿-------全栈式开发44

redis高级 一、GEO查询附近的人二、基数统计算法-HyperLogLog三、布隆过滤器四、缓存雪崩&缓存穿透(一)缓存雪崩(二)缓存穿透(三)缓存击穿 一、GEO查询附近的人 引入 我们所处的任何位置都可以用经纬…

【Hll】Hll HyperLogLog: Cardinality Estimation(基数估计算法源码解析)

1.概述 好文章,转载防丢失 主要是这里有源码,我遇到问题了,问题是flink在累加器中使用的时候,每次累加最终结果是1,2 每次到了2 就会重新回到1,很郁闷于是看看源码 2.背景 我们经常会统计某个字段的dis…

PostgreSQL HLL插件介绍—晟数学院

更多精彩内容:请登录:ke.sandata.com.cn 前言 HLL是 HyperLogLog数据结构的简称。PostgresSQL通过插件的方式引入了这种新的数据类型hll。HyperLogLog是一个具有固定大小,类似于集合结构,用于可调精度的不同值计数。例如,在1280字节的hll数据结构中,它可以在很小的误差…