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

  • iqooneo5支持wifi6吗(iQOOneo5支持骁龙畅听吗)

    iqooneo5支持wifi6吗(iQOOneo5支持骁龙畅听吗)

  • word怎么在竖页中插横页(word怎么竖页浏览)

    word怎么在竖页中插横页(word怎么竖页浏览)

  • 淘宝交易记录怎么删除(淘宝交易记录怎么查支付记录)

    淘宝交易记录怎么删除(淘宝交易记录怎么查支付记录)

  • 怎么开通微信(怎么开通微信朋友圈)

    怎么开通微信(怎么开通微信朋友圈)

  • 使用AirPods接电话没声音(连接airpods接电话)

    使用AirPods接电话没声音(连接airpods接电话)

  • 为什么airdrop一直正在等待(为什么airdrop一直正在转换)

    为什么airdrop一直正在等待(为什么airdrop一直正在转换)

  • 闲鱼显示卖掉了有几种情况(闲鱼显示卖掉了还可以拍吗)

    闲鱼显示卖掉了有几种情况(闲鱼显示卖掉了还可以拍吗)

  • 荣耀20打电话对方听不到声音

    荣耀20打电话对方听不到声音

  • QQ语音通话怎么关闭自己的声音(qq语音通话怎么让对方听到自己手机的声音)

    QQ语音通话怎么关闭自己的声音(qq语音通话怎么让对方听到自己手机的声音)

  • 带负载能力强什么意思(什么叫带负载能力强)

    带负载能力强什么意思(什么叫带负载能力强)

  • 如何关闭搜狗输入法的按键声音(如何关闭搜狗输入法)

    如何关闭搜狗输入法的按键声音(如何关闭搜狗输入法)

  • ios13验证更新一直失败(ios13更新一直正在验证)

    ios13验证更新一直失败(ios13更新一直正在验证)

  • ps如何一秒扣图(ps里如何快速扣图)

    ps如何一秒扣图(ps里如何快速扣图)

  • 苹果6和5s的区别(苹果5s和苹果6的区别在哪里)

    苹果6和5s的区别(苹果5s和苹果6的区别在哪里)

  • 快手怎么自动播放下一个(快手怎么自动播放下一首)

    快手怎么自动播放下一个(快手怎么自动播放下一首)

  • 抖音看过的视频怎么找足迹(抖音看过的视频推荐给朋友怎么关闭)

    抖音看过的视频怎么找足迹(抖音看过的视频推荐给朋友怎么关闭)

  • 手机酷狗音乐怎么截歌(手机酷狗音乐怎么在电视上播放音乐)

    手机酷狗音乐怎么截歌(手机酷狗音乐怎么在电视上播放音乐)

  • vx一天能加多少群(vx一天加多少人正常)

    vx一天能加多少群(vx一天加多少人正常)

  • 苹果手机私密相册在哪(苹果手机私密相册怎么设置)

    苹果手机私密相册在哪(苹果手机私密相册怎么设置)

  • 华为nova系列主打什么方面(华为nova 7 pro)

    华为nova系列主打什么方面(华为nova 7 pro)

  • caxa标题栏怎么设置(caxa标题栏怎么改变大小)

    caxa标题栏怎么设置(caxa标题栏怎么改变大小)

  • iphone11电池容量多少毫安(iphone14pro电池容量)

    iphone11电池容量多少毫安(iphone14pro电池容量)

  • 华为解锁后有个热点咨询,怎么关闭(华为手机解锁后屏幕中间出现)

    华为解锁后有个热点咨询,怎么关闭(华为手机解锁后屏幕中间出现)

  • sd卡在手机的哪里(sd卡在手机里面起什么作用)

    sd卡在手机的哪里(sd卡在手机里面起什么作用)

  • 转转二手怎么交易流程(转转二手交易网怎么交易)

    转转二手怎么交易流程(转转二手交易网怎么交易)

  • 电脑长时间不用很卡怎么办(电脑长时间不用黑屏后怎么打不开了)

    电脑长时间不用很卡怎么办(电脑长时间不用黑屏后怎么打不开了)

  • 解决TypeError: Cannot read properties of null (reading ‘xxx‘)的错误(解决的英文)

    解决TypeError: Cannot read properties of null (reading ‘xxx‘)的错误(解决的英文)

  • 最贵租金的苹果商店是什么(最贵的一个苹果多少钱)

    最贵租金的苹果商店是什么(最贵的一个苹果多少钱)

  • 个人所得税本期收入是扣完保险吗
  • 实际负税计算公式
  • 公司与公司之间的欠款怎么要
  • 跨月作废增值税专用发票
  • 计提所得税费用的账务处理
  • 废旧物资回收经营范围
  • 会计凭证填制要求有哪些
  • 无形资产加计扣除最新政策
  • 出口关税如何做账
  • 自己做的房子可以办房产证吗
  • 暂估费用时可以抵扣吗
  • 蔬菜营销方案案例范文
  • 调用核心征管失败是什么意思
  • 增值税怎么转
  • 小规模纳税人自来水税率
  • 怎么核算租赁合同的印花税?
  • 税盘减免会计分录
  • 补缴社保滞纳金怎么做账
  • php parse_url
  • 小规模纳税人没有进项税
  • PHP:finfo_file()的用法_fileinfo函数
  • 计算企业应纳税所得额时,可以扣除的税种
  • 用盈余公积弥补以前年度亏损
  • 工业制品买卖
  • 公允价值变动损益属于什么科目
  • php怎么操作数据库
  • php str_split
  • find命令详解查找文件
  • 前期认证相符且不符合
  • 跨域问题是什么
  • 研发入库的产品销售出库怎样做账
  • 存货跌价准备科目余额在哪方
  • 公司电脑配件也要交税吗
  • 长期待摊费用账务处理
  • 营业收入小于利息收入
  • 帝国cms灵动标签排除上一篇下一篇文章
  • 织梦技术论坛
  • 在建工程转固定资产的账务处理
  • mysql使用中遇到的困难和问题
  • 免费学电脑的网站
  • 印刷行业成本核算程序
  • 购买办公楼之后怎么入住
  • 四联发票都需要盖章吗
  • 企业所得税会计利润
  • 未满一年需要工商年报吗
  • 内含报酬率的意义
  • 增值税专用发票几个点
  • 内账应付账款怎么做账
  • 可抵扣进项税额包括进项税额转出吗
  • 新公司核税需要什么材料
  • 职工福利费计提标准是多少
  • 收到汇款计入什么科目
  • 以融资租赁形式的车贷没还上可以拖车吗
  • 劳务公司成本核算方法一般选择哪个
  • 房租转租怎么处理合法
  • 招待费用的进项发票可以抵扣吗
  • 小规模纳税人营改增税率
  • 预付账款有余额吗
  • 残保金是否为强制缴纳
  • MySQL数据库远程登录
  • win2003控制面板在哪里打开
  • win8怎么卸载
  • ntdll.dll no matching
  • window10重装显卡驱动
  • 如何延长手机电池使用寿命
  • ubuntu服务器命令
  • win7用户账户控制设置电脑重启后恢复
  • 安装ubuntu后无法进入windows
  • fsrremos.exe
  • win10周年版
  • 关于cocos2dx空包的大小测试
  • js 根据时间排序
  • 正弦的波长
  • 安卓两页合并到下一页
  • 深入理解Python特性 达恩·巴德尔
  • 国家税务局公告2018年第28号
  • 当前税务干部队伍不足
  • 油品贸易公司资质
  • 河南出名歌手
  • 会计的各种税
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设