THREE.js学习笔记7——Debug UI

news/2025/1/16 18:04:54/文章来源:https://www.cnblogs.com/xxxiCJQ/p/18674346

这小节学习的是如何构建Debug UI
对于一些具有创造性的项目,可能会有很多个变量,Debug UI可以让开发人员,设计师,甚至是客户都能轻松调整这些变量
安装lil-gui,直接npm install lil-gui
大部分的参数调整,都可以通过gui.add()来添加,gui.add()含有两个参数,第一个是需要修改的物体的属性,第二个是需要修改这个物体的属性中的哪个值。同时,只能修改属于这个物体的属性的某个值
第3,4,5个参数分别是最小值,最大值和幅度

import GUI from 'lil-gui';
const gui = new GUI()
//这样只能输入数字去控制,不是很方便
gui.add(cube.position, 'y')
//像这样多放入几个参数,就会有可拖拽的控制条了
gui.add(cube.position, 'x', -2, 2, 0.01)
//也可以这样写
gui.add(cube.position, 'z').min(-2).max(2).step(0.01)

lil-gui将检测您想要调整什么类型的属性并使用对应接口,写一个范围,就会有可拖拽的控制条,写一个布尔类型的,就会出现复选框

//是否可见
gui.add(cube, 'visible')
//是否为线框模式
gui.add(material, 'wireframe')

修改颜色,需要使用.addColor(),因为颜色不是一个字符串,也不是一个布尔值或者数字,它是一个Three.jsColor

gui.addColor(material, 'color')
//同时可以绑定onchang事件来获取确切的值
gui.addColor(material, "color").onChange((value) => {console.log(value.getHexString());
});//确保在gui上获取的颜色和材质中的颜色一致
const debugObject = {};
debugObject.color = "#fff";
gui.addColor(debugObject, "color").onChange((value) => {material.color.set(debugObject.color);
});

同时也可以绑定函数,通过点击按钮触发事件

debugObject.spin = () => {gsap.to(cube.rotation, { duration: 1, y: cube.rotation.y + Math.PI * 2 });
};
gui.add(debugObject, "spin").name("旋转一周");

但是,如果想要修改像widthSegments(宽度细分数)这样的值时,直接绑定就会出错,因为像widthSegments这样的参数,在渲染方块时,只会执行一次。所以,在修改细分数时,将旧的模型销毁,重新渲染一个新的模型

debugObject.segments = 1;
gui.add(debugObject, "segments", 1, 20, 1).onChange((e) => {//在创建新的方块之前,需要将旧的方块销毁,不然会导致内存泄漏cube.geometry.dispose();cube.geometry = new THREE.BoxGeometry(1,1,1,debugObject.segments,debugObject.segments,debugObject.segments);
});
//为了性能考虑,可以当变化停止时,在触发函数
gui.add(debugObject, "segments", 1, 20, 1).onFinishChange((e) => {cube.geometry.dispose();cube.geometry = new THREE.BoxGeometry(1,1,1,debugObject.segments,debugObject.segments,debugObject.segments);
});

当我们在调试窗口有很多调整项时,我们可以使用addFolder()来管理所有的调整项,同样,通过addFolder()新添加的文件夹,可以通过.add()方法像其中添加调整项

const cubeTweakes = gui.addFolder("Awesome cube");
cubeTweakes.add(debugObject, "spin").name("旋转一周");

同时在创建gui实例化的对象时,我们可以向其中添加更多的参数

const gui = new GUI({width: 500,//调试窗口的宽度title: "调试窗口",//名字closeFolders: true,//折叠所有子文件
});
gui.close();//折叠主文件
gui.hide();//隐藏主文件
//如果要使用键盘切换显隐,只需要给键盘绑定事件即可
addEventListener("keydown", (e) => {if (e.key == "h") {gui.show(gui._hidden);}
});

学什么东西的时候,就可以添加和它相关的东西的调整项

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

wordpress 从服务器收到预料之外的响应。此文件可能已被成功上传。请检查媒体库或刷新本页。此响应不是合法的JSON响应。解决方法.210721

两种报错方式: 1.此响应不是合法的JSON响应。 2.从服务器收到预料之外的响应。此文件可能已被成功上传。请检查媒体库或刷新本页。 情况:媒体服务器上传小文件没问题,大一点的文件报这个错误。 原因:这是因为nginx限制了请求体大小 方案:需要在nginx的虚拟机配置文件中添加…

