Как исправить ошибки 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}`);Распространённые причины:
- Неправильные параметры формата: для OBJ всегда передавать
new ObjLoadOptions(). Использование общих параметров может препятствовать определению формата. - Неправильный путь к файлу: библиотека молча загружает пустую сцену, если файл не найден:
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());- Файл 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);
}