Jak si 3D modely v Java stáhnout
Aspose.3D FOSS pro Java poskytuje jednoduchý API pro otevření 3D souborů bez jakýchkoliv závislostí. Scene objekt můžete projít hierarchii uzly a přečíst surové geometrické údaje pro každý mez v scéně.
Krok za krokem průvodce
Krok 1: Přidejte závislost na Mavenu
Přidejte závislost na Aspose.3D FOSS do vašeho pom.xml.Není nutné dodatečné domorodé knihovny.
<dependency>
<groupId>org.aspose</groupId>
<artifactId>aspose-3d-foss</artifactId>
<version>26.5.0</version>
</dependency>Krok 2: Import požadovaných tříd
a to Scene třída je nejvyšší úrovní kontejner pro všechny 3D data. importovat spolu s Node, Mesh, a jakékoli formátové třídy pro typy nabíjení, které potřebujete.
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;Všechny veřejné třídy žijí pod com.aspose.threed Paketní balíček .
Krok 3: Nahrávat soubor
Použijte statický Scene.fromFile() metoda otevření jakéhokoli podporovaného formátu. knihovna detekuje formát automaticky z rozšíření souboru.
// Automatic format detection from the file extension
Scene scene = Scene.fromFile("model.obj");Alternativně vytvořte A Scene Případ a volání open().To je užitečné, když chcete projít možnosti zatížení nebo řešit chyby výslovně:
Scene scene = new Scene();
scene.open("model.obj");Oba přístupy podporují OBJ, STL (binární a ASCII), glTF 2.0 / GLB a FBX soubory.
Krok 4: Přechod do scénických nodech
Nádherná scéna je stromem Node Objekty zakotvené v scene.getRootNode().Použití getChildNodes() Zobrazit a navštívit všechny uzly:
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);
}
}
}Každý z nich Node Může mít nulový nebo více Entity předměty (mše, kamery, světla) kontrolovat node.getEntities() pro kontrolu každé subjektu připojeného k uzlu, nebo použití node.getEntity() Získání primární jednotky.
Krok 5: Přístup k vertexovým a polygonovým údajům
Vložte entitu node na Mesh a volání getControlPoints() pro vertikální pozice a getPolygons() Pro indexové listy:
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() Zpět na A List<Vector4> Kde x, y, z Vezměte si pozici a w Je to homogenní koordinát (normálně 1.0).
mesh.getPolygons() Zpět na A List<int[]> kde je každá řada objednaným souborem kontrolních bodů pro jednu tvář.
Krok 6: Použijte formátové možnosti nabíjení
Pro jemně zhotovenou kontrolu toho, jak je soubor interpretován, přejděte do příkladu možnost nabití na Scene.fromFile() nebo scene.open().
OBJ soubory - 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 soubory - 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);Smlouva o souborech - 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);Podporované formáty dovozu
| Formát | Rozšíření | Poznámky |
|---|---|---|
| OBJ | .obj | Wavefront OBJ – volitelné .mtl souborů; umožňují se ObjLoadOptions.setEnableMaterials(true) |
| STL | .stl | ASCII a binární režimy jsou automaticky detekovány |
| Gltf | .gltf, .glb | glTF 2.0; binární GLB a JSON varianty jsou podporovány |
| FBX | .fbx | Binární FBX podporované |
Společné problémy a fixy
IOException na přetížení — Zkontrolujte, že je správná cesta souboru a soubory existují. Použijte absolutní cesty během vývoje k odstranění pracovní-přívodní ambiguity.
NullPointerException přístupové subjekty Ne každý nůž nese geometrii. vždy stráž s node.getEntity() instanceof Mesh před odkládáním nebo iterací node.getEntities() - zpracování uzlin s několika připojenými objekty.
Koordinátor systémů neslučitelný - Pokud se nabitý model objeví ztlumený nebo otáčený, použijte setFlipCoordinateSystem(true) V případě vhodných možností (ObjLoadOptions, GltfLoadOptions,nebo StlLoadOptions).
Scénář se rozkládá, ale getChildNodes() je prázdný — Některé soubory ukládají geometrii pod subscénami namísto kořenového uzla. scene.getSubScenes() a zkontrolujte kořenový uzel každé podscény.
Časté otázky (FAQ)
Jaké formáty mohu načítat?
OBJ, STL (binární a ASCII), glTF 2.0 / GLB a FBX. Detekce formátu je automaticky založena na rozšíření souboru při volání Scene.fromFile().
Mohu si ho naložit z toku?
Ano ano . scene.open(InputStream) a Scene.fromStream(InputStream) Obě přijímá Java InputStream.Můžete také projít A FileFormat parametr, kdy proud nesou prodloužení.
Je knihovna v bezpečí?
Každý z nich Scene Případ je nezávislý a nesdílí měnící se stav s jinými případech.
Jak číst polygonové počty bez iterace každé tváře?
Volání mesh.getPolygonCount() Pro přímý celkový počet.