docker containner挂掉,无法exec进入bash,如何修改文件的终极解决方法.210730

场景: Nginx在bash里面配置的时候挂掉了,然后docker start不起来,exec bash进不去,造成无法再改里面的文件了 解决方法: 1,docker ps –a 可以查到所有docker,包括没有运行的,找到containner ID [root@hecs-29489 ~]# docker ps -a CONTAINER ID IMAGE COMMAND…

HP惠普笔记本重装系统无法引导无法进操作系统的终极解决方法.210804

F9进入BIOS-先进(Advanced)-安全引导配置- 启用传统支持和禁用安全引导.zstitle { width: 280px; text-align: center; font-size: 26px } .zsimgweixin { width: 280px } .zsimgali { width: 280px; padding: 0px 0px 50px 0px } .zsleft { float: left } .zsdiv { display:…

Feign与SpringCloud LoadBalancer实现负载均衡源码分析

SpringCloud LoadBalancer 众所周知,SpringCloud体系中负载均衡的组件有SpringCloud LoadBalancer和Ribbon,Ribbon也在逐渐的被替代掉,因为SpringCloud LoadBalancer性能更高,支持响应式 下面通过hard-coded体现一下SpringCloud的负载均衡 首先有一个【say-hello】服务,提…

JS — 判断语句与循环语句

js的判断语句与循环语句...(* ̄0 ̄)ノ判断语句JavaScript中的if-else语句与C++、Python、Java中类似。直接输出到控制台:test.html中的内容为: <script type="module">let score = 90;if (score >= 85) {console.log("A");} else if (score &g…

Living-Dream 系列笔记 第92期

最小路径点覆盖 在一张 DAG 上,求一个路径的集合,使得它们两两不相交,且覆盖所有的点。 结论:答案即为 \(总点数-最大匹配\)(于是 \(总点数-最大匹配=总点数-最小点覆盖=最大独立集=最大团=最小路径点覆盖\))。 证明: 不妨转换角度,从研究路径转为研究点。 因为路径两两…

毕设学习第四天之Java的注解和反射

注解(Annotation) Java 注解(Annotation)是一种特殊的语言构造,用于为代码元素(如类、方法、字段等)提供元数据,通常不直接影响程序的逻辑执行。它们可以被编译器、框架或工具解析,用于执行特定操作,如自动化配置、代码生成、验证等。Java 提供了内置的注解(如 @Overr…

Docker安装wikijs wiki系统.210818

1. 拉取mysql8的镜像并运行 docker pull mysqldocker run -d -v /data/mysql/data:/var/lib/mysql -v /data/mysql/conf:/etc/mysql/conf.d --name mysql -e TZ=Asia/Shanghai -e MYSQL\_ROOT\_PASSWORD=1234 -p 3306:3306 mysql:latest2. 进入mysql,创建并修改权限 docker…

重载自动驾驶平板车HAV

随着无人驾驶在封闭场地和干线道路场景的加速落地,港口作为无人化运营的先行者,其场景的复杂度、特殊性对无人化运营的技术提出了各种挑战。为了应对港口无人化运营在实质化落地过程的挑战,经纬恒润借助自身在无人驾驶领域的深厚积累与实践,研发了全新的第三代重载自动驾驶…

【深度学习教程】Python 如何用 LSTM 做情感分析?小白也能上手!

Hello 大家好,今天我们来聊一个超热门的话题——**LSTM 网络在情感分析中的应用**!想象一下,通过深度学习,你的代码可以读懂人类情绪,知道“我爱你”和“我讨厌你”的区别,是不是很酷?今天这篇文章,我会手把手教你从零开始,用 Python 和 Keras 实现一个**基于 LSTM 的…

安川YASKAWA机器人主板维修方法合集

安川机械手板卡故障分析与YASKAWA机械臂主板维修步骤 1. 确认故障现象:首先,我们需要详细了解安川机器人主板故障现象,包括但不限于工作异常、运行错误、速度变慢等。 2. 拆卸主板:根据故障现象,找到相应的机械手电路板故障部位,并小心地将主板拆卸下来,确保不损坏其他部…

lstm理解

batch_size:表示再这样的数据集中有多少数据表单,本列中为3张表单,构成3维数据。若是10张表单,则10张表单堆叠在一起,构成3维数据。time_step:表示在3维时间序列中,每张表有多少行,每个时间序列有多少点,时间点实际就是时序序列的序列长度,成为时间步。input_diensio…