在 介绍文章,,我们介绍了 Aspose.3D FOSS for Java 是什么以及如何入门。本文将更深入地探讨构成库的关键特性,并为每个领域提供代码示例。.
所有示例均假设已进行以下导入::
import com.aspose.threed.*;
以及 Maven 依赖::
<dependency>
<groupId>com.aspose</groupId>
<artifactId>aspose-3d-foss</artifactId>
<version>26.1.0</version>
</dependency>
场景图 API
场景图是 Aspose.3D FOSS for Java 的基础。每个 3D 模型——无论是从文件加载还是通过程序构建——都表示为以一个 Scene 对象。.
Scene
该 Scene 类是所有操作的入口点。您可以创建一个空场景或从文件加载场景::
// Empty scene
Scene scene = new Scene();
// Load from file
Scene loaded = Scene.fromFile("model.obj");
// Load with explicit options
Scene fromStl = Scene.fromFile("part.stl", new StlLoadOptions());
节点树的根可以通过 getRootNode().
Node
一个 Node 表示场景树中的一个命名位置。节点可以有子节点,形成层级结构。每个节点携带一个本地 Transform 以及一个计算得到的 GlobalTransform.
Scene scene = new Scene();
// Create a child node under the root
Node box = scene.getRootNode().createChildNode("Box");
// Create a nested hierarchy
Node arm = scene.getRootNode().createChildNode("Arm");
Node hand = arm.createChildNode("Hand");
Node finger = hand.createChildNode("Finger");
您也可以独立构建节点并在之后将其附加::
Node standalone = new Node("Standalone");
scene.getRootNode().getChildNodes().add(standalone);
实体与网格
一个 Entity 是一个抽象基类,用于可以附加到节点上的任何对象——几何体、相机和灯光。最常见的实体类型是 Mesh,,它保存多边形几何(顶点、面和法线)。.
Scene scene = Scene.fromFile("cube.obj");
// Traverse nodes and inspect entities
for (Node child : scene.getRootNode().getChildNodes()) {
Entity entity = child.getEntity();
if (entity instanceof Mesh) {
Mesh mesh = (Mesh) entity;
System.out.println("Node: " + child.getName());
System.out.println(" Vertices: " + mesh.getControlPoints().size());
}
}
Camera
相机是附加到节点的实体::
Scene scene = new Scene();
Node cameraNode = scene.getRootNode().createChildNode("MainCamera");
// Camera entity can be assigned to the node
在导出到支持相机定义的格式(例如 glTF)时,摄像机定义会被保留。.
注意:: 该 Light class 在 Java 版中不可用。导入文件的场景光照数据存储为通用的 Entity 对象。.
与格式无关的加载与保存
该库的优势之一是场景图与格式无关。您可以从任何受支持的格式加载,使用统一的 API 操作场景,然后保存为任何受支持的格式。.
// Load OBJ, save as glTF
Scene scene = Scene.fromFile("input.obj");
scene.save("output.gltf");
// Load FBX, save as STL (FBX is import only)
Scene scene2 = Scene.fromFile("character.fbx");
scene2.save("character.stl");
// Load STL, save as GLB
Scene scene3 = Scene.fromFile("part.stl", new StlLoadOptions());
GltfSaveOptions opts = new GltfSaveOptions();
opts.setContentType(FileContentType.BINARY);
scene3.save("part.glb", opts);
格式由文件扩展名决定。您也可以传递显式的保存选项来控制输出::
GltfSaveOptions opts = new GltfSaveOptions();
opts.setFlipCoordinateSystem(true);
opts.setPrettyPrint(true);
scene.save("output.gltf", opts);
材质
Aspose.3D FOSS for Java 提供了一个 PBR(Physically Based Rendering)材质模型,通过 PbrMaterial. 这是在 Java 版中唯一的具体材质类。.
PbrMaterial
一种基于物理的渲染材质,使用反照率、金属度和粗糙度参数。这是 glTF 和现代实时引擎的标准材质模型。.
PbrMaterial pbr = new PbrMaterial();
pbr.setAlbedo(new Vector4(0.8, 0.2, 0.2, 1.0)); // Red-ish base color
pbr.setMetallicFactor(0.0); // Non-metallic
pbr.setRoughnessFactor(0.5); // Medium roughness
跨格式的材质保留取决于目标格式的能力。PBR 材质可以自然映射到 glTF 和 GLB 输出。.
变换与空间
每个 Node 在场景图中拥有一个 Transform 它定义了相对于其父节点的位置、旋转和缩放。.
局部变换
Scene scene = new Scene();
Node node = scene.getRootNode().createChildNode("TestNode");
Transform t = node.getTransform();
t.setTranslation(1, 2, 3); // Position
t.setScale(2, 2, 2); // Uniform scale
t.setEulerAngles(0, 45, 0); // Euler rotation in degrees
全局变换
该 GlobalTransform 是计算得到的世界空间变换,考虑了整个父链。它是只读的,并会自动更新。.
Node parent = scene.getRootNode().createChildNode("Parent");
parent.getTransform().setTranslation(10, 0, 0);
Node child = parent.createChildNode("Child");
child.getTransform().setTranslation(5, 0, 0);
// Child's global position is (15, 0, 0)
GlobalTransform global = child.getGlobalTransform();
这种父子变换继承遵循 3D 引擎和 DCC 工具使用的标准场景图模式。.
数学工具
该库包含用于 3D 操作的核心数学类型。.
Vector3
一种用于位置、方向、法线和颜色的三分量向量。.
Vector3 a = new Vector3(1, 0, 0);
Vector3 b = new Vector3(0, 1, 0);
// Addition
Vector3 sum = Vector3.add(a, b); // (1, 1, 0)
Matrix4
一个 4x4 变换矩阵,用于将平移、旋转和缩放合并为单一操作。.
Matrix4 mat = new Matrix4();
// Matrix4 is used internally by transforms
// and can be retrieved from GlobalTransform
Quaternion
一种避免万向锁并实现平滑插值的旋转表示。四元数在变换系统内部使用。.
BoundingBox
用于空间查询、碰撞检测和场景分析的轴对齐包围盒。.
BoundingBox bbox = new BoundingBox();
// BoundingBox can be computed from mesh geometry
已知限制
值得注意的是 Scene.render() 是 不受支持 在 FOSS 版中。调用它将抛出一个 UnsupportedOperationException.。该库旨在用于基于文件的 3D 处理——加载、变换和保存——而非实时渲染。.
摘要
Aspose.3D FOSS for Java 的关键特性分为五个领域::
| 区域 | 类 | 目的 |
|---|---|---|
| 场景图 | Scene, Node, Entity, Mesh, Camera | 层次模型表示 |
| 格式 | OBJ、STL、glTF/GLB 的加载/保存选项;FBX 的加载 | 格式无关的 I/O |
| 材质 | PbrMaterial | 表面外观(PBR) |
| 变换 | Transform, GlobalTransform | 空间定位 |
| 数学 | Vector3, Matrix4, Quaternion, BoundingBox | 3D math primitives |
在下一篇文章中,我们将逐步演示实用的逐格式教程,涵盖 OBJ、STL、glTF 和 FBX,并提供详细的加载和保存选项。.