【ThreeJS Basics 09】Debug

文章目录

  • 简介
  • 从 dat.GUI 到 lil-gui
  • 例子
  • 安装 lil-gui 并实例化
  • 不同类型的调整
    • 改变位置
    • 针对非属性的调整
    • 复选框
    • 颜色
  • 功能/按钮
  • 调整几何形状
  • 文件夹
  • 调整 GUI
    • 宽度
    • 标题
    • 关闭文件夹
    • 隐藏
    • 按键切换
  • 结论


简介

每一个创意项目的一个基本方面是能够轻松调整。开发人员和参与项目的其他参与者(如设计师甚至客户)必须能够更改尽可能多的参数。

您必须考虑到这一点,以便他们找到完美的颜色、速度、数量等,获得最佳体验。您甚至可能会得到意想不到的很棒的结果。

首先,我们需要一个调试 UI。

虽然您可以使用 HTML / CSS / JS 创建自己的调试 UI,但已经有多个库:

  • dat.GUI
  • lil-gui
  • control-panel
  • ControlKit
  • Uil
  • Tweakpane
  • Guify
  • Oui

所有这些库都可以做我们想做的事,但我们将使用lil-gui,因为它很流行、维护良好、并且易于使用

从 dat.GUI 到 lil-gui

最初,Three.js 练习都是使用 dat.GUI

一段时间以来,这个库一直没有更新,NPM 在安装它时开始触发漏洞警告。这些漏洞已经修复,但替代方案已经开始出现,这就是 lil-gui 作为 dat.GUI 的替代品越来越受欢迎的原因。额外的好处是它甚至有更好的功能。

所有 Three.js 练习现在都使用 lil-gui

顺便说一下,GUI 代表图形用户界面。

例子

https://bruno-simon.com/#debug

安装 lil-gui 并实例化

npm i lil-gui

引入并使用

import GUI from 'lil-gui'/*** Debug*/
const gui = new GUI()

不同类型的调整

  • 范围— 针对具有最小值和最大值的数字
  • 颜色— 适用于各种格式的颜色
  • 文本— 用于简单文本
  • 复选框— 用于布尔值(true或false)
  • 选择— 从值列表中进行选择
  • 按钮——触发功能

改变位置

const mesh = new THREE.Mesh(geometry, material)
scene.add(mesh)gui.add(mesh.position, 'y')

we

或者写一个范围,这样 ui 就会变成一个滑杆

gui.add(mesh.position, 'y', - 3, 3, 0.01)

在这里插入图片描述

也可以使用链式调用

gui.add(mesh.position, 'y').min(- 3).max(3).step(0.01)

针对非属性的调整

这里需要注意的一点是 lil-gui 只能修改属性。如果你想更新变量,则不能:

let myVariable = 1337
gui.add(myVariable, '???')

但是您可以使用一些技巧来实现这一点,例如创建一个对象,其目的是保存 lil-gui 在该对象上使用的属性:

const myObject = {myVariable: 1337
}
gui.add(myObject, 'myVariable')

复选框

lil-gui 会自动检测你想要调整的属性类型,并使用相应的接口。Object3D visible 的属性就是一个很好的例子。它是一个布尔值,如果,false 则会隐藏对象:

gui.add(mesh, 'visible')

颜色

处理颜色有点麻烦。让我们尝试修改 color 的属性 material

需要通过回调函数里的 value 来设置值, GUI 上的 hex 并不是最终的值

你最终得到了错误的颜色:

这是因为 Three.js 应用了一些颜色管理来优化渲染。因此,调整中显示的颜色值与内部使用的值不同。

我们现在不讨论色彩管理, 有两种方法可以解决这个问题。

gui.addColor(material, 'color')

需要通过回调函数来覆盖掉 ui 上显示的值

debugObject.color = '#3a6ea6'const geometry = new THREE.BoxGeometry(1, 1, 1, 2, 2, 2)
const material = new THREE.MeshBasicMaterial({ color: debugObject.color, wireframe: false })cubeTweaks.addColor(debugObject, 'color').onChange(() =>{material.color.set(debugObject.color)})

功能/按钮

有时,我们只想按需触发指令。现在,当我们点击调试 UI 中的某个位置时,我们希望让立方体执行一点旋转动画。

我们可以通过向包含函数的 tweak 发送一个属性来实现这一点。不幸的是,这意味着我们不能让一个函数像这样独立存在,然后将其发送给 lil-gui

const myFunction = () => {console.log('do something')
}
gui.add(myFunction, '???')

但是我们可以为我们之前创建的对象添加一个spin属性debugObject,并将 GSAP 动画集成到其中:

debugObject.spin = () =>
{gsap.to(mesh.rotation, { duration: 1, y: mesh.rotation.y + Math.PI * 2 })
}

最后,我们可以将调整添加到 debugObject.spin

debugObject.spin = () =>
{// ...
}
gui.add(debugObject, 'spin')

在这里插入图片描述

调整几何形状

