Στο δημοσίευση εισαγωγής, καλύψαμε τι είναι το Aspose.3D FOSS για Java και πώς να ξεκινήσετε. Αυτή η δημοσίευση εμβαθύνει στα βασικά χαρακτηριστικά που συνθέτουν τη βιβλιοθήκη, με παραδείγματα κώδικα για κάθε περιοχή.

Όλα τα παραδείγματα υποθέτουν την ακόλουθη εισαγωγή:

import com.aspose.threed.*;

Και την εξάρτηση Maven:

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

API Γραφήματος Σκηνής

Το γράφημα σκηνής είναι η βάση του Aspose.3D FOSS για Java. Κάθε 3D μοντέλο – είτε φορτώνεται από αρχείο είτε δημιουργείται προγραμματιστικά – αναπαρίσταται ως δέντρο κόμβων με ρίζα σε ένα 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 αντιπροσωπεύει μια ονομαστική θέση στο δέντρο σκηνής. Οι κόμβοι μπορούν να έχουν παιδιά, σχηματίζοντας μια ιεραρχία. Κάθε κόμβος μεταφέρει ένα τοπικό 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 είναι μια αφηρημένη βασική κλάση για οτιδήποτε μπορεί να προσαρτηθεί σε έναν κόμβο – γεωμετρία, κάμερες και φωτισμούς. Ο πιο κοινός τύπος οντότητας είναι 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());
    }
}

Κάμερα

Οι κάμερες είναι οντότητες που προσαρτώνται σε κόμβους:

Scene scene = new Scene();

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

Σημείωση: Το Camera η κλάση στην έκδοση Java είναι ένα ελάχιστο σκελετό μόνο με κατασκευαστές. Οι οντότητες κάμερας που συνδέονται σε κόμβους είναι δεν γράφεται κατά την εξαγωγή σε 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 για 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.

Μετασχηματισμός και Χώρος

Κάθε Node στο γράφημα σκηνής έχει ένα 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

Καθολικός Μετασχηματισμός

Το 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.

Βοηθητικά Μαθηματικά

Η βιβλιοθήκη περιλαμβάνει βασικούς τύπους μαθηματικών για λειτουργίες 3Δ.

Vector3

Ένα διάνυσμα τριών συνιστωσών που χρησιμοποιείται για θέσεις, κατευθύνσεις, κανονικές και χρώματα.

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

Μία αναπαράσταση περιστροφής που αποφεύγει το gimbal lock και παρεμβάλλεται ομαλά. Τα quaternion χρησιμοποιούνται εσωτερικά από το σύστημα μετασχηματισμού.

BoundingBox

Ένα πλαίσιο περιθωρίου ευθυγραμμισμένο με τους άξονες για χωρικά ερωτήματα, ελέγχους σύγκρουσης και ανάλυση σκηνής.

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

Σημείωση: Node.getBoundingBox() και Entity.getBoundingBox() δεν έχουν ακόμη υλοποιηθεί. Και τα δύο επιστρέφουν ένα κενό BoundingBox (με sentinel Double.MAX_VALUE / Double.MIN_VALUE τιμές) ανεξάρτητα από τη γεωμετρία του πλέγματος. Μην χρησιμοποιείτε αυτές τις μεθόδους για να υπολογίσετε τα πραγματικά όρια γεωμετρίας σε αυτήν την έκδοση.

Γνωστοί περιορισμοί

Αξίζει να σημειωθεί ότι Scene.render() είναι δεν υποστηρίζεται στην έκδοση FOSS. Η κλήση του θα προκαλέσει ένα UnsupportedOperationException. Η βιβλιοθήκη έχει σχεδιαστεί για επεξεργασία 3D βασισμένη σε αρχεία – φόρτωση, μετασχηματισμό και αποθήκευση – αντί για απόδοση σε πραγματικό χρόνο.

Περίληψη

Τα κύρια χαρακτηριστικά του Aspose.3D FOSS για Java χωρίζονται σε πέντε περιοχές:

ΠεριοχήΚλάσειςΣκοπός
Γράφημα ΣκηνήςScene, Node, Entity, Mesh, CameraΙεραρχική αναπαράσταση μοντέλου
ΜορφέςΕπιλογές Φόρτωσης/Αποθήκευσης για OBJ, STL, glTF/GLB; Φόρτωση για FBXΕίσοδος/Έξοδος ανεξάρτητη από μορφή
ΥλικάPbrMaterialΕμφάνιση επιφάνειας (PBR)
ΜετασχηματισμοίTransform, GlobalTransformΧωρική τοποθέτηση
ΜαθηματικάVector3, Matrix4, Quaternion, BoundingBox3D math primitives

Στην επόμενη ανάρτηση, θα περάσουμε από πρακτικά tutorials ανά μορφή που καλύπτουν OBJ, STL, glTF και FBX με λεπτομερείς επιλογές φόρτωσης και αποθήκευσης.