Hoe 3D modellen in Java te laden
Aspose.3D FOSS voor Java biedt een eenvoudige API om 3D-bestanden te openen zonder enige inheemse afhankelijkheid. Scene object je kunt de nodenhiërarchie lopen en grondige geometrische gegevens lezen voor elke mesh in het podium.
Step-by-Step Guide voor de werkplek
Stap 1: Voeg de Maven-afhankelijkheid toe
Voeg de Aspose.3D FOSS afhankelijkheid toe aan uw pom.xml.Er zijn geen extra native bibliotheken vereist.
<dependency>
<groupId>org.aspose</groupId>
<artifactId>aspose-3d-foss</artifactId>
<version>26.5.0</version>
</dependency>Stap 2: Import de vereiste klassen
De The Scene klasse is de bovenste container voor alle 3D-gegevens. Node, Mesh, en alle format-specifieke lading-optie klassen die u nodig heeft.
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 openbare klassen leven onder de com.aspose.threed Het pakket.
Stap 3: Een bestand opladen
Gebruik de statische Scene.fromFile() methode om alle ondersteunde formaten te openen.De bibliotheek detecteert de formats automatisch uit de bestanduitbreiding.
// Automatic format detection from the file extension
Scene scene = Scene.fromFile("model.obj");Als alternatief, creëren een Scene Instant en oproep open().Dit is handig als u de lading opties wilt doorbrengen of fouten uitdrukkelijk wil beheren:
Scene scene = new Scene();
scene.open("model.obj");Beide benaderingen ondersteunen OBJ, STL (binaire en ASCII), glTF 2.0 / GLB en FBX bestanden.
Stap 4: Overgang Scene Nodes
Een opgeladen scène is een boom van Node De voorwerpen die in de scene.getRootNode().Gebruik getChildNodes() om terug te keren en alle knoten te bezoeken:
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);
}
}
}Elk van de Node kan nul of meer dragen Entity objecten (messen, camera’s, lichten) Check node.getEntities() om elke entiteit die aan een node is aangesloten te controleren, of gebruik te maken van node.getEntity() om de primaire entiteit te herhalen.
Stap 5: Toegang tot vertex en polygon gegevens
Het entiteit van een node op te slaan Mesh en oproep getControlPoints() voor vertex posities en getPolygons() Voor de indexlijsten:
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() Terug naar A List<Vector4> Waar x, y, z de positie inhouden en w Het is de homogene coördinatie (normale 1.0).
mesh.getPolygons() Terug naar A List<int[]> waar elke array de bestelde set van control-point-indicatoren is voor één gezicht.
Stap 6: Stel op Format-specifieke Loadopties
Voor een goed geanalyseerde controle over hoe een bestand wordt geïnterpreteerd, ga dan naar de optie-instantie voor het Scene.fromFile() of scene.open().
OBJ bestanden - 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);GTTF / GLB bestanden - 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 bestanden - 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);Ondersteunde invoerformaten
| Format | Uitbreiding | notities |
|---|---|---|
| OBJ | .obj | Wavefront OBJ; optioneel .mtl materiaal; mogelijk met ObjLoadOptions.setEnableMaterials(true) |
| STL | .stl | ASCII en binaire modes worden automatisch gedetecteerd. |
| GTTF | .gltf, .glb | GLTF 2.0; binaire GLB en JSON varianten beide ondersteund |
| FBX | .fbx | Binaire FBX ondersteund |
Gemeenschappelijke problemen en fixes
IOException op de lading - Controleer de bestandpad is correct en het bestanden bestaat. Gebruik absolute paden tijdens ontwikkeling om werk-director ambiguïteit te elimineren.
NullPointerException Toegang tot entiteit Niet elke node draagt geometrie. altijd bewaart met node.getEntity() instanceof Mesh voor het casten of iterate node.getEntities() om noden met meerdere aangesloten objecten te beheren.
Coördinatie systeem mismatch - Als het geladen model flipped of rotatieerd verschijnt, gebruik dan setFlipCoordinateSystem(true) op de juiste lading-opties klasse (ObjLoadOptions, GltfLoadOptions,Of StlLoadOptions).
Het podium loopt maar getChildNodes() is leeg — Sommige bestanden bewaren geometrie onder sub-scenes in plaats van de wortelknoten. scene.getSubScenes() en inspecteren de wortelnod van elke sub-scène.
Veelgestelde vragen (FAQ)
Welke formaten kan ik laden?
OBJ, STL (binaire en ASCII), glTF 2.0 / GLB, en FBX. Format detectie is automatisch gebaseerd op de bestanduitbreiding wanneer u oproept Scene.fromFile().
Kan ik opladen van een stroom?
Ja ja. scene.open(InputStream) en Scene.fromStream(InputStream) Beide accepteren een Java. InputStream.Je kunt ook een FileFormat parameter wanneer de stroom geen verlenging draagt.
Is de bibliotheek veilig?
Elk van de Scene de instantie is onafhankelijk en niet met andere instances een mutabele staat delen.
Hoe lees ik polygon rekenen zonder elke gezicht te itereren?
Calling op mesh.getPolygonCount() Voor een direct totaal aantal.