GUI是图形用户界面(Graphical User Interface)的简写,为了方便我们编写代码时对相机、灯光等对象参数进行实时调节,Threejs我们提供了GUI库,使用它,可以快速创建控制三维场景的UI交互界面threejs三维空间的很多参数需要通过GUI的方式调试出来。这里我们仍然以上一节中的代码为例详细了解下GUI库
使用GUI库,我们首先需要引入GUI库
1.引用GUI库

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

2.创建GUI对象

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

这样就在页面创建一个GUI控件我们在上一节课的基础上创建GUI后,发现页面右上角出现一个Controls控件
在这里插入图片描述
为了后面观察方便,这里我们给上一节中的聚光灯添加聚光灯的辅助

const spotLightHelper = new THREE.SpotLightHelper(sportLight)
scene.add(spotLightHelper)

在这里插入图片描述
.add()方法
.add()方法用于向GUI中添加控制对象及其属性,它有四个参数
.add(控制对象,对象具体属性,属性参数最小值,属性参数最大值)
比如我们通过GUI实时控制聚光灯的angle属性,添加如下代码

gui.add(sportLight, 'angle', 0,  Math.PI / 2);

添加上述代码后,在右上角的Controls中会出现一个angle属性的控制条,可以通过调节右面滑块直接输入框输入数字滚动滚轮调节聚光灯的光线散射角度
在这里插入图片描述
.onChange方法
.onChange方法用于监听控件的改变,它接收一个回调函数作为参数,在回调函数可以接收改变的值,并处理相关业务逻辑
上面我们添加add方法后,我们在浏览器新页面后控制angle滑块来改变聚光灯的光线散射角度,我们发现,聚光灯的散射角度是改变了,但是我们添加的聚光灯辅助没有跟着变化,这时,我们就需要onChange方法的回调函数调用聚光灯辅助类的.update()方法来更新

gui.onChange(function(val){
  console.log(val);
  spotLightHelper.update()
})

添加上述代码后,在刷新浏览器,控制滑块发现聚光灯的散射角度变化时,聚光灯辅助类也会跟着变化
我们可以将上面的add方法和onChange方法以链式编程方式编写

// gui增加交互界面用来改变sportLight的 angle的属性
gui.add(sportLight, 'angle', 0,  Math.PI / 2).onChange(function(val){
  console.log(val);
  spotLightHelper.update()
})

使用同样的方法,我们可以添加sportLightposition属性来控制其在xy,z轴上的坐标

gui.add(sportLight.position,'x',-300,0)
gui.add(sportLight.position,'y',0,350)
gui.add(sportLight.position,'z',0,300)

.step()方法
.step()方法可以设置交互界面每次改变时属性值的间隔多少

gui.add(sportLight.position,'x',-300,0).step(1)

.addColor()方法
.addColor()方法生成颜色值改变的交互界面,它接收两个参数,一个是控制对象,一个是颜色属性

gui.addColor(sportLight,'color')

刷新浏览器修改聚光灯颜色为红色
在这里插入图片描述
.name()方法
.name()方法可以给控制对象的属性重命名,方便我们更好理解要改变对象的属性

gui.add(sportLight, 'angle', 0,  Math.PI / 2).onChange(function(val){
  console.log(val);
  spotLightHelper.update()
}).name('聚光灯散射角度')

在这里插入图片描述
.addFolder()方法
.addFolder()方法创建一个分组,我们可以将同一对象的属性通过.addFolder()方法创建同一个分组
通过const sportLightFolder = gui.addFolder(‘聚光灯’)创建一个分组然后将上面所有的属性都通过sportLightFolder .add()或.addColor()方法添加

sportLightFolder.add(sportLight, 'angle', 0,  Math.PI / 2).onChange(function(val){
  console.log(val);
  spotLightHelper.update()
}).name('聚光灯散射角度')
sportLightFolder.add(sportLight.position,'x',-300,0).step(1)
sportLightFolder.add(sportLight.position,'y',0,350)
sportLightFolder.add(sportLight.position,'z',0,300)

sportLightFolder.addColor(sportLight,'color')

这样就将同一个控制对象的属性放在了同一个菜单
在这里插入图片描述
addFolder()方法是可以嵌套的,比如上面的x、y、z实际上都是position的分量,我们就可以继续使用addFolder()方法来将x、y、z放在一个子菜单

const sportLightFolder = gui.addFolder('聚光灯')

sportLightFolder.add(sportLight, 'angle', 0,  Math.PI / 2).onChange(function(val){
  console.log(val);
  spotLightHelper.update()
}).name('聚光灯散射角度')
const positionFolder = sportLightFolder.addFolder('坐标')
positionFolder.add(sportLight.position,'x',-300,0).step(1)
positionFolder.add(sportLight.position,'y',0,350)
positionFolder.add(sportLight.position,'z',0,300)

sportLightFolder.addColor(sportLight,'color')

再次刷新浏览器查看,我们发现x、y、z放在了“坐标”子菜单下
在这里插入图片描述
.close()和.open()方法
默认情况下,GUI创建的所有菜单都是打开的,我们可以通过.close()方法控制其关闭通过.open()方法控制其打开

//控制Coltrols菜单关闭
gui.close()
// 聚光灯子菜单关闭
const sportLightFolder = gui.addFolder('聚光灯').close()
// 坐标子菜单关闭
const positionFolder = sportLightFolder.addFolder('坐标').close()

效果
在这里插入图片描述
这里只是以聚光灯为例说明GUI调试器使用,它可以监视任何控制对象,比如相机比如物体等,更多使用方法,还需要我们不断摸索和实践
今天就到这里,喜欢的点赞关注

原文地址:https://blog.csdn.net/w137160164/article/details/130019040

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_41664.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注