因为没有大模型来测试pipeline,我连夜学习了一波obj2gltf
作者:互联网
一、前言
今天突然有空想试试之前的pipeline压缩gltf模型,结果手头没有gltf格式的大模型,用小模型又觉得效果不够明显,于是乎,我连忙拿起了收藏夹里吃灰的obj2gltf,来看看能不能把我obj格式的大模型,转换成gltf格式。
obj2gltf这个插件,我就理解不够透彻了,所以本文更多偏实际使用
二、过程
1、首先是下载对应的文件
github.com/CesiumGS/ob… 点开连接下载里面的bin文件夹和lib文件夹,放到项目里,也可以直接一整个下载,起作用只要这两个文件夹。如下图的格式
2、然后安装一下
我试了一下,如果不npm安装,仅有第一步的下载,好像也用不了,时间仓促就没太深入了解,不过最好还是执行以下命令
npm install --save obj2gltf
复制代码
3、执行压缩命令
一般obj模型都会附带一个导出名字一致的mtl文件,下面的命令会把mtl的信息也糅合到gltf模型里一起, 我的模型是在public里的文件里,这个-i后面就是要压缩的模型路径, -o是输出路径,也包含了名称,-d是采取Draco压缩,添加了KHR_draco_mesh_压缩扩展,效果会更加明显,但就是这种压缩方法必须配合DRACOLoader使用
node bin/obj2gltf.js -i ./public/assets/gltf-format-big/earth.obj -o ./public/assets/gltf-format-big/earth-d.gltf -d
复制代码
压缩成功的情况,会出现这个total信息。
可以看到obj格式模型,已经转换成gltf格式保存到指定路径了,而且大小也从143m变成了77.3m, 压缩效果还是挺可观的。
我同时测试了不带d的压缩,发现压缩后大小一样,都是77.3m,这个可能因模型而异(可以看下3D图形开源压缩库Draco的相关资料,猜测有时候,模型体积很大并不是,模型的网格面很多,所以通过-d压缩是几乎无效的,因为大小是由点面和纹理图片构成,-d压缩只对点面生效)。 不过这种情况下,都可以直接按正常的gltf模型导入。
initLoad2() {
// 加载
this.gltLoader2 = new THREE.GLTFLoader()
this.gltLoader2.load('/assets/gltf-format-big/earth-d.gltf', (gltf) => {
console.log(gltf)
gltf.scene.position.x = -6
gltf.scene.position.z = 4
gltf.scene.position.y = 0
gltf.scene.children[0].children.forEach((item, i) => {
gltf.scene.children[0].children[i].castShadow = true
gltf.scene.children[0].children[i].receiveShadow = true
})
gltf.scene.scale.set(0.1, 0.1, 0.1)
gltf.scene.rotateY(0.5 * Math.PI)
this.scene.add(gltf.scene)
},
// 加载进度回调
(xhr) => {
console.log(xhr, (xhr.loaded / xhr.total) * 100 + '% loaded')
}
)
}
复制代码
4、注意事项
a、需要压缩的文件需要放在同个文件夹下,不然会找不到
b、obj模型如果用了特殊材质一类的,大概率是会丢失的,做好心理准备
c、转换过程中如果报错,请根据报错信息,排除对应故障
复制代码
ps1:(有gltf模型可以去测试pipeline了)
ps2: 引入过程如果出现了以下错误,那就需要引入DRACOLoader,具体步骤可以移步我的另一篇文章,(隔天就发,在写在写了)
ps3: 周末又可以更新了
作者:地霊殿__三無
链接:https://juejin.cn/post/7130968119480156190
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
标签:obj2gltf,一波,pipeline,obj,模型,scene,children,压缩,gltf 来源: https://www.cnblogs.com/Earth-Hall-Sanwu/p/16673013.html