Wie 3D-Modelle in Java herunterladen
Aspose.3D FOSS für Java bietet eine einfache API, um 3D-File ohne innere Abhängigkeiten zu öffnen. Scene Objekt können Sie die Node-Hierarchie durchlaufen und Rohgeometrische Daten für jede Messe in der Szene lesen.
Schritt für Schritt Guide
Schritt 1: Add the Maven Dependency
Hinzufügen Sie die Aspose.3D FOSS-Abhängigkeit zu Ihrem pom.xml.Noch keine zusätzlichen nativen Bibliotheken sind erforderlich.
<dependency>
<groupId>org.aspose</groupId>
<artifactId>aspose-3d-foss</artifactId>
<version>26.5.0</version>
</dependency>Schritt 2: Import der erforderlichen Klassen
Die Scene Klasse ist der Top-Level-Kontinent für alle 3D-Daten. Importieren Sie es zusammen mit dem Node, Mesh, und alle Format-spezifischen Ladungsoption Klassen Sie benötigen.
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;Alle öffentlichen Klassen leben unter der com.aspose.threed Das Paket.
Schritt 3: Laden Sie eine Datei herunter
Verwenden Sie den statischen Scene.fromFile() Methode, um alle unterstützten Formate zu öffnen. Die Bibliothek erkennt das Format automatisch aus der Dateierweiterung.
// Automatic format detection from the file extension
Scene scene = Scene.fromFile("model.obj");Alternativ wird eine Scene Instanz und Anruf open().Dies ist nützlich, wenn Sie die Ladungsoptionen durchlaufen oder Fehler ausdrücklich verarbeiten möchten:
Scene scene = new Scene();
scene.open("model.obj");Beide Ansätze unterstützen OBJ, STL (binare und ASCII), glTF 2.0 / GLB und FBX Dateien.
Schritt 4: Überqueren Sie die Scene Nodes
Eine beladenen Szene ist ein Baum von Node Objekte, die in den scene.getRootNode(). Gebrauch getChildNodes() Wiederkehrbar iterieren und alle Knoten besuchen:
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);
}
}
}Jeder Node kann Null oder mehr tragen Entity Objekte (Messe, Kameras, Lichter) Check node.getEntities() zu überprüfen, ob jede Einheit an einen Knoten angeschlossen ist oder node.getEntity() die primäre Einheit zu erlangen.
Schritt 5: Zugang zu Vertex und Polygon-Daten
Ein Node-Entität zu Mesh und rufen getControlPoints() für Vertex-Positionen und getPolygons() Für die Indexliste:
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() zurückkehren a List<Vector4> Wo wo x, y, z die Position und w Die homogene Koordinate ist (normalerweise 1.0).
mesh.getPolygons() zurückkehren a List<int[]> wo jede Array die bestellte Reihe von Kontrollpunktsindikatoren für eine Seite ist.
Schritt 6: Anwenden von Format-spezifischen Ladungsoptionen
Für die feine Kontrolle über die Art und Weise, wie ein Datei interpretiert wird, gehen Sie in der Übertragungsoptionen-Instanz auf Scene.fromFile() oder scene.open().
OBJ Dateien - 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);GLTF / GLB Dateien - 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 Dateien - 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);Unterstützte Importformate
| Formatierung | Erweiterung | Notizen |
|---|---|---|
| OBJ | .obj | Wavefront OBJ – Optionell .mtl Datei; mit der Möglichkeit, ObjLoadOptions.setEnableMaterials(true) |
| STL | .stl | ASCII und binäre Modes werden automatisch erkannt |
| Gltf | .gltf, .glb | GlTF 2.0; binäre GLB und JSON Varianten beide unterstützt |
| FBX | .fbx | Binär FBX unterstützt |
Gemeinsame Probleme und Fixes
IOException auf Last — Überprüfen Sie, ob die Datei-Path korrekt ist und die Dateien existieren. Verwenden Sie absolute Paths während der Entwicklung, um die Arbeitsdirektionsunsicherheit zu beseitigen.
NullPointerException Zugang entität Nicht jeder Node trägt Geometrie. immer bewahren mit node.getEntity() instanceof Mesh Vor dem Kasten oder Iterate node.getEntities() Node mit mehreren angeschlossenen Objekten zu verarbeiten.
Koordinatorisch Missmatch - Wenn das geladene Modell flipped oder rotiert erscheint, verwenden Sie setFlipCoordinateSystem(true) Die entsprechenden Optionen der Lastklasse (ObjLoadOptions, GltfLoadOptions,oder StlLoadOptions).
Die Bühne laden, aber getChildNodes() ist leer — Einige Dateien speichern Geometrie unter Sub-Szenen anstatt die Wurzelnode. scene.getSubScenes() und die Wurzeln von jeder Sub-Szenen überprüfen.
Häufig gestellte Fragen (FAQ)
Welche Formate kann ich laden?
OBJ, STL (binare und ASCII), glTF 2.0 / GLB und FBX. Format-Detektion basiert auf der Dateierweiterung automatisch, wenn Sie anrufen Scene.fromFile().
Kann ich von einem Stream laden?
Ja ja. scene.open(InputStream) und Scene.fromStream(InputStream) Beide akzeptieren Java InputStream.Sie können auch eine FileFormat Parameter, wenn der Strom keine Erweiterung trägt.
Ist die Bibliothek sicher?
Jeder Scene Die Instanz ist unabhängig und teilt nicht den mutativen Zustand mit anderen Instancen.
Wie kann ich Polygon-Zählen lesen, ohne jedes Gesicht zu iterieren?
Anruf mesh.getPolygonCount() für einen direkten Gesamtzahlen.