【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.pswp.cn/bicheng/72753.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/72753.shtml
英文地址,請注明出處:http://en.pswp.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. …