Sådan indlæses 3D-modeller i Java

Sådan indlæses 3D-modeller i Java

Aspose.3D FOSS for Java leverer et enkelt API til at åbne 3D-filer uden nogen native afhængigheder. Efter at have indlæst en fil i et Scene-objekt kan du gå igennem nodehierarkiet og læse rå geometridata for hver mesh i scenen.

Trin-for-trin guide

Trin 1: Tilføj Maven-afhængigheden

Tilføj Aspose.3D FOSS‑afhængigheden til din pom.xml. Ingen yderligere native biblioteker er påkrævet.

<dependency>
  <groupId>com.aspose</groupId>
  <artifactId>aspose-3d-foss</artifactId>
  <version>26.1.0</version>
</dependency>

Trin 2: Importer de nødvendige klasser

Scene-klassen er den øverste container for alle 3D-data. Importér den sammen med Node, Mesh og eventuelle format‑specifikke indlæsnings‑option‑klasser, du har brug for.

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 offentlige klasser findes i com.aspose.threed-pakken.


Trin 3: Indlæs en fil

Brug den statiske Scene.fromFile()‑metode til at åbne ethvert understøttet format. Biblioteket registrerer formatet automatisk ud fra filendelsen.

// Automatic format detection from the file extension
Scene scene = Scene.fromFile("model.obj");

Alternativt kan du oprette en Scene‑instans og kalde open(). Dette er nyttigt, når du vil videregive indlæsningsindstillinger eller håndtere fejl eksplicit:

Scene scene = new Scene();
scene.open("model.obj");

Begge tilgange understøtter OBJ, STL (binær og ASCII), glTF 2.0 / GLB og FBX-filer.


Trin 4: Gennemløb scenenoder

En indlæst scene er et træ af Node‑objekter med roden i scene.getRootNode(). Brug getChildNodes() til at iterere rekursivt og besøge alle noder:

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);
        }
    }
}

Hver Node kan bære nul eller flere Entity-objekter (meshes, kameraer, lys). Tjek node.getEntities() for at inspicere hver entitet, der er vedhæftet en node, eller brug node.getEntity() til at hente den primære entitet.


Trin 5: Få adgang til vertex- og polygondata

Cast en nodes enhed til Mesh og kald getControlPoints() for vertexpositioner og getPolygons() for ansigtsindekslister:

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() returnerer en List<Vector4> hvor x, y, z bærer positionen, og w er den homogene koordinat (normalt 1.0).

mesh.getPolygons() returnerer en List<int[]>, hvor hvert array er den ordnede mængde af kontrolpunkt‑indekser for én flade.


Trin 6: Anvend format‑specifikke indlæsningsindstillinger

For finjusteret kontrol over, hvordan en fil fortolkes, skal du videregive en load‑options‑instans til Scene.fromFile() eller scene.open().

OBJ-filer — 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-filer — 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-filer — 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);

Understøttede importformater

FormatUdvidelseBemærkninger
Wavefront OBJ.objValgfri .mtl materialfil; aktiver med ObjLoadOptions.setEnableMaterials(true)
STL.stlASCII- og binære tilstande opdages automatisk
glTF 2.0.gltf, .glbBåde binære GLB- og JSON-varianter understøttes
Autodesk FBX.fbxBinær FBX understøttes

Almindelige problemer og løsninger

IOException ved indlæsning — Bekræft, at filstien er korrekt, og at filen findes. Brug absolutte stier under udvikling for at fjerne tvetydighed i arbejdsmappe.

NullPointerException accessing entity — Ikke hver node indeholder geometri. Sørg altid for at beskytte med node.getEntity() instanceof Mesh før casting, eller iterer node.getEntities() for at håndtere noder med flere vedhæftede objekter.

Koordinatsystem mismatch — Hvis den indlæste model ser vendt eller roteret ud, brug setFlipCoordinateSystem(true) på den relevante load‑options‑klasse (ObjLoadOptions, GltfLoadOptions eller StlLoadOptions).

Scene indlæses, men getChildNodes() er tom — Nogle filer gemmer geometri under under‑scener i stedet for rotnoden. Tjek scene.getSubScenes() og inspicer hver under‑scenes rotnode.


Ofte stillede spørgsmål (FAQ)

Hvilke formater kan jeg indlæse?

OBJ, STL (binær og ASCII), glTF 2.0 / GLB og FBX. Formatdetektering er automatisk baseret på filtypenavnet, når du kalder Scene.fromFile().

Kan jeg indlæse fra en strøm?

Ja. scene.open(InputStream) og Scene.fromStream(InputStream) accepterer begge en Java InputStream. Du kan også videregive en FileFormat-parameter, når strømmen ikke indeholder en udvidelse.

Er biblioteket trådsikkert?

Hver Scene-instans er uafhængig og deler ikke mutabel tilstand med andre instanser.

Hvordan læser jeg polygonantal uden at iterere hver flade?

Kald mesh.getPolygonCount() for en direkte heltalsoptælling.


Se også

 Dansk