three.js的调试面板工具

通过可视化页面来进行3D的参数调试,如果手动的修改都动参数的话,会很繁琐,dat.gui是通过可视化的面板,来实时调整这些参数。如下图:

使用:

安装依赖

复制代码
npm install dat.gui
//如果是ts开发,需要安装一下类似声明
npm install @types/dat.gui

基本使用:

复制代码
import * as dat from "dat.gui"


// 创建一个几何对象
const geometry = new THREE.BoxGeometry(1, 1, 1);
const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 });
const mesh = new THREE.Mesh(geometry, material);
scene.add(mesh);

// 创建 GUI 对象
const gui = new dat.GUI();

// 创建控制面板
const cubeFolder = gui.addFolder("立方体");


// 添加位置控制
cubeFolder.add(mesh.position, "x", -5, 5).name("X 位置");
cubeFolder.add(mesh.position, "y", -5, 5).name("Y 位置");
cubeFolder.add(mesh.position, "z", -5, 5).name("Z 位置");

// 添加缩放控制
cubeFolder.add(mesh.scale, "x", 0.1, 5).name("X 缩放");
cubeFolder.add(mesh.scale, "y", 0.1, 5).name("Y 缩放");
cubeFolder.add(mesh.scale, "z", 0.1, 5).name("Z 缩放");

// 添加角度和颜色控制参数
const params = {
  rotationX: 0,
  rotationY: 0,
  rotationZ: 0,
  color: "#00ff00",
};

// 添加旋转控制(使用角度)
cubeFolder
  .add(params, "rotationX", 0, 180)
  .name("X 旋转(度)")
  .onChange(value => {
    mesh.rotation.x = THREE.MathUtils.degToRad(value);
  });
cubeFolder
  .add(params, "rotationY", 0, 180)
  .name("Y 旋转(度)")
  .onChange(value => {
    mesh.rotation.y = THREE.MathUtils.degToRad(value);
  });
cubeFolder
  .add(params, "rotationZ", 0, 180)
  .name("Z 旋转(度)")
  .onChange(value => {
    mesh.rotation.z = THREE.MathUtils.degToRad(value);
  });

// 添加颜色控制
cubeFolder.addColor(params, "color").name("颜色").onChange(value => {
	material.color.set(value);
});

// 默认展开文件夹
cubeFolder.open();

// 渲染循环
function animate() {
  requestAnimationFrame(animate);
  // 为了方便操作,这里注释掉更新旋转的代码
  // mesh.rotation.x += 0.01;
  // mesh.rotation.y += 0.01;
  controls.update();
  renderer.render(scene, camera);
}

注意:

gui.add(target, 'prop', min, max) 的契约极其朴素:它读 target[prop] 当初值,滑动时执行 target[prop] = v。

position和scale的设置可以直接将mesh的position和scale对象传入。但是rotation和color的设置却不能直接传入mesh的rotation和color。

target.rotation的参数值单位是弧度,所以我们在转换度数的时候还需要进行计算,很复杂;所以通过THREE.MathUtils.degToRad(value)可以将度数进行转换成我们需要的值即可。

material.color 是 THREE.Color 对象,内部存的是三个 0~1 的浮点 r/g/b;而 addColor 给你的是 "#00ff00" 这种字符串。material.color.set(value) 所以需要通过set来进行解析成r/g/b。

相关推荐
怕浪猫1 小时前
12个UI组件库,Star最低的下载最多
前端·javascript·面试
溪语流沙1 小时前
【Web全栈进阶】Vue3起步:组件、模板语法、响应式数据
前端·javascript·vue.js·css3
众链网络1 小时前
Agent 重试的工程解法:幂等、断点续跑与熔断怎么落地
java·前端·数据库·人工智能
User_芊芊君子1 小时前
JiuwenSwarm 协同智能体落地金融投研全流程:SwarmFlow 工作流编排与人机交互面板实测(A2UI v0.8 Web 通道适配)
前端·金融·人机交互
程序员大阳2 小时前
副队长CSS教程(37)–transition 过渡
前端·css·transition·过渡
ZoeLandia2 小时前
TypeScript 01:类型注解与类型推断
前端·javascript·typescript
踩蚂蚁2 小时前
从“打开灯光”看 KWS 多关键词语音控制是怎么工作的
前端
ppiero2 小时前
AI 助手聊着聊着就失忆?先分清"上下文"和"记忆"(五步装长期记忆)
前端
打呵欠的猫2 小时前
用 AI 做性能分析:一行命令找出拖慢页面的 5 个组件,优化后首屏快了 40%
前端·性能优化·ai编程