位置: IT常识 - 正文

压缩gltf/glb模型踩坑与解决 three.js DRACOLoader(压缩模制)

编辑:rootadmin
压缩gltf/glb模型踩坑与解决 three.js DRACOLoader 前言

推荐整理分享压缩gltf/glb模型踩坑与解决 three.js DRACOLoader(压缩模制),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:压缩模制,模型压缩综述,压缩模设计,压缩模制,压缩模型怎么做,压缩模型怎么做,压缩模设计,模型压缩综述,内容如对您有帮助,希望把文章链接给更多的朋友!

使用前端three.js加载3d模型过程中,往往会出现模型大小过大导致前端加载时间过长,降低用户体验。 本文所记录的是笔者在使用gltf-pipeline压缩3d模型中踩坑DRACOLoader与解决的一个过程。

所采用的three库版本为 ^0.138.2

解决方案与介绍

通过gltf-pipeline可以大幅度压缩gltf/glb模型文件。

并且有如下的作用

将 glTF 转换为 glb(和反向)将缓冲区/纹理保存为嵌入或单独的文件将 glTF 1.0 模型转换为 glTF 2.0(使用KHR_techniques_webgl和KHR_blend扩展)应用Draco网格压缩安装npm install -g gltf-pipeline

或者

yarn global add gltf-pipeline常用压缩命令gltf-pipeline -i model.glb -o modelDraco.glb -d

使用 Draco 压缩网格 model.glb 文件,modelDraco.glb为压缩后输出文件名

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

压缩并编写单独的缓冲区、着色器和纹理。

在three.js中使用Draco压缩网格后的文件坑与解决过程

在多次百度之后写出的代码

let dracoLoader = new DRACOLoader();dracoLoader.setDecoderPath("path"); dracoLoader.preload();const loader = new GLTFLoader().setPath("path");loader.setDRACOLoader(dracoLoader);loader.load("modelName", (gltf) => { scene.addObject(gltf.scene); gltf = null;});压缩gltf/glb模型踩坑与解决 three.js DRACOLoader(压缩模制)

在这里我遇到了一个大坑:

Uncaught SyntaxError: Unexpected token '<'

解决:

在问题过程排查中,发现网络请求是请求了模型数据的

后续发现bolb:xxx的请求不是写的应用层所发出的 之后通过阅读DRACOLoader.js的源码得

网络请求中bolb:xxx请求是由第250行URL.createObjectURL所创建的,创建该请求需要

draco_decoder.jsdraco_wasm_wrapper.jsdraco_decoder.wasm

并且请求的路径是使用setDecoderPath方法所设定

后续查阅资料得到

draco_decoder.js— Emscripten 编译的解码器,与任何现代浏览器兼容。draco_decoder.wasm— WebAssembly 解码器,与较新的浏览器和设备兼容。draco_wasm_wrapper.js— WASM 解码器的 JavaScript 包装器。

在node_modules安装的包中获取three版本对应的draco路径为 node_modules\three\examples\js\libs

将改文件夹复制到public文件夹下并在DRACOLoader.setDecoderPath时候设置该对应路径即可

最后的解决代码与自己的封装import { DRACOLoader } from "three/examples/jsm/loaders/DRACOLoader";import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader.js";/** * * path:存放模型父路径 * modelName:模型名 * setCenter:是否居中 * scale:模型的缩放比设定 * position:模型的位置 * rotation:模型的局部旋转 */function loadModuleByDRACOLoader( path, modelName, setCenter, scale, position, rotation) { let scaleVec3, positionVec3; if (typeof scale == "number") { scaleVec3 = new THREE.Vector3(scale, scale, scale); } else { scaleVec3 = new THREE.Vector3(scale.x, scale.y, scale.z); } if (typeof position == "number") { positionVec3 = new THREE.Vector3(position, position, position); } else { positionVec3 = new THREE.Vector3(position.x, position.y, position.z); } let dracoLoader = new DRACOLoader(); dracoLoader.setDecoderPath("./moduler/draco/"); // 设置public下的解码路径,注意最后面的/ dracoLoader.setDecoderConfig({ type: "js" }); //使用兼容性强的draco_decoder.js解码器 dracoLoader.preload(); const loader = new GLTFLoader().setPath(path); loader.setDRACOLoader(dracoLoader); return new Promise((res, rj) => { loader.load(modelName, (gltf) => { if (setCenter) { gltf.scene.traverse(function(child) { if (setCenter && child.isMesh) { child.geometry.center(); } }); } gltf.scene.scale.copy(scaleVec3); gltf.scene.position.copy(positionVec3); if (rotation) { gltf.scene.rotation.copy(rotation); } scene.add(gltf.scene); res(gltf.scene); gltf = null; }); });}

