ThreeJs学习笔记--GUI(可视化三维改变场景)

引入gui

javascript 复制代码
import { GUI } from "three/examples/jsm/libs/lil-gui.module.min.js";//具体的看自己本地threejs目录

创建gui(实例化gui)

javascript 复制代码
// 实例化一个gui对象
const gui = new GUI();
//改变/设置gui操作界面style属性
gui.domElement.style.right = "0px";
gui.domElement.style.width = "300px";

gui的.add方法

执行gui.add方法可以快速的创建一个交互页面(可以理解为配置出一个交互选项)创建成功后会在gui交互dom上多出对应的选项。格式是.add(控制对象,对象具体属性,其它参数),这个其它参数是可选而且是可以多个或单个的。

举个例子

javascript 复制代码
// 光照强度属性.intensity
console.log('pointLight.intensity',pointLight.intensity);
// 通过GUI改变mesh.position对象的xyz属性
gui.add(pointLight, 'intensity', 5000,10000);

通过操作右上角的部分,可以修改光照强度,可以看得到光照强度的变化

javascript 复制代码
gui.add(mesh.position, 'x', 0, 180);
gui.add(mesh.position, 'y', 0, 180);
gui.add(mesh.position, 'z', 0, 180);

可以可视化的修改物体的位置

gui.add的name方法

可以看到控制台属性名称变成了自定义的

gui.add的step

设置步长,就是修改属性的数值间隔,可以看的出现在的数值只能修改100的倍数

.onChange()方法

监听属性变化,当属性变化的时候可以执行某些操作

.addColor修改颜色,可以配合onChange实用

javascript 复制代码
const obj = {
  color: 0x00ffff,
};
// .addColor()生成颜色值改变的交互界面
gui.addColor(obj, "color").onChange(function (value) {
  mesh.material.color.set(value);
});

gui控制器,下拉模式

实用add+obj/arr+onChange配合就会可以出现下拉控制模式

javascript 复制代码
//数组
let obj ={
    scale:0
}
gui.add(obj,'scale',[-100,0,100]).onChange(function(val){
    mesh.position.x = val;
})

//对象

let obj ={
    scale: 0,
}

gui.add(obj,'scale'{left: -100,center: 0,right: 100}).onChange(function(val){
    mesh.position.x = val;
})

如果第三个参数是布尔值的话,就会出现单选模式

javascript 复制代码
let a = 0.1;
// 添加旋转速度控制
gui.add(guiControls, "rotationSpeed", 0, 1).onChange(function (value) {
  a = value;
});

let isRotate = {
  bool: false,
};
// 添加旋转开关
gui.add(isRotate, "bool").name("旋转");

function animate() {
  if (isRotate.bool) mesh.rotateY(a);
  controls.update(); // 更新控制器
  stats.setMode(1);
  renderer.render(scene, camera); // 渲染场景
  requestAnimationFrame(animate);
}

这样就可以做一个简易的操作联动,设置旋转速度和是否打开旋转

gui分组

gui可以使用.addFolder()来创建一个分组,当页面上需要操作的物品或者环境过多的时候,可以使用分组来分类

javascript 复制代码
const gui = new GUI(); //创建GUI对象
const obj = {
  color: 0x00ffff, // 材质颜色
  specular: 0x000000, // 高光颜色
};
// 创建材质子菜单
const matFolder = gui.addFolder("材质");
matFolder.addColor(obj, "color").onChange(function (value) {
  material.color.set(value);
});
// 材质高光颜色specular
matFolder.addColor(obj, "specular").onChange(function (value) {
  material.specular.set(value);
});
const ambientFolder = gui.addFolder("环境光");
// 环境光强度
ambientFolder.add(ambient, "intensity", 0, 2);
const pointLightFolder = gui.addFolder("点光源");
// 点光源强度
pointLightFolder.add(pointLight, "intensity", 0, 10000);
// 点光源位置
pointLightFolder.add(pointLight.position, "x", -400, 400);
pointLightFolder.add(pointLight.position, "y", -400, 400);
pointLightFolder.add(pointLight.position, "z", -400, 400);

默认分组都是打开的,可以通过.close或者.open()来设置下拉选项是否展开

javascript 复制代码
const gui = new GUI()
gui.open()
// 创建材质子菜单
const matFolder = gui.addFolder('材质');
matFolder.close();//关闭菜单

.addFolder可以实现嵌套,也就是套娃,可以在子菜单里在加子菜单

javascript 复制代码
const gui = new GUI()
gui.open()
// 创建材质子菜单
const matFolder = gui.addFolder('材质');
matFolder.close();//关闭菜单
//创建材质子菜单的子菜单

const sonMatFolder = matFolder.addFolder('颜色')
相关推荐
HalvmånEver5 小时前
MySQL的索引
android·linux·数据库·学习·mysql
金色光环5 小时前
【DSP学习】DSP28335 点亮LED
嵌入式硬件·学习·dsp开发
我是发哥哈5 小时前
跨AI模型生成视频的五大维度对比:选型避坑指南
大数据·人工智能·学习·机器学习·chatgpt·音视频
自小吃多6 小时前
本地部署大模型避坑实录|Ollama+AnythingLLM 一直加载、CPU 爆满、GPU 闲置问题完整解决
笔记
北顾笙9807 小时前
LLM学习-day05
学习
我命由我123458 小时前
Windows 操作系统 - Windows 查看架构类型
运维·windows·笔记·学习·系统架构·运维开发·系统
金蕊泛流霞8 小时前
dify安装教程
笔记
小新同学^O^9 小时前
简单学习--> Selenium自动化测试
学习·selenium·测试工具
GEO从入门到精通10 小时前
2026年GEO课程的学习重点更新了吗?
人工智能·学习·seo·geo·aiseo·市场部
谙弆悕博士10 小时前
【附Python源码】基于决策树的信用卡欺诈检测实战
python·学习·算法·决策树·机器学习·数据分析·scikit-learn