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ületOsztályokCél
Jelenet gráfScene, Node, Entity, Mesh, CameraHierarchikus modellábrázolás
FormátumokBetöltés/Mentés beállítások OBJ, STL, glTF/GLB esetén; Betöltés FBX-hezFormátumfüggetlen I/O
AnyagokPbrMaterialFelület megjelenés (PBR)
ÁtalakításokTransform, GlobalTransformTérbeli elhelyezés
MatematikaVector3, Matrix4, Quaternion, BoundingBox3D 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.