Aspose.3D FOSS for Java 支持五种 3D 文件格式:: OBJ, STL, glTF, GLB,,以及 FBX (仅导入)。.
所有示例均使用 com.aspose.threed.* 包::
import com.aspose.threed.*;
Maven 依赖::
<dependency>
<groupId>com.aspose</groupId>
<artifactId>aspose-3d-foss</artifactId>
<version>26.1.0</version>
</dependency>
格式概览
在深入了解之前,以下是对四种受支持格式及其典型使用场景的快速概览。.
| 格式 | 扩展名 | 导入 | 导出 | 材料支持 | 场景层次结构 |
|---|---|---|---|---|---|
| OBJ | .obj | 是 | 是 | 基本(MTL 文件) | 平面 |
| STL | .stl | 是 | 是 | 无 | 平面 |
| glTF 2.0 | .gltf | 是 | 是 | PBR | 完整 |
| GLB | .glb | 是 | 是 | PBR | 完整 |
| FBX | .fbx | 是 | 否 | 丰富 | 完整 |
OBJ、STL、glTF 和 GLB 支持导入和导出。FBX 仅支持 仅导入. GLB (binary glTF) 是通过 GltfSaveOptions 使用 setContentType(FileContentType.BINARY).
OBJ:Wavefront Object
OBJ 是最广泛支持的 3D 网格格式之一。它以纯文本方式存储几何数据,并可选地 .mtl 用于材质的伴随文件。.
加载 OBJ 文件
最简单的方法是直接传入文件路径::
Scene scene = Scene.fromFile("model.obj");
如需更精细的控制,请使用 ObjLoadOptions:
ObjLoadOptions opts = new ObjLoadOptions();
Scene scene = Scene.fromFile("model.obj", opts);
当 OBJ 文件引用 MTL 文件(通过 mtllib 指令),库将尝试自动从中加载材质定义。MTL 文件应与 OBJ 文件位于同一目录,或位于指令中指定的路径下。.
保存为 OBJ
Scene scene = Scene.fromFile("input.fbx");
scene.save("output.obj");
OBJ 用例
- 在不同的 3D 工具之间交换网格数据。.
- 从以 OBJ 格式分发的资产库导入模型。.
- 在没有复杂场景层次结构的情况下快速检查几何体。.
STL:立体光刻
STL 是 3D 打印的标准格式。它表示不含材质、颜色或场景层次结构的原始三角网格几何体。STL 文件有两种变体:ASCII(可读的)和二进制(紧凑的)。.
加载 STL 文件
// Simple load
Scene scene = Scene.fromFile("part.stl");
// With explicit options
StlLoadOptions opts = new StlLoadOptions();
Scene scene = Scene.fromFile("part.stl", opts);
保存为 STL
Scene scene = Scene.fromFile("model.obj");
scene.save("output.stl");
要控制输出,请使用 StlSaveOptions:
StlSaveOptions opts = new StlSaveOptions();
scene.save("output.stl", opts);
STL 注意事项
- STL 文件仅包含三角形几何体。材料、纹理和场景层次结构在导出时会丢失。.
- 对于大型模型,二进制 STL 的体积显著小于 ASCII STL。.
- 当目标是 3D 打印机或切片软件时,STL 是首选格式。.
glTF:GL 传输格式
glTF 是一种现代格式,旨在高效传输和加载 3D 内容,尤其是在网页和实时应用中。它支持 PBR 材料、场景层次结构和动画。.
加载 glTF 文件
Scene scene = Scene.fromFile("scene.gltf");
// With options
GltfLoadOptions opts = new GltfLoadOptions();
Scene scene = Scene.fromFile("scene.gltf", opts);
另存为 glTF
基本保存使用文件扩展名来确定格式::
scene.save("output.gltf");
如需精细控制,请使用 GltfSaveOptions:
GltfSaveOptions opts = new GltfSaveOptions();
opts.setFlipCoordinateSystem(true);
opts.setPrettyPrint(true);
scene.save("output.gltf", opts);
GltfSaveOptions 详细信息
| 方法 | 目的 |
|---|---|
setFlipCoordinateSystem(boolean) | 在导出时翻转坐标系轴。用于在 Y 向上 与 Z 向上 之间转换时非常有用。. |
setPrettyPrint(boolean) | 使用缩进格式化输出的 JSON 以提高可读性。设置为 false 以在生产环境中获得更小的文件大小。. |
glTF 用例
- 基于 Web 的 3D 查看器(three.js、Babylon.js)。.
- 实时应用程序和游戏引擎。.
- 在不同工具之间保留 PBR 材质定义。.
FBX: Filmbox(仅导入)
FBX 是 Autodesk 的专有格式,广泛用于游戏开发和数字内容创作。它支持丰富的场景层次结构、材质和动画。Aspose.3D FOSS for Java 支持 FBX 用于 仅导入 – 不支持导出为 FBX。.
加载 FBX 文件
Scene scene = Scene.fromFile("character.fbx");
// With options
FbxLoadOptions opts = new FbxLoadOptions();
Scene scene = Scene.fromFile("character.fbx", opts);
将 FBX 转换为其他格式
由于不支持 FBX 导出,请将已导入的 FBX 场景转换为 glTF、GLB、OBJ 或 STL::
Scene scene = Scene.fromFile("character.fbx");
// Save as GLB
GltfSaveOptions opts = new GltfSaveOptions();
opts.setContentType(FileContentType.BINARY);
scene.save("character.glb", opts);
FBX 使用场景
- 从 Autodesk 工具(Maya、3ds Max)导入资产并转换为其他格式。.
- 加载已绑定骨骼的角色和动画场景,以重新导出为 glTF/GLB。.
批量转换
常见的工作流程是将整个目录的文件从一种格式转换为另一种格式。以下是批量转换的示例模式::
import com.aspose.threed.*;
import java.io.File;
public class BatchConvert {
public static void main(String[] args) throws Exception {
File inputDir = new File("models/obj");
File outputDir = new File("models/gltf");
outputDir.mkdirs();
GltfSaveOptions saveOpts = new GltfSaveOptions();
saveOpts.setPrettyPrint(true);
File[] objFiles = inputDir.listFiles(
(dir, name) -> name.toLowerCase().endsWith(".obj")
);
if (objFiles == null) return;
for (File objFile : objFiles) {
String baseName = objFile.getName()
.replaceFirst("\\.obj$", "");
Scene scene = Scene.fromFile(objFile.getAbsolutePath());
String outPath = new File(outputDir, baseName + ".gltf")
.getAbsolutePath();
scene.save(outPath, saveOpts);
System.out.println("Converted: " + objFile.getName()
+ " -> " + baseName + ".gltf");
}
}
}
这将加载每个 .obj 目录中的文件,将每个文件转换为带有美化输出的 glTF,并保存结果。您可以将此模式适用于任何源格式和目标格式的组合。.
跨格式转换参考
下表展示了在不同格式之间转换时的预期情况。.
| 从 | 到 | 几何 | 材料 | 层级 | 注释 |
|---|---|---|---|---|---|
| OBJ | STL | 已保留 | 已丢失 | N/A | STL 不支持材质 |
| OBJ | glTF/GLB | 已保留 | 已转换为 PBR | 平面 | 已在可能的情况下映射 MTL 材质 |
| STL | OBJ | 已保留 | 无 | N/A | 源中没有材质 |
| STL | glTF/GLB | 已保留 | 默认 | 平面 | 已应用默认材质 |
| glTF | OBJ | 已保留 | 简化 | 已展平 | PBR 转为基础材质 |
| glTF | STL | 已保留 | 已丢失 | 已展平 | 仅几何体 |
| FBX | OBJ | 已保留 | 简化 | 扁平化 | 材料简化 |
| FBX | STL | 已保留 | 已丢失 | 已展平 | 仅几何体 |
| FBX | glTF/GLB | 已保留 | 已转换为 PBR | 已保留 | 良好保真度 |
通用转换指南
- 几何 在所有格式对中始终保持不变。.
- 材质 在 glTF 和 FBX 之间表现最佳,两者都支持丰富的材质模型。转换为 STL 时始终会丢失材质。转换为 OBJ 则会将材质简化为基本的 MTL 模型。.
- 场景层次结构 在 glTF 和 FBX 之间得以保留。OBJ 和 STL 则生成平面结构。.
综合起来
下面是一个完整示例,加载 OBJ 文件,检查其节点,并导出为 glTF 和 GLB::
import com.aspose.threed.*;
public class FormatWorkflow {
public static void main(String[] args) throws Exception {
// Load
Scene scene = Scene.fromFile("input.obj");
// Inspect
System.out.println("Nodes in scene:");
for (Node child : scene.getRootNode().getChildNodes()) {
System.out.println(" " + child.getName());
Transform t = child.getTransform();
System.out.println(" Translation: "
+ t.getTranslation());
}
// Export to glTF with options
GltfSaveOptions gltfOpts = new GltfSaveOptions();
gltfOpts.setPrettyPrint(true);
scene.save("output.gltf", gltfOpts);
// Export to GLB (binary glTF)
GltfSaveOptions glbOpts = new GltfSaveOptions();
glbOpts.setContentType(FileContentType.BINARY);
scene.save("output.glb", glbOpts);
System.out.println("Export complete.");
}
}
总结
Aspose.3D FOSS 为 Java 提供的一致 API,跨多种格式。关键要点::
- OBJ – 简单网格交换,使用基础材质。.
- STL – 仅几何体格式,适用于 3D 打印流水线。.
- glTF / GLB – 现代支持 PBR 的格式,适用于网页和实时使用。使用
GltfSaveOptions使用setContentType(FileContentType.BINARY)用于 GLB 输出。. - FBX – 仅导入;丰富的格式用于从游戏引擎和 DCC 工具加载资产。.
使用特定格式的 load 和 save 选项类(ObjLoadOptions, StlLoadOptions, StlSaveOptions, GltfLoadOptions, GltfSaveOptions, FbxLoadOptions)当您需要对 import 或 export 过程进行细粒度控制时。.
欲了解更多细节,请访问 Aspose.3D 文档 或在以下位置浏览源码 GitHub.