glbモデル gltfモデルを圧縮し、glbモデルの詳細な全プロセスをダウンロードします

現在、主流の汎用フォーマットは fbx ですが、fbx フォーマットは glb フォーマットモデルに変換されるため、非常に大きくなり、スタックしてしまいます。直接使用することは絶対に不可能です。圧縮する必要があります。メモリを小さくしたモデル。

まず、glbxz.com gltf モデル ダウンロード Web サイトと glb モデル ダウンロード Web サイトにアクセスしましょう (笑)、いくつかの無料モデルを無料で入手しましょう。

glbxz.com の glb 形式モデル軽量ローディング ツール DRACOLoader 自体が最初の研究対象となりました。

デモ シーンで DRACOLoader に使用されているコードは、glbxz.com から見つけることができます。

新しいGLTFLoader()

.setPath( 'models/gltf/' )

.setDRACOLoader( new DRACOLoader().setDecoderPath( 'js/libs/draco/gltf/' ) )

.load( 'モデル別.glb', function ( gltf ) {

コンソール.ログ(gltf.シーン);

scene.add( gltf.scene );

} );

既存のシーンを研究対象とすると、DRACOLoader は圧縮モデルを特殊にロードするためのツールにすぎず、それ自体では glb モデルの圧縮機能を実現できないことがわかります。

実際に glb 圧縮に使用するツールは gltf-pipeline なので、最初に gltf-pipeline をインストールします。GitHub アドレス https://github.com/CesiumGS/gltf-pipeline。

まずnodejsをインストールし、ダウンロード | Node.jsにアクセスします。Nodejs がインストールされたら、VS 2019 の開発者 PowerShell を開き、「npm install -g gltf-pipeline」と入力して gltf-pipeline をインストールします。

vscode をインストールし、デスクトップに glb フォルダーを作成し、vscode を使用して glb フォルダーを開き、ファイル draco.js を圧縮コード スクリプト ファイルとして作成し、ターミナルを開き、新しいターミナルを作成し、「npm install gltf-pipeline」と入力し、インストールが成功すると、左側のウィンドウが表示されます。node_modules フォルダーと 2 つの 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(関数 (結果) {

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 オプション = {

ドラコオプション: {

圧縮レベル: 10、

}、

};

processGltf(gltf, オプション).then(関数 (結果) {

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(関数 (結果) {

fsExtra.writeFileSync(“model-draco.glb”, results.glb);

});

ただし、上記のコード圧縮を実行すると、実際の圧縮効果はあまり良くなく、10 倍の圧縮はありません。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 オプション = {

セパレートテクスチャ: true、

};

processGltf(gltf, オプション).then(関数 (結果) {

fsExtra.writeJsonSync(“モデル別.gltf”, results.gltf);

// 個別のリソースを保存する

constセパレートリソース = results.セパレートリソース;

for (constrelativePath in SeparateResources) {

if (セパレートリソース.hasOwnProperty(relativePath)) {

const resource = SeparateResources[相対パス];

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;

定数の長さ = 400;

const isWidthLonger = imgWidth > imgHeight ? 真/偽;

const time = (isWidthLonger ? imgWidth : imgHeight) / 長さ;

const rWidth = imgWidth / 時間;

const rHeight = imgHeight / 時間;

return img.resize(rWidth, rHeight ).write( image0.png);

});

次に、別々に保存して処理した写真と gltf を glb に再結合します。

CMD コマンド ラインを使用して gltf とテクスチャ マップをパッケージ化し、glb を生成します。

[pgltf-pipeline -i 'gltf モデル ファイル アドレス' -o 'glb モデル ファイル保存アドレス']、glb がグリッドとテクスチャに対して正常に圧縮されるように、テクスチャ ファイルと gltf モデル ファイルが 1 つのフォルダー内にあることを確認します。

最終的なコードの概要:

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 オプション = {

ドラコオプション: {

圧縮レベル: 10、

}、

};

const オプション 1 = {

セパレートテクスチャ: true、

};

glbToGltf(glb).then(関数 (結果) {

processGltf(results.gltf, options).then(function (results) {

processGltf(results.gltf, options1).then(function (results) {

fsExtra.writeJsonSync(“モデル別.gltf”, results.gltf);

// 個別のリソースを保存する

constセパレートリソース = results.セパレートリソース;

for (constrelativePath in SeparateResources) {

if (セパレートリソース.hasOwnProperty(relativePath)) {

const resource = SeparateResources[相対パス];

fsExtra.writeFileSync(relativePath, resource);

Jimp.read(relativePath).then(img => {

const imgWidth = img.bitmap.width;

const imgHeight = img.bitmap.height;

定数の長さ = 10;

const rWidth = imgWidth / 長さ;

const rHeight = imgHeight / 長さ;

return img.resize(rWidth, rHeight ).write(relativePath);

});

}

}

});

});

});

CMD:gltf-pipeline -i C:\xx\xx\xx\glb\モデル別.gltf -o C:\xx\xx\xx\glb\モデル別.glb

おすすめ

転載: blog.csdn.net/weixin_42070282/article/details/128796429