Jak si 3D modely v Java stáhnout

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átRozšířeníPoznámky
OBJ.objWavefront OBJ – volitelné .mtl souborů; umožňují se ObjLoadOptions.setEnableMaterials(true)
STL.stlASCII a binární režimy jsou automaticky detekovány
Gltf.gltf, .glbglTF 2.0; binární GLB a JSON varianty jsou podporovány
FBX.fbxBiná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.


Vidět také

 Čeština