gui.add(debugObject, 'subdivision').min(1).max(20).step(1).onChange(() =>{console.log('subdivision changed')})

对于 CPU 来说,构建几何图形可能是一个相当漫长的过程。现在,我们正在监听更改事件,如果用户过多地拖放范围调整,则可能会多次触发该事件。

onChange我们不会使用 ,而是使用onFinishChange,它仅当我们停止调整值时才会触发:

gui.add(debugObject, 'subdivision').min(1).max(20).step(1).onFinishChange(() =>{console.log('subdivision finished changing')})

除此之外console.log(),我们还可以使用 构建一个新的几何体,并通过将其分配给其属性来debugObject.subdivision将其与 关联:meshgeometry

gui.add(debugObject, 'subdivision').min(1).max(20).step(1).onFinishChange(() =>{mesh.geometry = new THREE.BoxGeometry(1, 1, 1,debugObject.subdivision, debugObject.subdivision, debugObject.subdivision)})

就是这样,但我们犯了一个小错误。旧几何图形仍位于 GPU 内存中的某个位置,这可能会导致内存泄漏。

dispose()为了解决这个问题,我们可以在创建新的几何图形之前在旧几何图形上调用该方法:

gui.add(debugObject, 'subdivision').min(1).max(20).step(1).onFinishChange(() =>{mesh.geometry.dispose()mesh.geometry = new THREE.BoxGeometry(1, 1, 1,debugObject.subdivision, debugObject.subdivision, debugObject.subdivision)})

文件夹

假设我们有很多调整,调试 UI 开始变得拥挤。我们可以使用此addFolder()方法将它们分成文件夹。

要创建文件夹,请调用addFolder()并发送您想要的名称作为参数。请确保在调整之前执行此操作并将其保存为cubeTweaks:

const cubeTweaks = gui.addFolder('Awesome cube')

然后,不要使用gui来创建调整,而是使用cubeTweaks变量:

const cubeTweaks = gui.addFolder('Awesome cube')cubeTweaks.add(mesh.position, 'y')// ...cubeTweaks.add(mesh, 'visible')cubeTweaks.add(material, 'wireframe')cubeTweaks.addColor(material, 'color')// ...// ...
cubeTweaks.add(debugObject, 'spin')// ...
cubeTweaks.add(debugObject, 'subdivision')// ...

可以默认

const cubeTweaks = gui.addFolder('Awesome cube')
cubeTweaks.close()

调整 GUI

宽度

const gui = new GUI({width: 300
})

标题

const gui = new GUI({width: 300,title: 'Nice debug UI'
})

关闭文件夹

const gui = new GUI({width: 300,title: 'Nice debug UI',closeFolders: true
})

隐藏

const gui = new GUI({width: 300,title: 'Nice debug UI',closeFolders: false,
})
// gui.close()
gui.hide()

按键切换

window.addEventListener('keydown', (event) =>
{if(event.key == 'h')gui.show(gui._hidden)
})

结论

随着你的 项目的进行,来添加各种各样的 gui 参数

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

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

相关文章

【Pandas】pandas Series explode

Pandas2.2 Series Computations descriptive stats 方法描述Series.argsort([axis, kind, order, stable])用于返回 Series 中元素排序后的索引位置的方法Series.argmin([axis, skipna])用于返回 Series 中最小值索引位置的方法Series.argmax([axis, skipna])用于返回 Series…

电脑网络出现问题!简单的几种方法解除电脑飞行模式

在某些情况下,您可能需要关闭电脑上的飞行模式以便重新连接到 Wi-Fi、蓝牙或其他无线网络。本教程中简鹿办公将指导您如何在 Windows 和 macO S操作系统上解除飞行模式。 一、Windows 系统下解除飞行模式 通过快捷操作中心 步骤一:点击屏幕右下角的通知…

nature genetics | SCENT:单细胞多模态数据揭示组织特异性增强子基因图谱,并可识别致病等位基因

–https://doi.org/10.1038/s41588-024-01682-1 Tissue-specific enhancer–gene maps from multimodal single-cell data identify causal disease alleles 研究团队和单位 Alkes L. Price–Broad Institute of MIT and Harvard Soumya Raychaudhuri–Harvard Medical S…

MyBatis-Plus 与 Spring Boot 的最佳实践

在现代 Java 开发中,MyBatis-Plus 和 Spring Boot 的结合已经成为了一种非常流行的技术栈。MyBatis-Plus 是 MyBatis 的增强工具,提供了许多便捷的功能,而 Spring Boot 则简化了 Spring 应用的开发流程。本文将探讨如何将 MyBatis-Plus 与 Spring Boot 进行整合,并分享一些…

uploadlabs通关思路

目录 靶场准备 复现 pass-01 代码审计 执行逻辑 文件上传 方法一:直接修改或删除js脚本 方法二:修改文件后缀 pass-02 代码审计 文件上传 1. 思路 2. 实操 pass-03 代码审计 过程: 文件上传 pass-04 代码审计 文件上传 p…

AI编程工具节选

