Πώς να φορτώσετε 3D μοντέλα στο Java

Πώς να φορτώσετε 3D μοντέλα στο Java

Το Aspose.3D FOSS για Java παρέχει ένα απλό API για να ανοίξετε 3D αρχεία χωρίς καμία εγχώρια εξάρτηση. Scene αντικείμενο μπορείτε να περπατήσετε τη ιεραρχία των κόμβων και να διαβάσετε τα δεδομένα γεωμετρίας για κάθε μασχ στην σκηνή.

Βήμα προς βήμα οδηγός

Βήμα 1: Προσθέστε την εξάρτηση Maven

Προσθέστε την εξάρτηση Aspose.3D FOSS στο δικό σας pom.xml.Δεν απαιτούνται επιπλέον μητρικές βιβλιοθήκες.

<dependency>
  <groupId>org.aspose</groupId>
  <artifactId>aspose-3d-foss</artifactId>
  <version>26.5.0</version>
</dependency>

Βήμα 2: Εισαγωγή των απαιτούμενων τάξεων

Η Scene Η τάξη είναι το κορυφαίο δοχείο για όλα τα 3D δεδομένα. εισάγει μαζί με την Node, Mesh, και οποιαδήποτε κατηγορίες φορτίου-επιλογή που χρειάζεστε.

import com.aspose.threed.Scene;
import com.aspose.threed.Node;
import com.aspose.threed.Mesh;
import com.aspose.threed.Entity;
import com.aspose.threed.ObjLoadOptions;
import com.aspose.threed.GltfLoadOptions;
import com.aspose.threed.StlLoadOptions;

Όλες οι δημόσιες τάξεις ζουν κάτω από το com.aspose.threed Το πακέτο.


Βήμα 3: Κατεβάστε ένα αρχείο

Χρησιμοποιήστε το στατικό Scene.fromFile() Η βιβλιοθήκη ανιχνεύει αυτόματα τη μορφή από την επέκταση αρχείου.

// Automatic format detection from the file extension
Scene scene = Scene.fromFile("model.obj");

Εναλλακτικά, δημιουργήστε ένα Scene ΕΡΓΑΣΙΑ ΚΑΙ ΚΛΗΜΟΣ open().Αυτό είναι χρήσιμο όταν θέλετε να περάσετε τις επιλογές φόρτισης ή να χειριστείτε τα λάθη ρητά:

Scene scene = new Scene();
scene.open("model.obj");

Και οι δύο προσεγγίσεις υποστηρίζουν OBJ, STL (βινική και ASCII), glTF 2.0 / GLB, και FBX αρχεία.


Βήμα 4: Περπατήστε το σκηνικό

Μια σκηνή φορτισμένη είναι ένα δέντρο Node αντικείμενα που ριζώνουν σε scene.getRootNode().Χρησιμοποιήστε getChildNodes() Να ιταρίσει επανειλημμένα και να επισκεφθεί όλους τους κόμβους:

import com.aspose.threed.Scene;
import com.aspose.threed.Node;

public class SceneWalker {
    public static void main(String[] args) throws Exception {
        Scene scene = Scene.fromFile("model.obj");
        walkNode(scene.getRootNode(), 0);
    }

    static void walkNode(Node node, int depth) {
        String indent = "  ".repeat(depth);
        System.out.println(indent + "Node: " + node.getName());
        for (Node child : node.getChildNodes()) {
            walkNode(child, depth + 1);
        }
    }
}

Κάθε ένα Node Μπορεί να φέρει μηδέν ή περισσότερα. Entity αντικείμενα (μεσάζ, κάμερες, φώτα). ελέγξτε node.getEntities() να ελέγξει κάθε οντότητα που συνδέεται με ένα κόμβο, ή χρησιμοποιεί node.getEntity() να ανακτήσει την κύρια οντότητα.


Βήμα 5: Πρόσβαση στα Vertex και τα Πολυγόνα Δεδομένα

Κάντε μια ενότητα ενός κόμβου για να Mesh και καλεί getControlPoints() για τις θέσεις του Vertex και getPolygons() Για τις λίστα δείκτες:

import com.aspose.threed.Scene;
import com.aspose.threed.Node;
import com.aspose.threed.Entity;
import com.aspose.threed.Mesh;

Scene scene = Scene.fromFile("model.obj");

for (Node node : scene.getRootNode().getChildNodes()) {
    Entity entity = node.getEntity();
    if (entity instanceof Mesh) {
        Mesh mesh = (Mesh) entity;
        System.out.printf("Mesh '%s': %d vertices, %d polygons%n",
            node.getName(),
            mesh.getControlPoints().size(),
            mesh.getPolygonCount());

        // First vertex position (Vector4: x, y, z, w)
        if (!mesh.getControlPoints().isEmpty()) {
            var v = mesh.getControlPoints().get(0);
            System.out.printf("  First vertex: (%.4f, %.4f, %.4f)%n", v.x, v.y, v.z);
        }

        // First polygon: array of control-point indices
        if (!mesh.getPolygons().isEmpty()) {
            int[] poly = mesh.getPolygons().get(0);
            System.out.println("  First polygon indices: " + java.util.Arrays.toString(poly));
        }
    }
}

