Az bevezető bejegyzés, tárgyaltuk, hogy mi az Aspose.3D FOSS a Java számára, és hogyan lehet elkezdeni. Ez a bejegyzés mélyebben bemutatja a könyvtárat alkotó kulcsfontosságú funkciókat, kódpéldákkal minden területhez.
Minden példa a következő importálást feltételezi:
import com.aspose.threed.*;
És a Maven függőség:
<dependency>
<groupId>com.aspose</groupId>
<artifactId>aspose-3d-foss</artifactId>
<version>26.1.0</version>
</dependency>
Jelenetgrafikon API
A jelenetgrafikon a Aspose.3D FOSS a Java számára alapja. Minden 3D modell – akár fájlból betöltve, akár programozottan felépítve – egy csomópontfáként jelenik meg, amelynek gyökere egy Scene objektumban.
Jelenet
A Scene osztály a belépési pont minden művelethez. Létrehozhatsz egy üres jelenetet, vagy betölthetsz egyet egy fájlból:
// 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());
A csomópontfa gyökere a következővel érhető el: getRootNode().
Csomópont
Egy Node egy névvel ellátott pozíciót jelöl a jelenetfában. A csomópontoknak lehetnek gyermekei, hierarchiát alkotva. Minden csomópont helyi Transform és egy számított 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");
Csomópontokat önállóan is létrehozhatsz, majd később csatolhatod őket:
Node standalone = new Node("Standalone");
scene.getRootNode().getChildNodes().add(standalone);
Entitás és Mesh
Egy Entity absztrakt alaposztály minden olyan dolog számára, amely csomóponthoz csatolható – geometria, kamerák és fények. A leggyakoribb entitástípus Mesh, amely poligonális geometriát (csúcsok, felületek és normálok) tartalmaz.
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());
}
}
Kamera
A kamerák olyan entitások, amelyek csomóponthoz csatolódnak:
Scene scene = new Scene();
Node cameraNode = scene.getRootNode().createChildNode("MainCamera");
// Camera entity can be assigned to the node
Megjegyzés: A Camera osztály a Java kiadásban egy minimális váz, amely csak konstruktorokat tartalmaz. A csomópontokhoz csatolt kamera entitások nincs megírva glTF vagy bármely más formátumba exportáláskor — a glTF exportáló csak a Mesh entitásokat. Ne számítson arra, hogy a kamera adatok megmaradnak az exportált fájlokban.
Megjegyzés: A Light az osztály nem érhető el a Java kiadásban. A importált fájlokból származó jelenetvilágítási adatok általánosként vannak tárolva Entity objektumok.
Formátumfüggetlen betöltés és mentés
A könyvtár egyik erőssége, hogy a jelenetgrafikon formátumfüggetlen. Bármely támogatott formátumból betöltheted, egyetlen API-n keresztül manipulálhatod a jelenetet, és bármely támogatott formátumba mentheted.
// 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);
A formátumot a fájl kiterjesztése határozza meg. Kifejezett mentési beállítások megadásával is szabályozhatod a kimenetet:
GltfSaveOptions opts = new GltfSaveOptions();
opts.setFlipCoordinateSystem(true);
opts.setPrettyPrint(true);
scene.save("output.gltf", opts);
Anyagok
Aspose.3D FOSS a Java számára PBR (Fizikailag Alapú Renderelés) anyagmodellt biztosít a PbrMaterial. Ez az egyetlen konkrét anyag osztály a Java kiadásban.
PbrMaterial
Egy fizikailag alapú renderelési anyag, amely albedo, fémesség és durvaság paramétereket használ. Ez a szabványos anyagmodell a glTF-hez és a modern valós idejű motorokhoz.
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
Az anyagok formátumok közötti megőrzése a célformátum képességeitől függ. A PBR anyagok természetesen leképezhetők a glTF és GLB kimenetre.
Transzform és Térbeli
Minden Node a jelenet gráfban egy Transform ami meghatározza a pozícióját, forgását és méretét a szülőjéhez képest.
Lokális transzform
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
Globális transzform
Az GlobalTransform a kiszámított világkoordinátás transzformáció, amely figyelembe veszi a teljes szülőláncot. Ez csak olvasható, és automatikusan frissül.
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();
Ez a szülő-gyermek transzformáció öröklődés a 3D motorok és DCC eszközök által használt szabványos jelenetgrafikon mintát követi.
Matematikai segédeszközök
A könyvtár magát a 3D műveletekhez szükséges alapvető matematikai típusokat tartalmaz.
Vector3
Egy háromkomponensű vektor, amelyet pozíciók, irányok, normálok és színek tárolására használnak.
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
Egy 4x4-es transzformációs mátrix, amely a transzlációt, rotációt és skálázást egyetlen műveletben egyesíti.
Matrix4 mat = new Matrix4();
// Matrix4 is used internally by transforms
// and can be retrieved from GlobalTransform
Quaternion
Egy forgatási reprezentáció, amely elkerüli a gimbal lock-ot és simán interpolál. A kvaterniókat a transzformációs rendszer belsőleg használja.
BoundingBox
Egy tengelyekhez igazított határoló doboz térbeli lekérdezésekhez, ütközés-ellenőrzésekhez és jelenet-elemzéshez.
BoundingBox bbox = new BoundingBox();
// BoundingBox can be constructed directly with min/max Vector3 values
Megjegyzés: Node.getBoundingBox() és Entity.getBoundingBox() még nincsenek megvalósítva. Mindkettő egy üres BoundingBox (sentinel értékekkel Double.MAX_VALUE / Double.MIN_VALUE értékek) a háló geometria függvényében. Ne használja ezeket a metódusokat a tényleges geometriai határok kiszámításához ebben a verzióban.
Ismert korlátozások
Érdemes megjegyezni, hogy Scene.render() van nem támogatott a FOSS kiadásban. Ennek meghívása hibát fog dobni egy UnsupportedOperationException. A könyvtár fájl-alapú 3D feldolgozásra van tervezve – betöltés, átalakítás és mentés – a valós idejű renderelés helyett.
Összefoglalás
A Aspose.3D FOSS Java számára kulcsfontosságú funkciói öt területre bonthatók:
| Terület | Osztályok | Cél |
|---|---|---|
| Jelenet gráf | Scene, Node, Entity, Mesh, Camera | Hierarchikus modellábrázolás |
| Formátumok | Betöltés/Mentés beállítások OBJ, STL, glTF/GLB esetén; Betöltés FBX-hez | Formátumfüggetlen I/O |
| Anyagok | PbrMaterial | Felület megjelenés (PBR) |
| Átalakítások | Transform, GlobalTransform | Térbeli elhelyezés |
| Matematika | Vector3, Matrix4, Quaternion, BoundingBox | 3D math primitives |
A következő bejegyzésben gyakorlati, formátumonkénti útmutatókat mutatunk be az OBJ, STL, glTF és FBX formátumokról, részletes betöltési és mentési lehetőségekkel.