Στο δημοσίευση εισαγωγής, καλύψαμε τι είναι το 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
Οι ορισμοί κάμερας διατηρούνται κατά την εξαγωγή σε μορφές που τα υποστηρίζουν (όπως το glTF).
Σημείωση: Το Light class δεν είναι διαθέσιμη στην έκδοση 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 for Java παρέχει ένα μοντέλο υλικού PBR (Physically Based Rendering) μέσω PbrMaterial. Αυτή είναι η μόνη συγκεκριμένη material class στην έκδοση 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 είναι ο υπολογισμένος world-space transform, λαμβάνοντας υπόψη ολόκληρη την αλυσίδα γονέων. Αυτό είναι μόνο για ανάγνωση και ενημερώνεται αυτόματα.
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.
Βοηθητικά Μαθηματικών
Η βιβλιοθήκη περιλαμβάνει βασικούς τύπους μαθηματικών για λειτουργίες 3D.
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 και παρεμβάλλεται ομαλά. Τα quaternions χρησιμοποιούνται εσωτερικά από το σύστημα μετασχηματισμού.
BoundingBox
Ένα BoundingBox ευθυγραμμισμένο με τους άξονες για χωρικά ερωτήματα, ελέγχους σύγκρουσης και ανάλυση σκηνής.
BoundingBox bbox = new BoundingBox();
// BoundingBox can be computed from mesh geometry
Γνωστοί περιορισμοί
Αξίζει να σημειωθεί ότι Scene.render() είναι δεν υποστηρίζεται στην έκδοση FOSS. Η κλήση του θα προκαλέσει ένα UnsupportedOperationException. Η βιβλιοθήκη έχει σχεδιαστεί για επεξεργασία 3D βασισμένη σε αρχεία – φόρτωση, μετασχηματισμό και αποθήκευση – αντί για απόδοση σε πραγματικό χρόνο.
Περίληψη
Τα κύρια χαρακτηριστικά του Aspose.3D FOSS για Java χωρίζονται σε πέντε περιοχές:
| Περιοχή | Κλάσεις | Σκοπός |
|---|---|---|
| Γράφημα Σκηνής | Scene, Node, Entity, Mesh, Camera | Ιεραρχική αναπαράσταση μοντέλου |
| Μορφές | Επιλογές Φόρτωσης/Αποθήκευσης για OBJ, STL, glTF/GLB; Φόρτωση για FBX | I/O ανεξάρτητο από μορφή |
| Υλικά | PbrMaterial | Εμφάνιση επιφάνειας (PBR) |
| Μετασχηματισμοί | Transform, GlobalTransform | Χωρική τοποθέτηση |
| Μαθηματικά | Vector3, Matrix4, Quaternion, BoundingBox | 3D math primitives |
Στην επόμενη ανάρτηση, θα περάσουμε από πρακτικούς οδηγούς ανά μορφή που καλύπτουν OBJ, STL, glTF και FBX με λεπτομερείς επιλογές φόρτωσης και αποθήκευσης.