Hogyan kell feltölteni 3D modelleket a Java-ban

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átumkiterjesztésjegyzetek
OBJ.objWavefront OBJ – opcionális .mtl A dokumentumok; lehetővé teszi, hogy a ObjLoadOptions.setEnableMaterials(true)
STL.stlAz ASCII és a bináris módok automatikusan felfedezhetők
GTTF.gltf, .glbglTF 2.0; bináris GLB és JSON változatok mind támogatott
FBX.fbxBiná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.


Lásd még

 Magyar