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.gltfPBR完整
GLB.glbPBR完整
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,并保存结果。您可以将此模式适用于任何源格式和目标格式的组合。.

跨格式转换参考

下表展示了在不同格式之间转换时的预期情况。.

几何材料层级注释
OBJSTL已保留已丢失N/ASTL 不支持材质
OBJglTF/GLB已保留已转换为 PBR平面已在可能的情况下映射 MTL 材质
STLOBJ已保留N/A源中没有材质
STLglTF/GLB已保留默认平面已应用默认材质
glTFOBJ已保留简化已展平PBR 转为基础材质
glTFSTL已保留已丢失已展平仅几何体
FBXOBJ已保留简化扁平化材料简化
FBXSTL已保留已丢失已展平仅几何体
FBXglTF/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.