咱们先到glbxz.com gltf模型下载网站和glb模型下载网站,哈哈,去白嫖几个免费模型下来,
new GLTFLoader()
.setPath( ‘models/gltf/’ )
.setDRACOLoader( new DRACOLoader().setDecoderPath( ‘js/libs/draco/gltf/’ ) )
.load( ‘model-separate.glb’, function ( gltf ) {
console.log(gltf.scene);
scene.add( gltf.scene );
} );
实际用来做glb压缩的工具为gltf-pipeline,故先进行gltf-pipeline的安装操作。GitHub地址https://github.com/CesiumGS/gltf-pipeline。
先安装nodejs,地址下载 | Node.js。Nodejs安装好后,打开Developer PowerShell for VS 2019,输入npm install -g gltf-pipeline安装gltf-pipeline。
安装vscode,在桌面创建一个glb文件夹,然后使用vscode打开glb文件夹,创建文件draco.js作为压缩代码脚本文件,打开终端,新建终端,输入npm install gltf-pipeline,当安装成功后左边窗口会出现node_modules文件夹,以及两个json文件。将需要压缩的glb模型(model.glb)放到刚才创建在桌面的glb文件夹中。
![](https://pics2.baidu.com/feed/c2fdfc039245d688f5ed579e9d2bd915d31b2415.jpeg@f_auto?token=27cf345631a1ba533920737a84fe9a36)
先将glb转成gltf:
const gltfPipeline = require(“gltf-pipeline”);
const fsExtra = require(“fs-extra”);
const glbToGltf = gltfPipeline.glbToGltf;
const glb = fsExtra.readFileSync(“model.glb”);
glbToGltf(glb).then(function (results) {
fsExtra.writeJsonSync(“model.gltf”, results.gltf);
});
再压缩gltf:
const gltfPipeline = require(“gltf-pipeline”);
const fsExtra = require(“fs-extra”);
const processGltf = gltfPipeline.processGltf;
const gltf = fsExtra.readJsonSync(“model.gltf”);
const options = {
dracoOptions: {
compressionLevel: 10,
},
};
processGltf(gltf, options).then(function (results) {
fsExtra.writeJsonSync(“model-draco.gltf”, results.gltf);
});
const gltfPipeline = require(“gltf-pipeline”);
const fsExtra = require(“fs-extra”);
const gltfToGlb = gltfPipeline.gltfToGlb;
const gltf = fsExtra.readJsonSync(“model-draco.gltf”);
gltfToGlb(gltf).then(function (results) {
fsExtra.writeFileSync(“model-draco.glb”, results.glb);
});
然而采取以上代码压缩会发现,实际压缩效果并没有太好,不存在10倍压缩的情况,将gltf纹理单独保存出来就会发现,纹理贴图是没有做过压缩处理的,只是将本身的gltf做了压缩,本身gltf确实存在10倍压缩,所以如果你的模型贴图占了该模型大小较重的比例,这个压缩实际效果很差。
所以就需要对gltf的贴图进行压缩。
先将gltf做纹理的单独保存:
const gltfPipeline = require(“gltf-pipeline”);
const fsExtra = require(“fs-extra”);
const processGltf = gltfPipeline.processGltf;
const gltf = fsExtra.readJsonSync(“model.gltf”);
const options = {
separateTextures: true,
};
processGltf(gltf, options).then(function (results) {
fsExtra.writeJsonSync(“model-separate.gltf”, results.gltf);
// Save separate resources
const separateResources = results.separateResources;
for (const relativePath in separateResources) {
if (separateResources.hasOwnProperty(relativePath)) {
const resource = separateResources[relativePath];
fsExtra.writeFileSync(relativePath, resource);
}
}
});
图片压缩代码:
var Jimp = require(‘jimp’);
Jimp.read(‘image0.png’).then(img => {
const imgWidth = img.bitmap.width;
const imgHeight = img.bitmap.height;
const length = 400;
const isWidthLonger = imgWidth > imgHeight ? true : false;
const time = (isWidthLonger ? imgWidth : imgHeight) / length;
const rWidth = imgWidth / time;
const rHeight = imgHeight / time;
return img.resize(rWidth, rHeight ).write(`image0.png`);
});
然后把单独保存出来并处理过的图片和gltf,重新再合成glb。
使用CMD命令行进行gltf以及纹理贴图的打包,生产glb:
最后代码总结:
const gltfPipeline = require(“gltf-pipeline”);
const fsExtra = require(“fs-extra”);
const glbToGltf = gltfPipeline.glbToGltf;
const glb = fsExtra.readFileSync(“model.glb”);
const processGltf = gltfPipeline.processGltf;
var Jimp = require(‘jimp’);
const options = {
dracoOptions: {
compressionLevel: 10,
},
};
const options1 = {
separateTextures: true,
};
glbToGltf(glb).then(function (results) {
processGltf(results.gltf, options).then(function (results) {
processGltf(results.gltf, options1).then(function (results) {
fsExtra.writeJsonSync(“model-separate.gltf”, results.gltf);
// Save separate resources
const separateResources = results.separateResources;
for (const relativePath in separateResources) {
if (separateResources.hasOwnProperty(relativePath)) {
const resource = separateResources[relativePath];
fsExtra.writeFileSync(relativePath, resource);
Jimp.read(relativePath).then(img => {
const imgWidth = img.bitmap.width;
const imgHeight = img.bitmap.height;
const length = 10;
const rWidth = imgWidth / length;
const rHeight = imgHeight / length;
return img.resize(rWidth, rHeight ).write(relativePath);
});
}
}
});
});
});
CMD:gltf-pipeline -i C:\xx\xx\xx\glb\model-separate.gltf -o C:\xx\xx\xx\glb\model-separate.glb
最后4158KB的glb压缩到138KB,并且正常加载使用
2. 分享目的仅供大家学习和交流,请不要用于商业用途!
3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员!
8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载
声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性
GLB下载网(glbxz.com)gltf文件下载-glb格式下载-模型制作 » 压缩glb模型gltf模型和下载glb模型详细全过程
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
- 提示下载要提取码
- 分享过期和重复下载怎么办
- 模型和平台不兼容怎么办