位置: 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怎么拿到后端数据)

  • 荣耀v30有没有红外线(荣耀v30有红外线吗)

    荣耀v30有没有红外线(荣耀v30有红外线吗)

  • 耳机有回声该怎样处理(耳机有回声该怎么处理)

    耳机有回声该怎样处理(耳机有回声该怎么处理)

  • 手机无线投屏连接了电视不显示(手机无线投屏连接不上电脑)

    手机无线投屏连接了电视不显示(手机无线投屏连接不上电脑)

  • 手机皮肤设置在哪里(手机皮肤在哪里设置方法)

    手机皮肤设置在哪里(手机皮肤在哪里设置方法)

  • 荣耀v30pro支持90hz吗(荣耀V30Pro支持HDMI视频)

    荣耀v30pro支持90hz吗(荣耀V30Pro支持HDMI视频)

  • 苹果id退款会影响什么(苹果id退过款还能退吗)

    苹果id退款会影响什么(苹果id退过款还能退吗)

  • 硬盘3f0什么意思(硬盘-3f0)

    硬盘3f0什么意思(硬盘-3f0)

  • 淘宝授权商家填写运单号是什么意思(淘宝授权商家填写运单号)

    淘宝授权商家填写运单号是什么意思(淘宝授权商家填写运单号)

  • 苹果手机乐教乐学闪退怎么办(苹果手机乐教乐学下载不了怎么办)

    苹果手机乐教乐学闪退怎么办(苹果手机乐教乐学下载不了怎么办)

  • 无边距打印和有边距打印的区别(无边距打印和有边框区别)

    无边距打印和有边距打印的区别(无边距打印和有边框区别)

  • opporeno2和renoz的区别(opporeno2和opporenoz哪个好)

    opporeno2和renoz的区别(opporeno2和opporenoz哪个好)

  • 华为悬浮球如何自定义(华为悬浮球如何关闭)

    华为悬浮球如何自定义(华为悬浮球如何关闭)

  • 开悬浮窗有什么用(开悬浮窗有什么坏处)

    开悬浮窗有什么用(开悬浮窗有什么坏处)

  • 怎么用手机打印图片(怎么用手机打印微信里的文件)

    怎么用手机打印图片(怎么用手机打印微信里的文件)

  • 横屏模式是什么意思(横屏功能)

    横屏模式是什么意思(横屏功能)

  • 苹果11自带的天气(苹果11自带的天气预报是什么软件)

    苹果11自带的天气(苹果11自带的天气预报是什么软件)

  • 连接路由器后无法上网(连接路由器后无网络访问权限)

    连接路由器后无法上网(连接路由器后无网络访问权限)

  • iphone11自拍镜像怎么关(iphone11自拍镜像怎么设置)

    iphone11自拍镜像怎么关(iphone11自拍镜像怎么设置)

  • 苹果x跟11一样大吗(苹果x的大小和苹果11的大小一样吗)

    苹果x跟11一样大吗(苹果x的大小和苹果11的大小一样吗)

  • 144对显卡要求(144吃显卡吗)

    144对显卡要求(144吃显卡吗)

  • 喜马拉雅有文字版的吗(喜马拉雅有文字转语音吗)

    喜马拉雅有文字版的吗(喜马拉雅有文字转语音吗)

  • 笔记本适配器坏了症状(笔记本适配器坏了怎么修)

    笔记本适配器坏了症状(笔记本适配器坏了怎么修)

  • 龙江人社注册网络异常(龙江人社注册网站官网)

    龙江人社注册网络异常(龙江人社注册网站官网)

  • 无需物流发货什么意思(无需物流发货会有什么处罚)

    无需物流发货什么意思(无需物流发货会有什么处罚)

  • soul查看访客记录(soul访客)

    soul查看访客记录(soul访客)

  • 工资表怎么导入个税系统计算个税
  • 消费税入哪个科目
  • 个人劳务费怎么交税
  • 交强险怎么报销流程
  • 向个体工商户付款可以现金支付吗
  • 增值税申报表中应税货物销售额
  • 公司期权激励如何兑现
  • 退回的附加税能退回来吗
  • 民非企业附加税入什么科目
  • 房地产企业印花税税目
  • 防伪税控系统中的设备包括哪些
  • 土地使用权的账面价值计入在建工程
  • 业务招待费的扣除标准是什么2022
  • 企业贷款核销条件
  • 短期借款的会计凭证
  • 售楼部垃圾桶
  • 企业自行出版的报刊费用可否认证抵扣?
  • 收到专票未抵扣,销售方作废怎么处理
  • 增值税扣款凭证包括
  • 公司发票限额按什么计算
  • 写着个人的发票能下账吗
  • 企业的业务招待费多了好还是少了好
  • 加工费月底需要全部结转吗
  • 长期待摊会计处理
  • 和别人合作投资后悔了怎么说
  • 四川中级会计报名需要上传哪些资料
  • 收不回工程款的心情
  • 小规模固定资产一次性扣除
  • 公司做贷款
  • 资产无偿调拨账务处理
  • 预提成本的会计处理
  • 如何清除上网记录?
  • 当月收到服务成本票下个月才开出发票
  • 咨询服务费怎么报印花税
  • seti@home.exe - seti@home是什么进程 有什么用
  • 京东最贵的商品排行
  • php最好的编程语言
  • php数组的类型有哪些
  • 应交税金的会计科目
  • php代码大全及其含义
  • 斯洛文尼亚nba球星是谁
  • 交易性金融资产的入账价值
  • 进口设备增值税计算
  • 挂靠车辆进项税额是否可以抵扣
  • 入库单如何做账分录
  • 零税率与免税有何区别
  • 金蝶专业版如何打印凭证
  • 政府补助分类有几种
  • 给客户的客户开普票算不算虚开
  • 个人承担的个税是公司的成本费用吗
  • 砖厂的会计分录有哪些
  • 佣金是买卖股票都收吗
  • 银行定期存款取一部分怎么算利息
  • 公司的零星费用可以用对公转吗
  • 跨年的个人所得税可以更正吗
  • 房地产开发企业增值税税率
  • 简易征收租赁税率3还是5
  • SQL Server 作业同步 (结合备份作业)
  • solaris ssh offline
  • WINDOWS系统中删除放入回收站的文件占用什么空间
  • ubuntu20设置ip
  • reminder.exe - reminder是什么进程 有什么用
  • win8系统屏幕亮度调节
  • Win10计算机管理该文件没有与之关联的应用
  • win7电脑浏览器怎么设置默认浏览器
  • Bullet(Cocos2dx)之交叉编译Android,集成到cocos2dx3.x
  • opengl教程48讲
  • js内存条
  • centos安装完成后桌面没有图标
  • android单选
  • javascript中的对象用于
  • js数组的push方法
  • python高级写法
  • 水电费收税
  • 车船税完税凭证去哪里打印
  • 新旧动能转换是我们能否过坎的关键
  • 我的电脑软件下载
  • 如何计算环保税减征政策
  • 增值税按次纳税的规定
  • 税务局实地核查内容
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设