TypeScriptで3Dモデルを最適化する方法
Aspose.3D FOSS for TypeScript は、出力ファイルサイズの削減と処理スループットの向上のためのさまざまな戦略を提供します。本ガイドでは、フォーマット選択、バイナリ埋め込み、インメモリパイプライン、Node.js レベルの最適化について解説します。.
ステップバイステップ ガイド
ステップ 1: 適切な出力フォーマットを選択する
GLB(バイナリ glTF)は、ツールサポートが充実しており、最もコンパクトな出力を生成します。OBJ はテキストベースでサイズが大きくなります。STL はジオメトリのみのワークフローでコンパクトです。.
| フォーマット | サイズ | マテリアルを含む | アニメーションを含む | 最適な用途 |
|---|---|---|---|---|
| GLB | 小 | はい(埋め込み) | はい | Web、ゲーム、一般的な交換 |
| glTF | 中 | はい(別々) | はい | 開発、検査 |
| STL | 小 | いいえ | いいえ | 3D printing, geometry-only |
| OBJ | 大 | 別々の .mtl | いいえ | 従来のツール、広い互換性 |
| FBX | 中 | いいえ* | いいえ* | インポーター/エクスポーターは存在しますが、オートディテクションに組み込まれていません |
| 3MF | 小 | はい | いいえ | 最新の3Dプリンティング |
ステップ 2: バイナリ GLB にエクスポートする
GLB に保存する際、設定 GltfSaveOptions.binaryMode = true 単一の自己完結型バイナリファイルを生成するために。これにより、別個の .bin サイドカーが不要になり、多くの3Dビューアで必要です:
import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';
import { GltfSaveOptions } from '@aspose/3d/formats/gltf';
const scene = new Scene();
scene.open('complex-model.obj', new ObjLoadOptions());
const opts = new GltfSaveOptions();
opts.binaryMode = true;
scene.save('optimized.glb', opts);
console.log('Saved compact binary GLB');ステップ 3: インメモリパイプラインでは Buffer I/O を使用する
Web サービスでファイルを処理する際は、使用 openFromBuffer そして saveToBuffer ファイルシステムへの書き込みを回避するために:
import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';
function convertInMemory(inputBuffer: Buffer): Buffer {
const scene = new Scene();
scene.openFromBuffer(inputBuffer, new ObjLoadOptions());
return scene.saveToBuffer('glb');
}ステップ 4: ワーカースレッドでファイルをバッチ処理する
大規模な変換ジョブでは、Node.js のワーカースレッドに作業を分散させ、複数の CPU コアを活用します::
// worker.ts
import { workerData, parentPort } from 'worker_threads';
import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';
const { inputPath, outputPath } = workerData;
const scene = new Scene();
scene.open(inputPath, new ObjLoadOptions());
scene.save(outputPath);
parentPort?.postMessage({ done: true, output: outputPath });// main.ts: dispatch files to workers
import { Worker } from 'worker_threads';
import * as fs from 'fs';
import * as path from 'path';
const files = fs.readdirSync('./input').filter(f => f.endsWith('.obj'));
for (const file of files) {
const inputPath = path.join('./input', file);
const outputPath = path.join('./output', file.replace('.obj', '.glb'));
const worker = new Worker('./dist/worker.js', {
workerData: { inputPath, outputPath }
});
worker.on('message', msg => console.log(`Converted: ${msg.output}`));
worker.on('error', err => console.error(`Error: ${err}`));
}ステップ 5: 大規模モデルのメモリを監視する
50 MB を超えるファイルについては、ヒープ使用量を監視し、メモリが制限されている場合はファイルを順次処理します::
function logMemory(label: string) {
const used = process.memoryUsage();
console.log(`[${label}] heapUsed: ${Math.round(used.heapUsed / 1024 / 1024)} MB`);
}
logMemory('before load');
const scene = new Scene();
scene.open('large-model.obj');
logMemory('after load');
scene.save('output.glb');
logMemory('after save');非常に大きなモデル向けに Node.js のヒープを増やす::
node --max-old-space-size=8192 convert.jsよくある質問
最もコンパクトな出力フォーマットは何ですか??
埋め込みアセットを含む GLB(バイナリ glTF)は、マテリアルやテクスチャを含むシーンに対して最もコンパクトな単一ファイル出力を実現します。ジオメトリのみのコンテンツでは STL の方がコンパクトです。.
@aspose/3d はメッシュ簡略化や LOD を適用しますか??
いいえ。このライブラリはメッシュトポロジーを変更せずにソースジオメトリを読み書きします。メッシュ簡略化(頂点削減、LOD 生成)はサポートされていません。.
ファイルサイズを削減するためにマテリアルを除去できますか??
設定 ObjSaveOptions.enableMaterials = false OBJ に保存する場合。glTF では、すべてのマテリアル データが常に含まれます; ジオメトリのみの出力には STL を使用してください。.