Hogyan kell feltölteni 3D modelleket a Java-ban
Az Aspose.3D FOSS for Java egyszerű API-t biztosít a 3D fájlok megnyitásához anyanyelvű függőség nélkül. Scene objektumot lehet futni a csomópont hierarchiája és olvassa el a nyers geometriai adatokat minden mesh a színpadon.
Lépésről lépésre útmutató
1. lépés: Adja meg a Maven függőséget
Add hozzá az Aspose.3D FOSS függőségét a saját pom.xml.Nem szükséges további anyanyelvi könyvtárak.
<dependency>
<groupId>org.aspose</groupId>
<artifactId>aspose-3d-foss</artifactId>
<version>26.5.0</version>
</dependency>2. lépés: A szükséges osztályok bevezetésére
A The Scene A 3D-s adatokat a legmagasabb szintű tartály tartalmazza. importálva az összes 3d-es adathoz Node, Mesh, és bármilyen formátum-specifikus terhelési opció osztályok, amire szüksége van.
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;Az összes közosztály a com.aspose.threed A csomag.
3. lépés: Fájl letöltése
Használja a statikus Scene.fromFile() módszer megnyitása bármilyen támogatott formátum. A könyvtár automatikusan észleli a formátumot a fájl kiterjesztés.
// Automatic format detection from the file extension
Scene scene = Scene.fromFile("model.obj");Alternatív módon létrehoz egy Scene Az eset és a hívás open().Ez hasznos, ha át szeretné adni a terhelési lehetőségeket vagy kezelni a hibákat kifejezetten:
Scene scene = new Scene();
scene.open("model.obj");Mindkét megközelítés támogatja az OBJ, STL (bináris és ASCII), glTF 2.0 / GLB, és FBX fájlokat.
4. lépés: A jelenet átlépése
A terhelés a fa, az Node A gyökerekhez kötött tárgyak scene.getRootNode().használata getChildNodes() hogy ismétlődően iteráljon és látogassa meg az összes csomót:
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);
}
}
}Minden egyes Node Nullát vagy többet tudnak viselni. Entity tárgyak (megyék, kamerák, fények). ellenőrizze node.getEntities() minden olyan szervezet ellenőrzése, amely egy csomóponthoz kapcsolódik, vagy a node.getEntity() az elsődleges szervezet visszavonása.
5. lépés: Vertex és Polygon adatokhoz való hozzáférés
A csomópontok entitása a Mesh és hívja getControlPoints() A vertikális pozíciók és a getPolygons() Az indexek listája:
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() Visszatér a List<Vector4> Hol van x, y, z a pozíciót és w A homogén koordinátus (normálisan 1.0) a rendszerben van.
mesh.getPolygons() Visszatér a List<int[]> ahol minden sorrend az ellenőrzési pont-indexek megrendelt készlete egy arcra.
6. lépés: Formátum-specifikus töltő opciók alkalmazása
A fájl értelmezésének finom ellenőrzése érdekében lépjen át a terhelési lehetőségek példáját, hogy Scene.fromFile() vagy scene.open().
A fájl - 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 fájlok - 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);Fájlok - 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);Támogatott import formátumok
| formátum | kiterjesztés | jegyzetek |
|---|---|---|
| OBJ | .obj | Wavefront OBJ – opcionális .mtl A dokumentumok; lehetővé teszi, hogy a ObjLoadOptions.setEnableMaterials(true) |
| STL | .stl | Az ASCII és a bináris módok automatikusan felfedezhetők |
| GTTF | .gltf, .glb | glTF 2.0; bináris GLB és JSON változatok mind támogatott |
| FBX | .fbx | Bináris FBX támogatás |
Közös problémák és megoldások
IOException A terhelés - Ellenőrizze a fájl útvonal helyes és a dokumentum létezik. használja az abszolút útvonalak fejlesztés során, hogy megszüntesse a munka-vezérlő kétségbeesettségét.
NullPointerException hozzáférési egységek Nem minden csomópontnak van geometria, mindig a node.getEntity() instanceof Mesh a szétválasztás előtt, vagy iterátus node.getEntities() A csomópontok kezelése több kötött tárgyral.
Koordinációs rendszer hibás - Ha a feltöltött modell flipped vagy forgatott, használja setFlipCoordinateSystem(true) A megfelelő terhelési lehetőségek osztályán (ObjLoadOptions, GltfLoadOptions,vagy StlLoadOptions).
A színpadon a tervek, de getChildNodes() üres az — Néhány fájl tárolja a geometria al-szcenák helyett a gyökér csomópont. scene.getSubScenes() és ellenőrizze az egyes alszövetségek gyökércsomóját.
Gyakran feltett kérdések (FAQ)
Milyen formátumokat tölthetek fel?
OBJ, STL (bináris és ASCII), glTF 2.0 / GLB, és FBX. A formátum felismerése automatikusan a fájl kiterjesztésén alapul, amikor hívja Scene.fromFile().
Lehet-e egy áramból tölteni?
Igen az. scene.open(InputStream) és Scene.fromStream(InputStream) Mindkettő elfogadja a Java-t InputStream.Ön is át tud adni a FileFormat paraméter, amikor a folyadék nem hordoz kiterjesztést.
A könyvtár biztonságos?
Minden egyes Scene A példa független, és nem osztja meg a változó állapotot más pólusokkal.
Hogyan olvassam a poligon számokat anélkül, hogy minden arcát iterálnék?
hívás mesh.getPolygonCount() Egy teljes számításhoz.