Three.js 快速入門教程【二十】3D模型加載優化實戰:使用gltf-pipeline與Draco對模型進行壓縮,提高加載速度和流暢性

請添加圖片描述

系列文章目錄

Three.js 快速入門教程【一】開啟你的 3D Web 開發之旅
Three.js 快速入門教程【二】透視投影相機
Three.js 快速入門教程【三】渲染器
Three.js 快速入門教程【四】三維坐標系
Three.js 快速入門教程【五】動畫渲染循環
Three.js 快速入門教程【六】相機控件 OrbitControls
Three.js 快速入門教程【七】常見幾何體類型
Three.js 快速入門教程【八】常見材質類型
Three.js 快速入門教程【九】光源類型
Three.js 快速入門教程【十】常見的紋理類型
Three.js 快速入門教程【十一】天空盒的多種實現方式
Three.js 快速入門教程【十二】外部模型加載
Three.js 快速入門教程【十三】外部模型加載后常見的處理操作
Three.js 快速入門教程【十四】使用Stats.js監控渲染幀率和性能優化
Three.js 快速入門教程【十五】交互神器DragControls使用詳解,實現對物體或模型拖拽
Three.js 快速入門教程【十六】調試神器 gui.js使用詳解,可視化面板控制場景參數提高開發效率
Three.js 快速入門教程【十七】射線拾取模型——射線與射線投射器Raycaster介紹
Three.js 快速入門教程【十八】射線拾取模型——鼠標點擊屏幕選中模型或物體
Three.js 快速入門教程【十九】CSS2D渲染器介紹,實現場景中物體或設備標注標簽信息
Three.js 快速入門教程【二十】3D模型加載優化實戰:使用gltf-pipeline與Draco對模型進行壓縮,提高加載速度和流暢性


文章目錄

  • 系列文章目錄
  • 一、前言
  • 二、三維模型優化背景與工具選型
  • 三、gltf-pipeline 介紹
    • 3.1 安裝
    • 3.2 基礎轉換
      • gltf 轉 glb
      • glb 轉 gltf
      • 單獨保存模型紋理
    • 3.3 Draco 網格壓縮
  • 四、性能優化對比
  • 五、Three.js項目中集成
  • 六、制作自動化腳本對模型進行壓縮
  • 七、總結


一、前言

??????在 Three.js 開發中,3D 模型的體積直接影響加載性能與用戶體驗。gltf/glb 格式雖已是行業標準,但高精度模型仍需進一步壓縮。本文將詳細介紹基于 gltf-pipeline 工具鏈結合 Draco 算法的模型壓縮方案,涵蓋工具使用、實際項目開發中的實踐,助你構建高性能 3D 應用。


二、三維模型優化背景與工具選型

在WebGL三維可視化項目中,glTF格式因其高效性和通用性已成為事實標準格式。但未經處理的模型常存在以下痛點:

  • 原始模型文件體積龐大(常見100MB+)

  • 網絡傳輸耗時影響用戶體驗

  • 瀏覽器解析壓力導致卡頓

為此,我們引入gltf-pipeline工具鏈,結合Google Draco壓縮算法,可達成:

  • 模型體積縮減70%-90%

  • 解析效率提升3-5倍

  • 完美兼容主流WebGL框架


三、gltf-pipeline 介紹

gltf-pipeline 是 Cesium 開發的基于 Node.js 的開源 gltf/glb 模型轉換工具。它提供了一系列功能,包括將 gltf 轉換為 glb(或反向轉換)、將緩沖區 / 紋理保存為嵌入文件或單獨文件、將 gltf 1.0 模型轉換為 gltf 2.0 以及應用 Draco 網格壓縮等

3.1 安裝

#全局安裝
npm install -g gltf - pipeline

3.2 基礎轉換

gltf 轉 glb

gltf-pipeline -i model.gltf -o model.glb

glb 轉 gltf

gltf-pipeline -i model.glb -o model.gltf

單獨保存模型紋理

gltf-pipeline -i model.glb -t

3.3 Draco 網格壓縮

基礎命令:

