Як виправити помилки 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‑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);
}