TypeScriptで3Dモデルを変換する方法
Aspose.3D FOSS for TypeScript は、3D フォーマット間の変換を中立的な Scene 表現にロードし、ターゲット形式に保存することで行います。このガイドでは、最も一般的な変換を示します。
ステップバイステップガイド
ステップ 1: @aspose/3d をインストール
npm install @aspose/3dステップ 2: ソース ファイルをロード
Scene を作成し、scene.open() を呼び出します。ベストな結果を得るには、フォーマット固有の *LoadOptions クラスを使用してください。
import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';
const scene = new Scene();
const opts = new ObjLoadOptions();
opts.enableMaterials = true;
scene.open('model.obj', opts);ステップ 3: ターゲット形式に保存
scene.save() を出力パスで呼び出します。出力形式はファイル拡張子から検出されます。
// OBJ → glTF binary (GLB)
scene.save('output.glb');
// OBJ → STL
scene.save('output.stl');
// OBJ → COLLADA
scene.save('output.dae');Note: FBX は
scene.save()の自動検出では サポートされていません。.fbx拡張子はエクスポーターに接続されていません —.fbxに保存すると、静かに OBJ フォーマットの内容が書き込まれます。信頼できる出力のために OBJ、glTF、STL、3MF、または COLLADA を使用してください。
ステップ 4: 一般的な変換例
OBJ から glTF / GLB へ
import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';
const scene = new Scene();
scene.open('model.obj', new ObjLoadOptions());
scene.save('model.glb');
console.log('Converted OBJ → GLB');FBX — サポートされていません
FBX の自動検出は
scene.open()に組み込まれていません。.fbxファイルがscene.open()に渡されると、いずれのフォーマット検出器でも認識されず、STL パーサにフォールスルーします。その結果、失敗するかゴミが生成されます。ライブラリには FBX インポーター/エクスポーター クラスが存在しますが、高レベルのopen()/save()API ではなく、直接呼び出す必要があります。FBX の代替として COLLADA、OBJ、または glTF を使用してください。
glTF から STL へ
import { Scene } from '@aspose/3d';
const scene = new Scene();
scene.open('model.glb');
scene.save('model.stl');
console.log('Converted GLB → STL');COLLADA から 3MF へ
import { Scene } from '@aspose/3d';
const scene = new Scene();
scene.open('model.dae');
scene.save('model.3mf');
console.log('Converted COLLADA → 3MF');ステップ5:複数ファイルを一括変換
import * as fs from 'fs';
import * as path from 'path';
import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';
const inputDir = './input';
const outputDir = './output';
fs.mkdirSync(outputDir, { recursive: true });
const objFiles = fs.readdirSync(inputDir).filter(f => f.endsWith('.obj'));
for (const file of objFiles) {
const inputPath = path.join(inputDir, file);
const outputFile = file.replace('.obj', '.glb');
const outputPath = path.join(outputDir, outputFile);
const scene = new Scene();
scene.open(inputPath, new ObjLoadOptions());
scene.save(outputPath);
console.log(`Converted ${file} → ${outputFile}`);
}サポートされている変換マトリックス
| 変換元 \ 変換先 | glTF/GLB | OBJ | STL | FBX | 3MF | COLLADA |
|---|---|---|---|---|---|---|
| OBJ | ✓ | ✓ | ✓ | ✗ | ✓ | ✓ |
| glTF/GLB | ✓ | ✓ | ✓ | ✗ | ✓ | ✓ |
| FBX | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ |
| STL | ✓ | ✓ | ✓ | ✗ | ✓ | ✓ |
| 3MF | ✓ | ✓ | ✓ | ✗ | ✓ | ✓ |
| COLLADA | ✓ | ✓ | ✓ | ✗ | ✓ | ✓ |
FBX は高レベル open()/save() API ではサポートされていません — フォーマットは自動検出に組み込まれていません。上記のすべての FBX セルは ✗ です。
一般的な問題と対処法
変換後に素材が失われます
OBJマテリアル(usemtl、.mtlファイル)はObjLoadOptions.enableMaterials = true時にロードされます。glTFに保存する際、PBRマテリアルプロパティは自動的にマッピングされます。複雑なマテリアル(プロシージャル、マルチレイヤー)は、忠実度が低下した状態で変換される可能性があります。
メッシュが正しくスケーリングされていません
異なるフォーマットは異なるデフォルト単位を使用します(STL はミリメートル、glTF はメートル)。ロード時には ObjLoadOptions.scale を、保存時には StlSaveOptions.scaleFactor を使用して単位を正規化してください。
座標系の不一致(モデルが反転または回転している)
一部のフォーマットは右手座標系で Y が上向き、他は Z が上向きです。ObjLoadOptions.flipCoordinateSystem = true を使用するか、ロード後にルートノードに回転を適用してください。
よくある質問
変換はアニメーションを保持しますか?
アニメーションデータは、対応フォーマット間の変換時に保持されます(例:COLLADA → glTF)。STL と OBJ にはアニメーションデータが含まれません。FBX は scene.open()/scene.save() ではサポートされていないため、FBX アニメーションのラウンドトリップは高レベル API では利用できません。
テクスチャ データは保持されますか?
OBJ マテリアルで参照されるテクスチャや glTF に埋め込まれたテクスチャは、シーン グラフに引き継がれます。GLB(binaryMode = true)に保存する場合、バイナリ バッファは単一ファイルに埋め込まれます。OBJ 出力の場合、テクスチャは .obj と同じ場所に別ファイルとして保存されます。
複数のファイルを同時に変換できますか?
scene.open() と scene.save() は同期です。並列処理には Node.js worker_threads を使用してください。