1、文心快码 百度基于文心大模型推出的一款智能编码助手, 官网地址:文心快码(Baidu Comate)更懂你的智能代码助手 2、通义灵码 阿里云出品的一款基于通义大模型的智能编码辅助工具, 官网地址:通义灵码_你的智能编码助手-阿里云 …

目录扫描工具深度对比:Dirb、Dirsearch、DirBuster、Feroxbuster 与 Gobuster

✨ 前言 在网络安全测试与渗透测试中,目录扫描(又称目录枚举)是一项至关重要的技术。它用于发现 Web 服务器上未公开的隐藏目录和文件,这些资源可能包含敏感数据、配置文件甚至潜在漏洞,因而成为攻击者与安全研究人员…

“双碳”背景下,企业应该如何提升能源效率?

在当今竞争激烈的市场环境中,企业不仅需要优化成本,还需积极响应国家的能源政策,减少对环境的影响。提升工业能源效率正是实现这一双重目标的关键。中国近年来大力推进“双碳”目标(碳达峰、碳中和),并出台…

无人机扩频技术对比!

一、技术原理与核心差异 FHSS(跳频扩频) 核心原理:通过伪随机序列控制载波频率在多个频点上快速跳变,收发双方需同步跳频序列。信号在某一时刻仅占用窄带频谱,但整体覆盖宽频带。 技术特点: 抗干扰…

当AI开始“思考“:拆解大模型训练与推理的秘密(以DeepSeek为例)

如果你用过deepseek,可能体验过它在几秒内编故事、写代码的震撼。但你是否想过,这种"智能输出"背后存在两种完全不同的底层机制?就像人类需要先学习知识(训练)才能考试答题(推理)&…

永洪科技深度分析实战,零售企业的销量预测

随着人工智能技术的不断发展,智能预测已经成为各个领域的重要应用之一。现在,智能预测技术已经广泛应用于金融、零售、医疗、能源等领域,为企业和个人提供决策支持。 智能预测技术通过分析大量的数据,利用机器学习和深度学习算法…

Vue项目通过内嵌iframe访问另一个vue页面,获取token适配后端鉴权(以内嵌若依项目举例)

1. 改造子Vue项目进行适配(ruoyi举例) (1) 在路由文件添加需要被外链的vue页面配置 // 若依项目的话是 router/index.js文件 {path: /contrast,component: () > import(/views/contrast/index),hidden: true },(2) 开放白名单 // 若依项目的话是 permission.js 文件 cons…

【DeepSeek】5分钟快速实现本地化部署教程

一、快捷部署 (1)下载ds大模型安装助手,下载后直接点击快速安装即可。 https://file-cdn-deepseek.fanqiesoft.cn/deepseek/deepseek_28348_st.exe (2)打开软件,点击立即激活 (3)选…

Linux第一课

如何在Windows系统上安装红帽Linux虚拟机 一:下载VNware 下载链接:Desktop Hypervisor Solutions | VMware 二:下载操作系统镜像文件 在阿里云开源镜像站下载(本文章下载 red hat 9.3) 阿里云开源镜像站链接:阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区 三:创建虚拟机文…

语音分离:使用短时能量提取主声源

语音分离模型:mossfomer2 计算短时能量 def compute_short_time_energy(audio: np.ndarray, frame_size: int, hop_size: int) -> np.ndarray:"""计算音频信号的短时能量 将音频分为若干帧,每一帧长度为 frame_size, 帧与帧之间以 h…

【VUE】第二期——生命周期及工程化

目录 1 生命周期 1.1 介绍 1.2 钩子 2 可视化图表库 3 脚手架Vue CLI 3.1 使用步骤 3.2 项目目录介绍 3.3 main.js入口文件代码介绍 4 组件化开发 4.1 组件 4.2 普通组件注册 4.2.1 局部注册 4.2.2 全局注册 1 生命周期 1.1 介绍 Vue生命周期:就是…

SyntaxError: Unexpected keyword ‘else‘

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》 🍚 蓝桥云课签约作者、…

Spring Boot静态资源访问顺序

在 Spring Boot 中,static 和 public 目录都用于存放静态资源(如 HTML、CSS、JavaScript、图片等文件),但它们在使用上有一些细微的区别。以下是它们的详细对比: 1. 默认优先级 Spring Boot 会按照以下优先级加载静态…

windows 平台如何点击网页上的url ,会打开远程桌面连接服务器

你可以使用自定义协议方案(Protocol Scheme)实现网页上点击URL后自动启动远程桌面连接(mstsc),参考你提供的C代码思路,如下实现: 第一步:注册自定义协议 使用类似openmstsc://协议…

UniApp 运行的微信小程序如何进行深度优化

UniApp 运行的微信小程序如何进行深度优化 目录 引言性能优化 1. 减少包体积2. 优化页面加载速度3. 减少 setData 调用4. 使用分包加载 代码优化 1. 减少不必要的代码2. 使用条件编译3. 优化图片资源 用户体验优化 1. 优化交互体验2. 预加载数据3. 使用骨架屏 调试与监控 1. …