• 正文概述
  • 现在主流通用格式是fbx,但是fbx格式转成glb格式模型,会非常非常大,卡死人那种,这种肯定直接用是不行,咱们要对模型压缩,使内存变小

     

     

    咱们先到glbxz.com gltf模型下载网站和glb模型下载网站,哈哈,去白嫖几个免费模型下来,

     

     

    DRACOLoader,glbxz.com本身的glb格式模型轻量化加载工具便成为了第一个研究使用对象。

     

     

    能从glbxz.com找到的demo场景里对DRACOLoader使用的代码

     

     

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

     

     

    } );

     

     

    就以现有的场景作为研究对象,发现DRACOLoader只是一个对进行压缩后的模型进行特殊加载的工具,本身并不能实现对glb模型的压缩功能。

     

     

    实际用来做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文件夹中。

     

     

    先将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);

     

     

    });

     

     

    再将压缩过后的gltf转换成glb:

     

     

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

     

     

    }

     

     

    }

     

     

    });

     

     

    Nodejs有个jimp模块可以对图片进行处理,在glb工程中打开终端,输入npm install jimp,安装jimp工具。

     

     

    图片压缩代码:

     

     

    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:

     

     

    [pgltf-pipeline -i ‘gltf模型文件地址’ -o ‘glb模型文件保存地址’],保证纹理和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,并且正常加载使用

    1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
    2. 分享目的仅供大家学习和交流,请不要用于商业用途!
    3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入!
    4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
    5. 如有链接无法下载、失效或广告,请联系管理员处理!
    6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
    7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员!
    8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载
    声明如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性

    GLB下载网(glbxz.com)gltf文件下载-glb格式下载-模型制作 » 压缩glb模型gltf模型和下载glb模型详细全过程

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载要提取码
    百度网盘提取码都是gltf。
    分享过期和重复下载怎么办
    分享过期请使用备份下载,重复下载是不另扣费的,请放心下载。
    模型和平台不兼容怎么办
    可以用网站在线编辑功能,修改模型属性,大小,方向,坐标,中心,透明等问题,然后重新导出既可https://glbxz.com/38636.html
    • 7879会员数(个)
    • 16034资源数(个)
    • 40本周更新(个)
    • 39125 今日更新(个)
    • 1139稳定运行(天)

    提供最优质的资源集合

    加入VIP
    开通VIP 享更多特权,建议使用 QQ 登录
    ×