如何在 TypeScript 中转换 3D 模型

如何在 TypeScript 中转换 3D 模型

Aspose.3D FOSS for TypeScript 通过加载为中性 Scene 表示并保存为目标格式,实现 3D 格式之间的转换。本文指南展示了最常见的转换。

分步指南

步骤 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 不受支持 by 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 导入/导出类,但需要直接调用,而不是使用高级 open()/save() API。使用 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 向上,其他则是 Z 向上。使用 ObjLoadOptions.flipCoordinateSystem = true 或在加载后对根节点应用旋转。


常见问题

转换是否保留动画?

在转换支持动画的格式之间时(例如,COLLADA → glTF),动画数据会被保留。STL 和 OBJ 不携带动画数据。FBX 通过 scene.open()/scene.save() 不受支持,因此通过高级 API 无法进行 FBX 动画的往返转换。

是否保留纹理数据?

OBJ 材质引用的纹理或嵌入在 glTF 中的纹理会被保留到场景图中。保存为 GLB(binaryMode = true)时,二进制缓冲区会嵌入到单个文件中。对于 OBJ 输出,纹理会作为单独的文件与 .obj 一起保存。

我可以并行转换多个文件吗?

scene.open()scene.save() 是同步的。使用 Node.js worker_threads 进行并行处理。


另请参阅

 中文