Как конвертировать 3D модели в TypeScript
Aspose.3D FOSS for TypeScript преобразует между 3D‑форматами, загружая их в нейтральное Scene представление и сохраняя в целевой формат. Это руководство показывает наиболее распространённые преобразования.
Пошаговое руководство
Шаг 1: Установите @aspose/3d
npm install @aspose/3dШаг 2: Загрузить исходный файл
Создайте Scene и вызовите scene.open(). Используйте специфичный для формата класс *LoadOptions для получения наилучших результатов.
import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';
const scene = new Scene();
const opts = new ObjLoadOptions();
opts.enableMaterials = true;
scene.open('model.obj', opts);Шаг 3: Сохранить в целевом формате
Вызовите scene.save() с путем вывода. Формат вывода определяется по расширению файла.
// OBJ → glTF binary (GLB)
scene.save('output.glb');
// OBJ → STL
scene.save('output.stl');
// OBJ → COLLADA
scene.save('output.dae');Примечание: FBX не поддерживается автоопределением
scene.save(). Расширение.fbxне привязано к какому‑либо экспортеру — сохранение в.fbxтихо записывает контент в формате OBJ. Используйте OBJ, glTF, STL, 3MF или COLLADA для надёжного вывода.
Шаг 4: Общие примеры конвертации
OBJ в glTF / GLB
import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';
const scene = new Scene();
scene.open('model.obj', new ObjLoadOptions());
scene.save('model.glb');
console.log('Converted OBJ → GLB');FBX — Не поддерживается
Автоматическое определение FBX не реализовано в
scene.open(). Файл.fbx, переданный вscene.open(), не распознаётся ни одним детектором формата и попадает в парсер STL, который завершится ошибкой или выдаст мусор. Классы импорта/экспорта FBX присутствуют в библиотеке, но требуют прямого вызова, а не использования высокоуровневого APIopen()/save(). Используйте COLLADA, OBJ или glTF в качестве альтернативы FBX.
glTF в STL
import { Scene } from '@aspose/3d';
const scene = new Scene();
scene.open('model.glb');
scene.save('model.stl');
console.log('Converted GLB → STL');COLLADA в 3MF
import { Scene } from '@aspose/3d';
const scene = new Scene();
scene.open('model.dae');
scene.save('model.3mf');
console.log('Converted COLLADA → 3MF');Шаг 5: Пакетное преобразование нескольких файлов
import * as fs from 'fs';
import * as path from 'path';
import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';
const inputDir = './input';
const outputDir = './output';
fs.mkdirSync(outputDir, { recursive: true });
const objFiles = fs.readdirSync(inputDir).filter(f => f.endsWith('.obj'));
for (const file of objFiles) {
const inputPath = path.join(inputDir, file);
const outputFile = file.replace('.obj', '.glb');
const outputPath = path.join(outputDir, outputFile);
const scene = new Scene();
scene.open(inputPath, new ObjLoadOptions());
scene.save(outputPath);
console.log(`Converted ${file} → ${outputFile}`);
}Поддерживаемая матрица преобразования
| От \ До | glTF/GLB | OBJ | STL | FBX | 3MF | COLLADA |
|---|---|---|---|---|---|---|
| OBJ | ✓ | ✓ | ✓ | ✗ | ✓ | ✓ |
| glTF/GLB | ✓ | ✓ | ✓ | ✗ | ✓ | ✓ |
| FBX | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ |
| STL | ✓ | ✓ | ✓ | ✗ | ✓ | ✓ |
| 3MF | ✓ | ✓ | ✓ | ✗ | ✓ | ✓ |
| COLLADA | ✓ | ✓ | ✓ | ✗ | ✓ | ✓ |
FBX не поддерживается через высокоуровневый open()/save() API — формат не подключён к автоматическому определению. Все ячейки FBX выше отмечены ✗.
Распространённые проблемы и решения
Материалы теряются после конвертации
Материалы OBJ (usemtl, .mtl файл) загружаются, когда ObjLoadOptions.enableMaterials = true. При сохранении в glTF свойства материалов PBR автоматически сопоставляются. Сложные материалы (процедурные, многослойные) могут конвертироваться с пониженной точностью.
Сетка отображается с неправильным масштабом
Разные форматы используют разные единицы измерения по умолчанию (миллиметры для STL, метры для glTF). Используйте ObjLoadOptions.scale при загрузке или StlSaveOptions.scaleFactor при сохранении для нормализации единиц.
Несоответствие системы координат (модель перевёрнута или повернута)
Некоторые форматы используют правостороннюю систему координат Y‑up, другие — Z‑up. Используйте ObjLoadOptions.flipCoordinateSystem = true или примените вращение к корневому узлу после загрузки.
Часто задаваемые вопросы
Сохраняет ли преобразование анимацию?
Данные анимации сохраняются при конвертации между форматами, которые их поддерживают (например, COLLADA → glTF). STL и OBJ не содержат данные анимации. FBX не поддерживается через scene.open()/scene.save(), поэтому обратные преобразования анимации FBX недоступны через высокоуровневый API.
Сохраняются ли данные текстуры?
Текстуры, на которые ссылаются материалы OBJ или встроенные в glTF, переносятся в граф сцены. При сохранении в GLB (binaryMode = true) бинарный буфер встраивается в один файл. При выводе OBJ текстуры сохраняются как отдельные файлы рядом с .obj.
Могу ли я конвертировать несколько файлов параллельно?
scene.open() и scene.save() являются синхронными. Используйте Node.js worker_threads для параллельной обработки.