TypeScriptで3Dモデルエラーを修正する方法

TypeScriptで3Dモデルエラーを修正する方法

このガイドでは、TypeScript と Node.js で @aspose/3d を使用する際の最も一般的なエラーと、それぞれの実用的な修正方法を取り上げています。

ステップバイステップ ガイド

ステップ 1: インストールとバージョンの確認

サポートされている Node.js バージョン(18、20、または 22)を使用しており、パッケージがインストールされていることを確認してください:

node --version          # Must be v18 or later
npm list @aspose/3d     # Should show the installed version

パッケージが見つからない場合は、再インストールしてください:

npm install @aspose/3d

ステップ 2: モジュール解決エラーの修正

エラー: Cannot find module '@aspose/3d/formats/obj'

サブパスインポートには Node.js 12.7 以降のパッケージエクスポートが必要です。TypeScript では、正しいモジュール解決を設定してください:

// tsconfig.json
{
  "compilerOptions": {
    "target": "ES2020",
    "module": "commonjs",
    "moduleResolution": "node16",
    "strict": true
  }
}

ESM プロジェクトの場合は、"module": "ES2022""moduleResolution": "bundler" を使用してください。


ステップ3: 読み込み後に空のシーンをデバッグする

scene.open() の後で scene.rootNode.childNodes が空の場合:

import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';

const scene = new Scene();
scene.open('model.obj', new ObjLoadOptions());

console.log(`Child nodes: ${scene.rootNode.childNodes.length}`);

一般的な原因:

  1. 誤ったフォーマットオプション: OBJの場合、常にnew ObjLoadOptions()を渡してください。汎用オプションを使用すると、フォーマット検出が妨げられる可能性があります。

  2. ファイルパスが間違っている: ライブラリはファイルが見つからない場合、黙って空のシーンをロードします:

import * as fs from 'fs';

const filePath = 'model.obj';
if (!fs.existsSync(filePath)) {
    throw new Error(`File not found: ${filePath}`);
}
const scene = new Scene();
scene.open(filePath, new ObjLoadOptions());
  1. OBJ ファイルが非標準の改行を使用しています: テキストエディタで開き、ファイルが有効であることを確認してください。

ステップ 4: 座標系の問題を修正

形式間の座標系の違いにより、モデルが回転したり、鏡像化されたり、スケールが正しく表示されないことがあります。

右手系 vs 左手系、Y-up vs Z-up:

import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';

const options = new ObjLoadOptions();
options.flipCoordinateSystem = true;  // Swap Y and Z axes

const scene = new Scene();
scene.open('model.obj', options);

スケールの問題(例:STLはミリメートル、glTFはメートル):

import { ObjLoadOptions } from '@aspose/3d/formats/obj';

const options = new ObjLoadOptions();
options.scale = 0.001;  // Convert millimeters to meters

const scene = new Scene();
scene.open('model.obj', options);

ステップ 5: 大きなファイルのメモリ問題に対処する

100 MB を超えるファイルの場合、Node.js のヒープサイズを増やしてください:

node --max-old-space-size=4096 convert.js

または package.json に設定します:

{
  "scripts": {
    "convert": "node --max-old-space-size=4096 dist/convert.js"
  }
}

大きなファイルは並列で処理せず、1つずつ処理して、ピークメモリの問題を回避してください。


共通エラーリファレンス

エラー考えられる原因修正
Cannot find module '@aspose/3d/formats/obj'モジュール解決設定tsconfig に moduleResolution: node16 を設定
scene.rootNode.childNodes は空ですオプションが間違っているか、ファイルが見つかりませんファイルパスを確認し、正しい *LoadOptions を渡す
ジオメトリが鏡像/反転して表示される座標系の不一致flipCoordinateSystem = true を設定
ジオメトリがスケールが不正確に表示されるフォーマット間の単位差ロードオプションで scale を設定
ENOMEM またはプロセスが終了した大きなファイルに対するメモリ不足--max-old-space-size を増やす
node.entity に対する TypeScript 型エラーエンティティ型が広すぎるinstanceof Mesh ガードを使用

よくある質問

パースバグを報告するにはどうすればよいですか?

フォーマット名、最小限の再現可能なファイル、および正確なエラーメッセージを添えて、GitHub リポジトリで issue を作成してください。

なぜ一部のメッシュは制御点がゼロになるのですか?

一部の OBJ グループは、位置データなしでテクスチャ座標または法線のみを定義します。処理する前に mesh.controlPoints.length > 0 を確認してください。

ライブラリはパースエラーを黙って無視します。どうすればそれらを検出できますか?

scene.open() を try/catch ブロックでラップしてください。ファイルが不正な形式の場合、ライブラリは例外をスローするか、部分的なシーンをロードする可能性があります:

try {
    scene.open('model.obj', new ObjLoadOptions());
} catch (err) {
    console.error('Failed to load:', err);
}

参照

 日本語