压缩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/glb模型踩坑与解决 three.js DRACOLoader

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

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

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

在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;
});

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

Uncaught SyntaxError: Unexpected token '<'
压缩gltf/glb模型踩坑与解决 three.js DRACOLoader

解决:

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

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

后续发现bolb:xxx的请求不是写的应用层所发出的
之后通过阅读DRACOLoader.js的源码得
压缩gltf/glb模型踩坑与解决 three.js DRACOLoader
压缩gltf/glb模型踩坑与解决 three.js DRACOLoader
压缩gltf/glb模型踩坑与解决 three.js DRACOLoader

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

  • draco_decoder.js
  • draco_wasm_wrapper.js
  • draco_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

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

将改文件夹复制到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.toymoban.com/news/detail-405289.html

到了这里,关于压缩gltf/glb模型踩坑与解决 three.js DRACOLoader的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Cesium 实战 - 使用 gltf-vscode 查看、预览以及编辑 glTF 和 GLB 模型

    模型渲染作为 Cesium 一个非常重要的功能,目前 只支持 glTF 和 GLB 两种格式,其实是一种格式 ,GLB 是 glTF 的二进制形式。 在实际项目中,由于对模型的操作,可能会需要查看模型的属性。之前一直使用 blender 来查看、调整以及转换等操作。模型转换详见:Cesium 三维模型使用

    2024年02月11日
    浏览(23)
  • uniapp通过renderjs加载3D模型,支持FBX、GLB和GLTF模型,模型可自动适应。

    n-text-loading是我的自定义loading组件,可以自行替换 id是threeView是模型显示的位置, props里面的url是模型链接,cameraZ是相机位置,默认100,一般不需要改,有些z轴很长的模型旋转的时候会有一部分相机看不到这个时候就需要调整这个值了,这两个要从后台上传。 :prop=“url”,

    2024年02月14日
    浏览(12)
  • 3dmax模型完美转glb模型,gltf格式模型转fbx格式转obj格式

    现在好多模型都是3dmax模型,但是客户要求是glb或者gltf模型 这个时候好多人直接导出glb模型,是没有颜色贴图的,这样的 这个时候是不能用的,怎么办,咱们要回到3dmax,把VR材质一个个重新上普通材质 当然也可以用插件一键转换 没有插件可以联系QQ 424081801也可以制作glb模

    2024年02月12日
    浏览(15)
  • Babylonjs Playground中动态加载自己的glb gltf模型(github、dropbox)

    目录 以下提供两种常用的方法 (使用科学梯子) 先说总结:对比 github和dropbox github外链使用方法 方法一:rootUrl添加链接路径。sceneFilename必须置空 方法二:rootUrl填写文件夹路径,sceneFileName填写对应的文件名字 方法三:gltf+bin文件 见案例: 额外补充:群友盲猜大佬整理的

    2024年02月04日
    浏览(16)
  • open3d,读取stl/ply/obj/off/gltf/glb三维模型,并转换成点云,保存

    可以自己用建模软件建立一个模型 本案例使用模型的下载地址 可以从free3d免费下载,无需注册 效果: 效果: 均匀采样会在表面出现采样点聚集的现象,open3d实现了一种基于poisson_disk方法的采样,能实现表面的均匀采样 原理 :参数umber_of_points是最终采样的点数量,实际会先

    2024年02月11日
    浏览(15)
  • 如何把glb格式模型gltf格式模型导入3dmax和C4D,U3D,UE4这些主流软件中

    咱有时候去glbxz.com添加链接描述 官网下载免费glb格式模型,gltf模型下载时候是没有通用格式,例如fbx,obj,这个时候3dmax和C4D直接打开导入是不行的,也可以制作glb模型,扣扣:424081801 这个时候,咱们用 glbxz.com 平台在线编辑功能,先导入glb 导入进来看看glb格式模型或者g

    2024年02月12日
    浏览(19)
  • Easy3dviewer三维模型(gltf/glb、osgb、fbx、x、shp、dxf)超轻量浏览和转换工具软件分享

    工作中经常需要用到不同格式的三维模型,比如3dmiax建模的3ds,倾斜摄影的osgb、bim转换的fbx,二维gis需要的shp、cad建模的dxf、三维gis需要的gltf等等,需要能快速方便的浏览和查看这些三维模型,也需要能将三维模型格式转换成其他三维模型格式。对三维浏览和转换的需求非

    2024年02月04日
    浏览(28)
  • VSCode + GCC编译器(MinGW)开发环境中文字符乱码问题踩坑与解决办法

    问题背景 在较长一段时间里,C/C++开发者所使用的集成开发环境(IDE)要么是比较重量级的 VS(Visual Studio) ,要么是 Codeblocks·、·Visual C++ 6.0 等轻量级IDE,又或者是诸如 notepad++、sublime text 等文本编辑器+ GCC编译器 +命令行工具的组合式开发环境。这几种开发方式要么太过庞

    2023年04月22日
    浏览(25)
  • Unity加载gltf/glb文件

    1.打开包管理器窗口 2.点击添加 3.点击“按名称添加包” 4. 输入 com.unity.nuget.newtonsoft-json 包名称和 3.0.1 版本 第一种方法: 通过PackageManager的Git url的方式添加: \\\"com.siccity.gltfutility\\\": \\\"https://github.com/siccity/gltfutility.git\\\" 如果git访问不了,你可以用第二种方式手动下载; 第二种方

    2024年02月15日
    浏览(13)
  • .3ds 文件转 glb 或 gltf

            拿到一个3d模型,是.3ds 文件和一堆png的纹理图片。要在cesium中显示,cesium中支持这个格式,需要转化成支持的glb 或 gltf格式。 目录 一、在3dmax中导入,并显示贴图纹理 二、转换成fbx,再转换成obj 三、在Blender 中导入obj,然后转换成 glb 或 gltf         下载3dmax2020 ,

    2024年02月16日
    浏览(20)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包