Cum să încărcați modele 3D în Java
Aspose.3D FOSS pentru Java oferă o API simplă pentru deschiderea fișierelor 3D fără dependențe native. Scene Obiectul puteți merge în ierarhia nodurilor și citi datele de geometrie crude pentru fiecare mesh din scenă.
Ghidul pas cu pas
Pasul 1: Adăugați dependența de Maven
Adăugați dependența Aspose.3D FOSS la dvs. pom.xml.Nu sunt necesare biblioteci native suplimentare.
<dependency>
<groupId>org.aspose</groupId>
<artifactId>aspose-3d-foss</artifactId>
<version>26.5.0</version>
</dependency>Pasul 2: Importarea claselor necesare
În acest caz, Scene clasa este containerul de top pentru toate datele 3D. Importarea acestuia împreună cu Node, Mesh, și orice formate-specific clase de opțiune de încărcare pe care le aveți nevoie.
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;Toate clasele publice trăiesc sub com.aspose.threed pachetă .
Pasul 3: Încărcați un fișier
Foloseste statica Scene.fromFile() metoda de a deschide orice format suportat. biblioteca detectează automat formatul din extensie fișierului.
// Automatic format detection from the file extension
Scene scene = Scene.fromFile("model.obj");În mod alternativ, crearea unui Scene Instanta si apelul open().Acest lucru este util atunci când doriți să treceți opțiunile de încărcare sau să gestionați erorile în mod explicit:
Scene scene = new Scene();
scene.open("model.obj");Ambele abordări susțin OBJ, STL (binare și ASCII), glTF 2.0 / GLB și fișierele FBX.
Pasul 4: Transcenderea nodurilor de scenă
Un scenă încărcată este un copac de Node Obiectele înrădăcinate de scene.getRootNode().Utilizarea getChildNodes() pentru a itera recurent și vizita toate nodurile:
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);
}
}
}Fiecare Node poate avea zero sau mai mult. Entity Obiectele (măsuri, camere, lămpi) Verifică node.getEntities() pentru a inspecta fiecare entitate atașată la un nod sau utilizarea acestuia; node.getEntity() pentru a recupera entitatea primară.
Pasul 5: Accesarea datelor Vertex și Polygon
Încărcați entitatea unui nod la Mesh şi apelul getControlPoints() pentru poziţiile vertex şi getPolygons() Pentru lista de indexuri:
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() Întoarce la A List<Vector4> unde x, y, z să-şi asume poziţia şi w este coordonatul homogen (de obicei 1.0).
mesh.getPolygons() Întoarce la A List<int[]> unde fiecare arie este setul comandat de indicatori de punct de control pentru o singură față.
Pasul 6: Aplicați opțiuni de încărcare specifice formatului
Pentru controlul fin-gravit asupra modului în care este interpretat un fișier, treceți la o opțiune de încărcare pentru a Scene.fromFile() sau scene.open().
Fișierele OBJ - 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);fișierele GLTF / GLB - 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);File de tip 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);Formate de import susținute
| Formatul | extindere | Notă |
|---|---|---|
| OBJ | .obj | Wavefront OBJ; opțional .mtl - fişier; este posibilă ObjLoadOptions.setEnableMaterials(true) |
| STL | .stl | ASCII și modurile binare sunt auto-detectate |
| Glată | .gltf, .glb | GLTF 2.0; variante binare GLB și JSON sunt susținute atât |
| FBX | .fbx | Binary FBX susținută |
Probleme comune și fixări
IOException În încărcare — Verificați că drumul de fișier este corect și fișiere există. Utilizați drumuri absolute în timpul dezvoltării pentru a elimina ambiguitatea directoriei de lucru.
NullPointerException entitate accesibilă Nu fiecare nod are geometrie, mereu păzește cu node.getEntity() instanceof Mesh înainte de a castă sau iterate node.getEntities() pentru a gestiona noduri cu mai multe obiecte atașate.
Sistemul de coordonare este incompatibil — Dacă modelul încărcat apare înfășurat sau rotat, utilizați setFlipCoordinateSystem(true) În cazul în care este necesar să se efectueze o evaluare a nivelului de încărcare (ObjLoadOptions, GltfLoadOptions,sau StlLoadOptions).
Scena se încarcă, dar getChildNodes() este goală — Unele fișiere stocă geometria sub sub-scene, mai degrabă decât nodul de rădăcină. scene.getSubScenes() Verifică nodul de rădăcină al fiecărei subscene.
Întrebări frecvente (FAQ)
Ce formate pot încărca?
OBJ, STL (binare și ASCII), glTF 2.0 / GLB, și FBX. Detecția formatului este automată pe baza extinderii fișierului atunci când sunteți la apel Scene.fromFile().
Pot să încărc din un flux?
Da şi da. scene.open(InputStream) şi Scene.fromStream(InputStream) Amândouă acceptă Java. InputStream.De asemenea, puteți trece printr-o FileFormat Parametru atunci când curentul nu are o extindere.
Este biblioteca sigură?
Fiecare Scene instanta este independent si nu partajeaza starea mutabila cu alte instante.
Cum pot citi numărul de poligon fără a itera fiecare față?
apeluri mesh.getPolygonCount() pentru un număr complet direct.