Как конвертировать 3D модели в TypeScript

Как конвертировать 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 присутствуют в библиотеке, но требуют прямого вызова, а не использования высокоуровневого API open()/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/GLBOBJSTLFBX3MFCOLLADA
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 для параллельной обработки.


См. также

 Русский