mesh.getControlPoints() Επιστρέφει ο Α List<Vector4> Που είναι x, y, z Να αναλάβει τη θέση και w Ομογενής συντονισμός (συνήθως 1.0) είναι ο ομοιογενείς συντελεστές.

mesh.getPolygons() Επιστρέφει ο Α List<int[]> όπου κάθε ράδιο είναι το παραγγελθέντα σύνολο δεικτών σημείου ελέγχου για ένα πρόσωπο.


Βήμα 6: Εφαρμόστε επιλογές φόρτισης ειδικά σε μορφή

Για λεπτό-κλαμμένο έλεγχο του τρόπου ερμηνείας ενός αρχείου, περάστε μια παραλλαγή επιλογών φόρτωσης στο Scene.fromFile() ή scene.open().

Φιλοσοφία - ObjLoadOptions:

import com.aspose.threed.Scene;
import com.aspose.threed.ObjLoadOptions;

ObjLoadOptions options = new ObjLoadOptions();
options.setFlipCoordinateSystem(true);  // Convert right-hand Y-up to Z-up
options.setScale(0.01);                  // Convert centimetres to metres
options.setEnableMaterials(true);        // Load the .mtl material file alongside
options.setNormalizeNormal(true);        // Normalize all normals to unit length

Scene scene = Scene.fromFile("model.obj", options);

ΓΚΠ/ΓΚΦ αρχεία - GltfLoadOptions:

import com.aspose.threed.Scene;
import com.aspose.threed.GltfLoadOptions;

GltfLoadOptions options = new GltfLoadOptions();
options.setFlipCoordinateSystem(true);  // Flip the coordinate system if needed

Scene scene = Scene.fromFile("model.glb", options);

Πληροφορίες για το STL - StlLoadOptions:

import com.aspose.threed.Scene;
import com.aspose.threed.StlLoadOptions;

StlLoadOptions options = new StlLoadOptions();
options.setFlipCoordinateSystem(true);
options.setRecalculateNormal(true);  // Recompute normals from face geometry

Scene scene = Scene.fromFile("model.stl", options);

Υποστηριζόμενες μορφές εισαγωγής

ΤΕΧΝΗΕΠΙΤΡΟΦΗΣημειώσεις
OBJ.objWavefront OBJ: Εναλλακτική .mtl αρχείο υλικού, επιτρέπεται να ObjLoadOptions.setEnableMaterials(true)
STL.stlASCII και δυαδικές λειτουργίες είναι αυτόματα ανιχνευμένες
ΓΚΛΤΦ.gltf, .glbglTF 2.0; δυαδικές παραλλαγές GLB και JSON υποστηρίζονται τόσο
FBX.fbxΥποστηρίζεται το Binary FBX

Κοινά προβλήματα και τακτοποιήσεις

IOException ΣΤΟ ΛΟΙΓ — Ελέγξτε το μονοπάτι αρχείου είναι σωστό και το αρχείο υπάρχει. χρησιμοποιήστε απόλυτα μονό κατά τη διάρκεια της ανάπτυξης για να εξαλείψετε την αμφιλεγόμενη εργασία-διαχείριση.

NullPointerException Εισαγωγή Οντότητας Δεν είναι κάθε κόμβος που φέρει γεωμετρία.Πάντα να το κρατάτε με την node.getEntity() instanceof Mesh πριν από την εκτέλεση, ή το iterate node.getEntities() να χειριστεί τους κόμβους με πολλαπλά προσκομμένα αντικείμενα.

Συντονισμένο σύστημα αδιαφορών - Εάν το φορτισμένο μοντέλο εμφανίζεται κλιμακωμένο ή περιστρεφόμενο, χρησιμοποιήστε setFlipCoordinateSystem(true) Η κατάλληλη κατηγορία επιλογών φορτίου (ObjLoadOptions, GltfLoadOptionsStlLoadOptions).

Η σκηνή χτυπάει, αλλά getChildNodes() Είναι άδειο — Μερικά αρχεία αποθηκεύουν τη γεωμετρία κάτω από υποσενάρια αντί για το κόμβο ρίζας. scene.getSubScenes() και να ελέγξει το ρίζον κόμβο κάθε υποσυνέδρου.


Συχνές ερωτήσεις (FAQ)

Ποια μορφή μπορώ να φορτώ;?

OBJ, STL (binary και ASCII), glTF 2.0 / GLB, και FBX. Η ανίχνευση μορφής βασίζεται αυτόματα στην επέκταση αρχείου όταν καλείτε Scene.fromFile().

Μπορώ να φορτώσω από ένα ρεύμα;?

Ναι . scene.open(InputStream) και Scene.fromStream(InputStream) Και οι δύο έχουν Java. InputStream.Μπορείτε επίσης να περάσετε ένα FileFormat παράμετρο όταν το ρεύμα δεν φέρει επέκταση.

Είναι η βιβλιοθήκη ασφαλής;?

Κάθε ένα Scene Η περίπτωση είναι ανεξάρτητη και δεν μοιράζεται μεταβλητό κατάσταση με άλλες περιπτώσεις.

Πώς μπορώ να διαβάσω τους αριθμούς πολυγώνης χωρίς να ιταρώνω κάθε πρόσωπο;?

Κλήση mesh.getPolygonCount() Για έναν άμεσο πλήρη αριθμό.


Δείτε επίσης

 Ελληνικά