Як виправити помилки 3D‑моделей у TypeScript

Як виправити помилки 3D‑моделей у TypeScript

У цьому посібнику розглядаються найпоширеніші помилки при використанні @aspose/3d для TypeScript та Node.js, з практичними виправленнями для кожної.

Покроковий посібник

Крок 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.rootNode.childNodes порожній після scene.open():

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 у міліметрах vs 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 МБ збільшіть розмір heap у Node.js:

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

Або встановіть його в package.json:

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

Обробляйте великі файли по одному, а не паралельно, щоб уникнути пікових проблем з пам’яттю.


Загальний довідник помилок

ПомилкаЙмовірна причинаВиправлення
Cannot find module '@aspose/3d/formats/obj'Конфігурація розв’язання модулівВстановити moduleResolution: node16 у tsconfig
scene.rootNode.childNodes порожнійНеправильні параметри або файл не знайденоПеревірте шлях до файлу; передайте правильний *LoadOptions
Геометрія виглядає віддзеркаленою/перевернутоюНесумісність системи координатВстановити flipCoordinateSystem = true
Геометрія виглядає неправильно масштабованоюРізниця одиниць між форматамиВстановити scale у параметрах завантаження
ENOMEM або процес завершеноНедостатньо пам’яті для великого файлуЗбільшити --max-old-space-size
Помилка типу TypeScript на node.entityШирокий тип сутностіВикористовувати instanceof Mesh захисник

Часті запитання

Як повідомити про помилку парсингу?

Відкрити issue у репозиторій GitHub з назвою формату, мінімальним відтворюваним файлом та точним повідомленням про помилку.

Чому деякі сітки мають нульову кількість контрольних точок?

Деякі групи OBJ визначають лише координати текстури або нормалі без даних про позицію. Перевірте mesh.controlPoints.length > 0 перед обробкою.

Бібліотека тихо ігнорує помилки парсингу. Як їх виявити?

Обгорніть scene.open() у блок try/catch. Якщо файл пошкоджений, бібліотека може кинути виключення або завантажити часткову сцену:

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

Дивіться також

 Українська