调用

loadModuleByDRACOLoader('./moduler/', "grow4-processed.glb", false, 1, 0)结语

因为遇到这个坑之后没有找到对应的解决方法,所以写了该文章作为记录也给遇到相同问题的开发者避坑。

还有🎇🎇大三求内推🎇🎇

本文链接地址:https://www.jiuchutong.com/zhishi/283920.html 转载请保留说明!

上一篇:吃鸡显卡用GTX1060好还是RX580好?(吃鸡显卡推荐配置1060 5g)

下一篇:vue 中从后端获取到文件的 url 地址,前端根据 url 地址下载文件(vue怎么拿到后端数据)

  • 试玩游戏需要注意的技巧(试玩游戏需要注意哪些)

    试玩游戏需要注意的技巧(试玩游戏需要注意哪些)

  • 真我q3s怎么录屏(真我q3如何录屏)

    真我q3s怎么录屏(真我q3如何录屏)

  • 怎么把桌面文件放到D盘(怎么把桌面文件删除)

    怎么把桌面文件放到D盘(怎么把桌面文件删除)

  • 手机屏幕发黄是什么原因造成(手机屏幕发黄是什么问题)

    手机屏幕发黄是什么原因造成(手机屏幕发黄是什么问题)

  • 享换机多久打电话审核(享换机逾1天会爆通讯录吗)

    享换机多久打电话审核(享换机逾1天会爆通讯录吗)

  • 天猫超市生鲜怎么没了(天猫超市生鲜去哪了)

    天猫超市生鲜怎么没了(天猫超市生鲜去哪了)

  • 华为手机怎么在手机里面录屏(华为手机怎么在百度上下载软件)

    华为手机怎么在手机里面录屏(华为手机怎么在百度上下载软件)

  • 手机提示微信正在运行(手机提示微信正在使用融合卫星是什么意思)

    手机提示微信正在运行(手机提示微信正在使用融合卫星是什么意思)

  • iphone11前置广角怎么关(iphone11pro前置广角)

    iphone11前置广角怎么关(iphone11pro前置广角)

  • 手机摔多了会影响什么(手机摔多了会影响电池寿命吗)

    手机摔多了会影响什么(手机摔多了会影响电池寿命吗)

  • 电脑更新太慢怎么中断(电脑更新太慢怎么加快)

    电脑更新太慢怎么中断(电脑更新太慢怎么加快)

  • 小米手机如何开启热点共享(小米手机如何开机)

    小米手机如何开启热点共享(小米手机如何开机)

  • 朋友圈背景怎么不让别人看到(朋友圈背景怎么查看更换历史)

    朋友圈背景怎么不让别人看到(朋友圈背景怎么查看更换历史)

  • 苹果手机程序切换出来进去就重新开始(苹果手机程序切换暂停)

    苹果手机程序切换出来进去就重新开始(苹果手机程序切换暂停)

  • 笔记本gtx1050显卡3g够用吗

    笔记本gtx1050显卡3g够用吗

  • qq消息来了为什么没有显示不出来(qq消息来了为什么弹不出来)

    qq消息来了为什么没有显示不出来(qq消息来了为什么弹不出来)

  • 手机上应用宝是干啥用的(手机上应用宝是什么软件)

    手机上应用宝是干啥用的(手机上应用宝是什么软件)

  • vivos1支持闪充吗(vivos1手机支持闪充吗)

    vivos1支持闪充吗(vivos1手机支持闪充吗)

  • 无线充电器伤手机吗(无线充电 损伤)

    无线充电器伤手机吗(无线充电 损伤)

  • word2007链接到前一条页眉(word链接到前一节怎么是灰色)

    word2007链接到前一条页眉(word链接到前一节怎么是灰色)

  • 苹果11的屏幕和xr一样吗(苹果11的屏幕和xr的屏幕一样的嘛)

    苹果11的屏幕和xr一样吗(苹果11的屏幕和xr的屏幕一样的嘛)

  • 抖音怎么拍2个角色切换(抖音怎么拍个人视频)

    抖音怎么拍2个角色切换(抖音怎么拍个人视频)

  • 苹果x后台怎么关闭

    苹果x后台怎么关闭

  • airpods怎么看是一代还是二代(airpods怎么看是不是越南产的)

    airpods怎么看是一代还是二代(airpods怎么看是不是越南产的)

  • 骁龙855多少ghz(骁龙855多少hz)

    骁龙855多少ghz(骁龙855多少hz)

  • 荣耀20和20pro的区别(荣耀20跟20pro)

    荣耀20和20pro的区别(荣耀20跟20pro)

  • 怎么激活Win11正式版?Win11永久密钥分享 附激活工具+教程(w11如何激活)

    怎么激活Win11正式版?Win11永久密钥分享 附激活工具+教程(w11如何激活)

  • 系统的关闭事件跟踪程序(关闭系统的命令位于什么菜单中)

    系统的关闭事件跟踪程序(关闭系统的命令位于什么菜单中)

  • 简易征收怎样计提增值税
  • 仓储服务费税率2021
  • 网银转账与支票的区别
  • 一般纳税人外地预交税款怎么预缴
  • 税盘没有及时清卡
  • 经济利益的流入一定是收入吗
  • 无息贷款合同要按手印吗
  • 企业出现税务问题的案例
  • 公司茶水间有什么
  • 小规模纳税人变成一般纳税人之前的发票变更
  • 房地产企业可以抵扣进项税额的范围
  • 出口报关单上的运费和保费和实际不一致
  • 营改增是初次分配还是再分配
  • 产权转移书据印花税申报期限
  • 应纳税额计算举例
  • 增值税票查无此票是什么原因
  • 多计提的社保费,可否计入营业外收入
  • 暂估入库价格高于实际价格怎么调整
  • 维修材料费主要包括
  • 红字专用发票信息表编号在哪儿
  • 钱打到对公账户
  • 苹果iphone支持在哪
  • win 10动态锁是什么
  • 查看电脑开机时间记录win10
  • 减免税额科目有没有余额
  • nclaunch.exe - nclaunch进程有什么用 是什么意思
  • 劳动合同到期补偿金怎么算
  • 企业固定资产有哪些
  • 免征税费需要申报吗
  • 软件工程毕设题目冷门
  • 应付票据和应收票据的关系
  • 摊余成本计量的金融资产若溢价购买小于
  • yii2权威指南
  • php和mysql关系
  • JavaScript 30 JavaScript 日期格式
  • 数据挖掘和数据分析的区别与联系
  • php读取文件内容
  • 销售货款无法收到怎么办
  • unix命令大全详解
  • 房产税收特点有哪些
  • 劳务费发票怎么入账
  • 冲红怎么做会计科目
  • sql 临时表格
  • 企业进出口贸易
  • 公司申请破产后员工有赔偿吗
  • 企业管理费用科目期末一般是
  • 稳岗补贴算不算财政补贴
  • 差额增值税发票和全额增值税发票
  • 发票上的印记能去掉吗
  • 暂估入库的商品作暂估冲红会计分录
  • 银行付款明细
  • 企业购买商场的资本金要求是多少
  • 购买设备分期付款凭证怎么做
  • 周转材料应该计入什么科目
  • 代发工资入哪个科目
  • 劳务费无发票怎么处理
  • 进项税额不得从销项税额中抵扣项目是什么意思
  • 收到跨月的费用发票怎么入账
  • 企业支付宝要交税吗?
  • sqlserver2000数据库迁移到2008r2
  • docker untagged
  • win8右下角图标不见了
  • mac如何恢复到出厂系统版本
  • centos7.1
  • win10qq在哪里启动
  • win10怎么将任务栏图标从长条改成圆形
  • win7小技巧
  • python图论算法
  • CCProgressTimer 进度条动画在cocos2dx+lua中的使用
  • 在生成目录之前必须对相关文字设置样式
  • node.js中的http.response.write方法使用说明
  • linuxtop命令详解
  • 安卓view事件分发
  • python基本介绍
  • js中写html代码
  • jquery判断checkbox是否选中及改变checkbox状态的实现方法
  • python如何入门
  • 用于赞助的消费品需要缴纳消费税吗
  • 进口柴油消费税是多少
  • 福建 退休
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设