În postarea de introducere, am acoperit ce este Aspose.3D FOSS pentru Java și cum să începi. Această postare intră în profunzime în funcționalitățile cheie care compun biblioteca, cu exemple de cod pentru fiecare zonă.

Toate exemplele presupun următoarea importare:

import com.aspose.threed.*;

Și dependența Maven:

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

API Grafică de Scenă

Graful de scenă este fundamentul Aspose.3D FOSS pentru Java. Fiecare model 3D – fie încărcat dintr-un fișier, fie construit programatic – este reprezentat ca un arbore de noduri cu rădăcina într-un Scene obiect.

Scenă

Clasa Scene este punctul de intrare pentru toate operațiile. Poți crea o scenă goală sau încărca una dintr-un fișier:

// 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());

Rădăcina arborelui de noduri este accesată prin getRootNode().

Nod

Un Node reprezintă o poziție numită în arborele de scenă. Nodurile pot avea copii, formând o ierarhie. Fiecare nod poartă un local Transform și un calculat 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");

Poți, de asemenea, să construiești noduri independent și să le atașezi mai târziu:

Node standalone = new Node("Standalone");
scene.getRootNode().getChildNodes().add(standalone);

Entitate și Mesh

Un Entity este o clasă de bază abstractă pentru orice poate fi atașat unui nod – geometrie, camere și lumini. Cel mai comun tip de entitate este Mesh, care conține geometrie poligonală (vârfuri, fețe și normale).

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());
    }
}

Cameră

Camerele sunt entități care se atașează nodurilor:

Scene scene = new Scene();

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

Notă: Clasa Camera clasa din ediția Java este un stub minimal cu doar constructori. Entitățile de cameră atașate nodurilor sunt ne scrise la exportarea în glTF sau orice alt format — exportatorul glTF procesează doar Mesh entități. Nu vă bazați pe păstrarea datelor camerei în fișierele exportate.

Notă: Clasa Light clasa nu este disponibilă în ediția Java. Datele de iluminare a scenei din fișierele importate sunt stocate ca generice Entity obiecte.

Încărcare și salvare independentă de format

Una dintre punctele forte ale bibliotecii este că graful scenei este independent de format. Încărcați din orice format suportat, manipulați scena printr-un singur API și salvați în orice format suportat.

// 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);

Formatul este determinat de extensia fișierului. De asemenea, puteți transmite opțiuni explicite de salvare pentru a controla rezultatul:

GltfSaveOptions opts = new GltfSaveOptions();
opts.setFlipCoordinateSystem(true);
opts.setPrettyPrint(true);

scene.save("output.gltf", opts);

Materiale

Aspose.3D FOSS pentru Java oferă un model de material PBR (Physically Based Rendering) prin PbrMaterial.Aceasta este singura clasă de material concretă în ediția Java.

PbrMaterial

Un material de redare bazat pe fizică care folosește parametrii albedo, metalicitate și rugozitate. Acesta este modelul standard de material pentru glTF și motoarele moderne în timp real.

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

Păstrarea materialelor între formate depinde de capabilitățile formatului țintă. Materialele PBR se mapă natural la ieșirile glTF și GLB.

Transformare și Spațial

Fiecare Node din graficul scenei are un Transform care definește poziția, rotația și scala relativ la părinte.

Transformare locală

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

Transformare globală

Transformarea GlobalTransform este transformarea calculată în spațiul lumii, luând în considerare întreaga lanță de părinți. Aceasta este doar în citire și se actualizează automat.

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();

Această moștenire a transformărilor părinte-copil urmează modelul standard de graf de scenă utilizat de motoarele 3D și instrumentele DCC.

Utilitare matematice

Biblioteca include tipuri matematice de bază pentru operații 3D.

Vector3

Un vector cu trei componente utilizat pentru poziții, direcții, normale și culori.

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

O matrice de transformare 4x4 pentru combinarea translației, rotației și scalării într-o singură operație.

Matrix4 mat = new Matrix4();
// Matrix4 is used internally by transforms
// and can be retrieved from GlobalTransform

Quaternion

O reprezentare a rotației care evită blocajul gimbal și interpolează lin. Quaternions sunt utilizate intern de sistemul de transformare.

BoundingBox

O cutie de delimitare aliniată pe axe pentru interogări spațiale, verificări de coliziune și analiză a scenei.

BoundingBox bbox = new BoundingBox();
// BoundingBox can be constructed directly with min/max Vector3 values

Notă: Node.getBoundingBox() și Entity.getBoundingBox() nu sunt încă implementate. Ambele returnează un gol BoundingBox (cu valori sentinel Double.MAX_VALUE / Double.MIN_VALUE valori) indiferent de geometria rețelei. Nu utilizați aceste metode pentru a calcula limitele reale ale geometriei în această versiune.

Limitări cunoscute

Este de remarcat că Scene.render() este nu este suportat în ediția FOSS. Apelarea lui va arunca o UnsupportedOperationException. Biblioteca este concepută pentru procesarea 3D bazată pe fișiere – încărcare, transformare și salvare – mai degrabă decât redarea în timp real.

Rezumat

Principalele caracteristici ale Aspose.3D FOSS pentru Java se împart în cinci domenii:

ArieClaseScop
Graf de scenăScene, Node, Entity, Mesh, CameraReprezentare ierarhică a modelului
FormateOpțiuni de încărcare/salvare pentru OBJ, STL, glTF/GLB; încărcare pentru FBXIntrare/Ieșire independentă de format
MaterialePbrMaterialAspectul suprafeței (PBR)
TransformăriTransform, GlobalTransformPoziționare spațială
MatematicăVector3, Matrix4, Quaternion, BoundingBox3D math primitives

În următorul articol, vom parcurge tutoriale practice format-cu-format care acoperă OBJ, STL, glTF și FBX, cu opțiuni detaliate de încărcare și salvare.