Как исправить ошибки 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‑вверх vs Z‑вверх:

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 МБ увеличьте размер кучи 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);
}

См. также

 Русский