Î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:
| Arie | Clase | Scop |
|---|---|---|
| Graf de scenă | Scene, Node, Entity, Mesh, Camera | Reprezentare ierarhică a modelului |
| Formate | Opțiuni de încărcare/salvare pentru OBJ, STL, glTF/GLB; încărcare pentru FBX | Intrare/Ieșire independentă de format |
| Materiale | PbrMaterial | Aspectul suprafeței (PBR) |
| Transformări | Transform, GlobalTransform | Poziționare spațială |
| Matematică | Vector3, Matrix4, Quaternion, BoundingBox | 3D 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.