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

  • 小米air2 se怎么切换下一首(小米air2se怎么恢复双耳模式)

    小米air2 se怎么切换下一首(小米air2se怎么恢复双耳模式)

  • vivox50和x50pro的区别有哪些(vivox50与x50pro的区别)

    vivox50和x50pro的区别有哪些(vivox50与x50pro的区别)

  • 安卓手机和ipad怎么传文件(安卓手机和ipad之间怎么传文件)

    安卓手机和ipad怎么传文件(安卓手机和ipad之间怎么传文件)

  • 智慧团建名字错了怎么修改(智慧团建名字错了有什么影响)

    智慧团建名字错了怎么修改(智慧团建名字错了有什么影响)

  • qq群莫名其妙的消失了(qq群莫名其妙的封了怎么解封)

    qq群莫名其妙的消失了(qq群莫名其妙的封了怎么解封)

  • 被对方拉黑怎么才能打通电话(被对方拉黑怎么联系对方)

    被对方拉黑怎么才能打通电话(被对方拉黑怎么联系对方)

  • boss直聘一般封多久(boss直聘封号规则是什么)

    boss直聘一般封多久(boss直聘封号规则是什么)

  • 目前世界上最大的计算机互联网络是(目前世界上最大的证券交易所是)

    目前世界上最大的计算机互联网络是(目前世界上最大的证券交易所是)

  • 华为基于鲲鹏处理器的机架服务器名称是什么(华为鲲鹏是干啥的)

    华为基于鲲鹏处理器的机架服务器名称是什么(华为鲲鹏是干啥的)

  • 荣耀play有nfc功能吗(荣耀play的nfc)

    荣耀play有nfc功能吗(荣耀play的nfc)

  • sim卡无法使用lte是什么意思(sim卡无法使用移动网络怎么办)

    sim卡无法使用lte是什么意思(sim卡无法使用移动网络怎么办)

  • 苹果11出厂带膜吗(苹果11出厂带钢化膜吗)

    苹果11出厂带膜吗(苹果11出厂带钢化膜吗)

  • wifi显示网络拒绝接入是什么意思(wifi显示网络拒绝加入网络怎么办)

    wifi显示网络拒绝接入是什么意思(wifi显示网络拒绝加入网络怎么办)

  • 华为折叠屏屏幕是哪家公司供应的(华为折叠屏屏幕出现亮线)

    华为折叠屏屏幕是哪家公司供应的(华为折叠屏屏幕出现亮线)

  • 苹果11怎么看是不是翻新机(苹果11怎么看是不是双卡双待)

    苹果11怎么看是不是翻新机(苹果11怎么看是不是双卡双待)

  • 手机qq怎么看退出的群(手机qq怎么看退群的人)

    手机qq怎么看退出的群(手机qq怎么看退群的人)

  • 华为mate30和mate20的区别(华为mate30和mate20pro的区别)

    华为mate30和mate20的区别(华为mate30和mate20pro的区别)

  • 注销qq后能恢复吗(注销qq后能恢复好友吗)

    注销qq后能恢复吗(注销qq后能恢复好友吗)

  • 拯救者键盘灯怎么换色(拯救者键盘灯怎么开变色)

    拯救者键盘灯怎么换色(拯救者键盘灯怎么开变色)

  • 解除微信登录拼多多(如何解除微信登录拼多多)

    解除微信登录拼多多(如何解除微信登录拼多多)

  • vivoy97闪充还是快充(vivo手机闪充是充电头还是数据线)

    vivoy97闪充还是快充(vivo手机闪充是充电头还是数据线)

  • 小米9运行内存有几种(小米9运行内存怎么看)

    小米9运行内存有几种(小米9运行内存怎么看)

  • ltmsg.exe是什么进程 有什么用 ltmsg进程查询(lmgrd.exe是什么进程)

    ltmsg.exe是什么进程 有什么用 ltmsg进程查询(lmgrd.exe是什么进程)

  • aisino金税盘怎么安装在电脑上
  • 水资源费如何入账
  • 季度企业所得税申报表怎么填写
  • 获取发票信息异常
  • 预算分配比例与国库不一样
  • 租金收入摊销
  • 分公司亏损总公司账务处理
  • 非居民企业所得税核定利润率
  • 利润表中列报项目
  • 土地增值税哪些可以加计扣除
  • 增值税扣税凭证抵减销项税额
  • 记账凭证的科目不会填
  • 月末利润分配的账务处理
  • 软件开发工资低
  • 什么情况下个税税率是10%
  • 定期定额怎么报税
  • 委托代付工程款会计分录
  • linux查杀webshell
  • windows无法连接到打印机指定的网络名不再可用
  • 固定资产净值与原值的区别
  • paypal授权书怎么填
  • php更新数据库
  • linux开机出现grub解决方法
  • dev beta 发布预览
  • 土地出让金土地使用税
  • 资产划转增值税 开票怎么开
  • 企业所得税征收点
  • 建筑工程房屋租赁费属于什么费用
  • 2020年农业病虫害
  • 季度报表本期金额和累计金额
  • docker部署webdav
  • 公司汽车折旧计算方法用那种
  • python读书笔记
  • 为什么我们认为北京人已经学会使用火
  • paper 1
  • 长期应收款如何核算
  • 企业财务报表有附注吗
  • 可供出售金融资产和交易性金融资产
  • springbootredis密码加密
  • 预算收入的核算
  • 低值易耗品还需要录入明细吗
  • 防伪税款服务费抵扣
  • 资本化费用为什么会减少
  • 在建工程增多
  • 出口企业有哪些税收
  • 会计账簿错误处理方式
  • 健身器材折旧年限及计提办法
  • 其他综合收益要转入投资收益吗
  • 合同已执行但有错误怎么办
  • 进项税发票可以跨年抵扣吗
  • 营改增后建筑业开票规定
  • 重要性水平如何判断
  • mysql三层架构
  • macbookpro mysql
  • VMWare linux mysql 5.7.13安装配置教程
  • 防火墙监视模式
  • ubuntu安装超详细教程
  • freebsd更新命令
  • 如何解决win10系统用户名有中文
  • ubuntu20.04命令
  • linux和windows交互
  • win7系统打不开浏览器
  • debian 单网卡设置双ip
  • linux root 密码忘了怎么办
  • win7系统回收站文件夹的位置
  • javascript的理解
  • unity3d基础操作
  • loading and loading
  • shell脚本-lt
  • js中的filter方法
  • js中的filter方法和map方法
  • ajax读取json
  • node.js视频教程
  • 批处理之家官网
  • jquery easing
  • python 命令
  • 支付宝登录电子社保卡显示已被其他账号登录
  • 深圳沙井社保局在哪个位置
  • 国家税务总局多少员工
  • 宜昌市西陵区国税局局长
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设