에서 소개 게시물, 우리는 Aspose.3D FOSS for Java가 무엇인지와 시작 방법을 다루었습니다. 이 게시물은 라이브러리를 구성하는 핵심 기능들을 더 깊이 살펴보며, 각 영역에 대한 코드 예제를 제공합니다.

모든 예제는 다음과 같은 import를 전제로 합니다:

import com.aspose.threed.*;

그리고 Maven 의존성은 다음과 같습니다:

<dependency>
    <groupId>com.aspose</groupId>
    <artifactId>aspose-3d-foss</artifactId>
    <version>26.1.0</version>
</dependency>

Scene Graph API

씬 그래프는 Aspose.3D FOSS for Java의 기반입니다. 파일에서 로드되든 프로그래밍 방식으로 생성되든 모든 3D 모델은 루트가 있는 노드 트리로 표현됩니다. a 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

A 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 and Mesh

An 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

Camera는 노드에 부착되는 엔티티입니다:

Scene scene = new Scene();

Node cameraNode = scene.getRootNode().createChildNode("MainCamera");
// Camera entity can be assigned to the node

참고:Camera Java 에디션의 class는 생성자만 포함된 최소 스텁입니다. 노드에 연결된 Camera 엔티티는 작성되지 않음 glTF 또는 다른 형식으로 내보낼 때 — glTF 내보내기 도구는 오직 Mesh 엔티티만 처리합니다. 내보낸 파일에서 카메라 데이터가 보존된다고 기대하지 마세요.

참고:Light 클래스는 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 출력에 자연스럽게 매핑됩니다.

Transform 및 Spatial

모든 Node 씬 그래프에 있는 것은 Transform 그것의 위치, 회전 및 스케일을 부모에 상대적으로 정의합니다.

Local 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

Global Transform

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

위치, 방향, 법선 및 색상을 나타내는 3요소 벡터입니다.

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 constructed directly with min/max Vector3 values

참고: Node.getBoundingBox()Entity.getBoundingBox() 는 아직 구현되지 않았습니다. 두 메서드 모두 빈 BoundingBox (센티넬 Double.MAX_VALUE / Double.MIN_VALUE 값) 을 반환하며, 메시 기하학과 무관합니다. 이 버전에서는 실제 기하학 경계를 계산하기 위해 이러한 메서드를 사용하지 마십시오.

알려진 제한 사항

주목할 만한 점은 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, BoundingBox3D math primitives

다음 포스트에서는 OBJ, STL, glTF, FBX를 다루는 실용적인 포맷별 튜토리얼을 자세한 로드 및 저장 옵션과 함께 살펴볼 예정입니다.