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.mzph.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;光…