gltf-pipeline -i model.gltf -o modelDraco.gltf -d

這里會使用 Draco 對模型進行壓縮,并生成帶有KHR_draco_mesh_compression擴展的 gltf 文件。

基礎命令后面可加如下一些常用命令行參數

  • –draco.compressionLevel:Draco 壓縮級別(0 - 10)

    默認為 7,數值越大壓縮率越高,但可能會對模型的精度和視覺質量產生一定影響。0 表示最低壓縮級別(壓縮程度小,模型質量高),10 表示最高壓縮級別(壓縮程度大,可能損失一些細節)

  • –draco.quantizePositionBits:坐標精度(建議10-16),常用14(精度與體積平衡)

  • –draco.quantizeNormalBits:法線方向(建議8-10)(法線方向對精度要求較低)

  • –draco.quantizeTexcoordBits:紋理坐標(UV)(建議8-12)

示例:

gltf-pipeline -i input.gltf -o output.gltf   --draco.compressionLevel=10  --draco.quantizePositionBits=14 --draco.quantizeNormalBits=10 --draco.quantizeTexcoordBits=12

四、性能優化對比

測試模型數據:
在這里插入圖片描述


五、Three.js項目中集成

通過 gltf-pipeline+Draco 網格壓縮后的gltf(glb)模型如果直接加載會報錯,需要通過draco模型解碼器解碼才能正常顯示。

下面以腳手架項目為例:

import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader.js";
import { DRACOLoader } from "three/examples/jsm/loaders/DRACOLoader";import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js';
import { DRACOLoader } from 'three/addons/loaders/DRACOLoader.js';const dracoLoader = new DRACOLoader();
dracoLoader.setDecoderPath('./libs/draco/');//設置draco模型解碼器路徑,根據實際情況修改路徑
dracoLoader.setDecoderConfig({ type: 'js' }); //使用兼容性強的draco_decoder.js解碼器,兼容舊瀏覽器
dracoLoader.preload();const loader = new GLTFLoader();
loader.setDRACOLoader(dracoLoader);//設置draco模型加載器//加載模型
loader.load('model.glb', (gltf) => {scene.add(gltf.scene);
}, undefined, (error) => {console.error('DRACO解碼失敗:', error);
});

把draco模型解碼器文件拷貝到public文件夾下:

在node_modules依賴中找到three\examples\jsm\libs\draco 把draco 文件夾拷貝到public下新建的libs文件夾下

在這里插入圖片描述

在這里插入圖片描述

解碼器文件放置路徑隨意,只要保證dracoLoader.setDecoderPath(‘./libs/draco/’)入參路徑找得到就行了。


六、制作自動化腳本對模型進行壓縮

每次壓縮模型需要輸入那串長命令顯得特別繁瑣,我們可以制作bat腳本實現自動化壓縮:
新建一個txt文件改名為draco.bat,用編輯器打開寫入(參數值可以按需修改):

@echo off
cd %~dp0
echo 正在壓縮,請耐心等待...npx gltf-pipeline -i input.gltf -o output.gltf   --draco.compressionLevel=10  --draco.quantizePositionBits=14 --draco.quantizeNormalBits=10 --draco.quantizeTexcoordBits=12
echo 命令執行完成
pause

在同級目錄放置未壓縮的模型input.gltf

雙擊draco.bat,進行壓縮,壓縮成功在同級目錄生成output.gltf文件

請添加圖片描述
ps:演示動態圖以glb格式為例。

注意:
自動化腳本需要用到npx,如果你電腦npm 5.2.0 及以上版本,就已經自帶npx了,無需單獨安裝。
若你的 npm 版本低于 5.2.0,你可以通過更新 npm 來安裝npx,命令如下:

npm install -g npm@latest

七、總結

??????? gltf-pipeline 工具鏈結合 Draco 算法的模型壓縮方案是非常實用的模型壓縮方案。gltf - pipeline 提供了便捷的命令行工具和編程接口,方便對 gltf/glb 模型進行各種處理,包括 Draco 壓縮。在實際應用中,可以根據具體需求選擇合適的命令行參數對模型進行壓縮,以優化 3D 模型的存儲、傳輸和加載性能,為用戶提供更好的體驗。

