Як виправити помилки 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 у міліметрах проти 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 guard

Поширені запитання

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

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

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

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

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

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

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

Див. також

 Українська