更多three.js入門知識點請關注該系列教程后續的更新。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/899378.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/899378.shtml
英文地址,請注明出處:http://en.pswp.cn/news/899378.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

前端框架入門:Angular

Angular 是由 Google 維護的前端框架,適用于構建單頁應用(SPA)。它使用TypeScript 作為主要開發語言,并提供了強大的模塊化、依賴注入(DI)、路由管理等特性。 一、Angular 基礎 1. Angular 介紹 Angular 是一個組件化、模塊化、雙向數據綁定的前端框架,適用于構建復雜…

基于51單片機的速度檢測報警器proteus仿真

地址: https://pan.baidu.com/s/1I7roZEjrk349Is_YdMcsxQ 提取碼:1234 仿真圖: 芯片/模塊的特點: AT89C52/AT89C51簡介: AT89C51 是一款常用的 8 位單片機,由 Atmel 公司(現已被 Microchip 收…

具身系列——Diffusion Policy算法實現CartPole游戲

代碼原理分析 1. 核心思想 該代碼實現了一個基于擴散模型(Diffusion Model)的強化學習策略網絡。擴散模型通過逐步去噪過程生成動作,核心思想是: ? 前向過程:通過T步逐漸將專家動作添加高斯噪聲,最終變成…

DeepSeek 本地化部署教程

1 概述 1.1 配置參考圖 科普: B,Billion(十億),是 “參數量” 的單位。 模型量超過 一億,可稱之為 “大模型”。 2 軟件安裝 2.1 下載 Ollama 官方主頁:https://ollama.com/download主頁截圖…

matlab打開兩個工程

1、問題描述 寫代碼時,需要實時參考別人的代碼,需要同時打開2個模型,當模型在同一個工程內時,這是可以直接打開的,如圖所示 2、解決方案 再打開一個MATLAB主窗口 這個時候就可以同時打開多個模型了 3、正確的打開方…

mac 下配置flutter 總是失敗,請參考文章重新配置flutter 環境MacOS Flutter環境配置和安裝

一、安裝和運行Flutter的系統環境要求 想要安裝并運行 Flutter,你的開發環境需要最低滿足以下要求: 操作系統:macOS磁盤空間:2.8 GB(不包括IDE/tools的磁盤空間)。工具:Flutter使用git進行安裝和升級。我們建議安裝Xcode,其中包括git&#x…

第4.1節:使用正則表達式

1 第4.1節:使用正則表達式 將正則表達式用斜杠括起來,就能用作模式。隨后,該正則表達式會與每條輸入記錄的完整文本進行比對。(通常情況下,它只需匹配文本的部分內容就能視作匹配成功。)例如,以…

Java 代理(一) 靜態代理

學習代理的設計模式的時候,經常碰到的一個經典場景就是想統計某個方法的執行時間。 1 靜態代理模式的產生 需求1. 統計方法執行時間 統計方法執行時間,在很多API/性能監控中都有這個需求。 下面以簡單的計算器為例子,計算加法耗時。代碼如下…

每日總結3.28

藍橋刷題 3227 找到最多的數 方法一&#xff1a;摩爾投票法 #include <bits/stdc.h> using namespace std; #define int long long signed main() { int n,m; cin>>n>>m; int a[m*n]; for(int i0;i<n*m;i) { cin>>a[i]; } int cand…

Flutter快速搭建聊天

之前項目中使用的環信聊天&#xff0c;我們的App使用的Flutter開發的 。 所以&#xff0c;就使用的 em_chat_uikit &#xff0c;這個是環信開發的Flutter版本的聊天。 一開始&#xff0c;我們也用的環信的聊天&#xff0c;是收費的&#xff0c;但是&#xff0c;后面就發現&…

Sa-Token

簡介 Sa-Token 是一個輕量級 Java 權限認證框架&#xff0c;主要解決&#xff1a;登錄認證、權限認證、單點登錄、OAuth2.0、分布式Session會話、微服務網關鑒權 等一系列權限相關問題。 官方文檔 常見功能 登錄認證 本框架 用戶提交 name password 參數&#xff0c;調用登…

基于javaweb的SSM航班機票預訂平臺系統設計與實現(源碼+文檔+部署講解)

技術范圍&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬蟲、數據可視化、小程序、安卓app、大數據、物聯網、機器學習等設計與開發。 主要內容&#xff1a;免費功能設計、開題報告、任務書、中期檢查PPT、系統功能實現、代碼編寫、論文編寫和輔導、論…

格雷碼、漢明碼,CRC校驗的區別

格雷碼、漢明碼和CRC校驗都是用于數據傳輸和存儲中的編碼技術。 它們在原理、功能和應用場景上存在顯著區別。 1.格雷碼&#xff08;Gray Code&#xff09; ? 定義&#xff1a;格雷碼是一種特殊的二進制編碼&#xff0c;任意兩個相鄰的碼字之間僅有一位不同。 ? 功能&#x…

【報錯】 /root/anaconda3/conda.exe: cannot execute binary file: Exec format error

背景: 安裝Anaconda3 bash Anaconda3-****-Linux-x86_64.sh 報錯: /root/anaconda3/conda.exe: cannot execute binary file: Exec format error 原因分析: 安裝包(如

JAVA實現動態IP黑名單過濾

一些惡意用戶(可能是黑客、爬蟲、DDoS 攻擊者)可能頻繁請求服務器資源&#xff0c;導致資源占用過高。因此需要一定的手段實時阻止可疑或惡意的用戶&#xff0c;減少攻擊風險。 通過 IP 封禁&#xff0c;可以有效拉黑攻擊者&#xff0c;防止資源被濫用&#xff0c;保障合法用戶…

開源的CMS建站系統可以隨便用嗎?有什么需要注意的?

開源CMS建站系統雖然具有許多優點&#xff0c;但并非完全“隨便用”。無論選哪個CMS系統&#xff0c;大家在使用的時候&#xff0c;可以盡可能地多注意以下幾點&#xff1a; 1、版權問題 了解開源許可證&#xff1a;不同的開源CMS系統采用不同的開源許可證&#xff0c;如GPL、…

故障識別 | 基于改進螂優化算法(MSADBO)優化變分模態提取(VME)結合稀疏最大諧波噪聲比解卷積(SMHD)進行故障診斷識別,matlab代碼

基于改進螂優化算法&#xff08;MSADBO&#xff09;優化變分模態提取&#xff08;VME&#xff09;結合稀疏最大諧波噪聲比解卷積&#xff08;SMHD&#xff09;進行故障診斷識別 一、引言 1.1 機械故障診斷的背景和意義 在工業生產的宏大畫卷中&#xff0c;機械設備的穩定運行…

探究 CSS 如何在HTML中工作

2025/3/28 向全棧工程師邁進&#xff01; 一、CSS的作用 簡單一句話——美化網頁 <p>Lets use:<span>Cascading</span><span>Style</span><span>Sheets</span> </p> 對于如上代碼來說&#xff0c;其顯示效果如下&#xff1…

硬件老化測試方案的設計誤區

硬件老化測試方案設計中的常見誤區主要包括測試周期不足、測試條件過于單一、樣品選擇不當等方面。其中&#xff0c;測試周期不足尤為突出&#xff0c;容易導致潛在缺陷未被完全暴露。老化測試本質上是通過加速產品老化來模擬長期使用狀況&#xff0c;因此測試周期不足會嚴重削…

無錫零碳園區“三年突圍”安科瑞源網荷儲充系統如何破解“綠電難、儲能貴、調度亂”困局?

零碳園區建設如火如荼&#xff0c;為何企業“不敢投、不會用”&#xff1f; 無錫市政府3月27日發布《零碳園區建設三年行動方案》&#xff0c;目標到2027年建成10家以上零碳園區、20家零碳工廠、10個源網荷儲一體化項目。但企業仍存疑慮&#xff1a; 綠電消納難&#xff1a;光…