Jak zainstalować modele 3D w Java

Jak zainstalować modele 3D w Java

Aspose.3D FOSS dla Java zapewnia prostą API do otwarcia plików 3D bez żadnych zależności. po załadowaniu pliku w Scene Obiekt można przejść hierarchii węzłów i przeczytać surowe dane geometrii dla każdego z nich na scenie.

Przewodnik krok po kroku

Krok 1: Dodaj uzależnienie od Maven

Dodaj zależność Aspose.3D FOSS do Twojego pom.xml.Nie wymagane są dodatkowe biblioteki domowe.

<dependency>
  <groupId>org.aspose</groupId>
  <artifactId>aspose-3d-foss</artifactId>
  <version>26.5.0</version>
</dependency>

Krok 2: Wprowadzenie wymaganych klas

i The Scene Klasy są najwyższym pojemnikiem dla wszystkich danych 3D. Importować je wraz z Node, Mesh,i wszelkie klasy opcji obciążenia specyficzne dla formatu, których potrzebujesz.

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;

Wszystkie klasy publiczne żyją pod com.aspose.threed Pakiet w pakiecie.


Krok 3: Pobierz plik

Użyj statycznego Scene.fromFile() metoda otwierania dowolnego obsługiwanego formatu. biblioteka automatycznie wykrywa format z rozszerzenia pliku.

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

Alternatywnie, tworzyć A Scene Instancja i wezwanie open().Jest to przydatne, gdy chcesz przejść opcje ładowania lub wyraźnie radzić sobie z błędami:

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

Oba podejścia obsługują pliki OBJ, STL (binary i ASCII), glTF 2.0 / GLB oraz FBX.


Krok 4: Przechodź przez scenę

„Przemocny sceną jest drzewo Node Obiekty z korzeniami w scene.getRootNode().• Używanie getChildNodes() do iteracji powtarzającej się i odwiedzić wszystkie węzły:

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żdy z nich Node Można przewozić zero lub więcej. Entity obiekty (meczety, kamery, światła) sprawdź node.getEntities() do sprawdzenia każdej jednostki przymocowanej do nodu lub używania node.getEntity() Zostawienie pierwotnej jednostki.


Krok 5: Dostęp do danych Vertex i Polygon

Wprowadź podmiot węzła do Mesh i wezwanie getControlPoints() w pozycji vertex oraz getPolygons() Dla listy indeksów twarzy:

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() Powrót A List<Vector4> gdzie x, y, z Wziąć pozycję i w Jest to koordynacja homogenna (zazwyczaj 1.0).

mesh.getPolygons() Powrót A List<int[]> gdzie każda rzęs jest zamówionym zestawem indeksów punktów kontrolnych dla jednej twarzy.


Krok 6: Wprowadź opcje ładowania specyficzne dla formatu

Aby uzyskać kontrolę nad tym, jak plik jest interpretowany, przejdź do przykładu opcji ładowania na Scene.fromFile() lub scene.open().

Archiwum OBJ - 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);

pliki GLTF / GLB - 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);

Archiwum STL - 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);

Wspierane formaty importu

FormatowanieRozszerzenieNotatki
OBJ.objWavefront OBJ – opcjonalny .mtl materiałowy; umożliwia się ObjLoadOptions.setEnableMaterials(true)
STL.stlASCII i tryb binarny są automatycznie wykryte
GTTF.gltf, .glbglTF 2.0; warianty binarne GLB i JSON wspierane zarówno
FBX.fbxPodtrzymywany binary fbx

Wspólne problemy i rozwiązania

IOException na ładunek — Sprawdź, czy ścieżka pliku jest poprawna i że istnieje. użyj absolutnych śródlądów podczas rozwoju, aby wyeliminować niejasność w dyrektywie pracy.

NullPointerException Dostęp do jednostki Nie każdy nód nosi geometrii. zawsze strzeż się z node.getEntity() instanceof Mesh przed wyciągnięciem lub iteracją node.getEntities() do obsługi węzłów z wieloma przymocowanymi obiektami.

System koordynacyjny nie jest zgodny — Jeśli ładowany model pojawia się zderzony lub obrotowany, użyj setFlipCoordinateSystem(true) w odpowiednim zakresie opcji ładowania (ObjLoadOptions, GltfLoadOptions,lub StlLoadOptions).

Scena jest ciężka, ale getChildNodes() jest pusty — Niektóre pliki przechowują geometrię pod podscenami zamiast węzła korzeniowego. scene.getSubScenes() Sprawdź korzenie każdej podskrzynki.


Często zadawane pytania (FAQ)

Jakie formaty mogę pobrać?

OBJ, STL (binary i ASCII), glTF 2.0 / GLB oraz FBX. Detekcja formatu jest automatyczna w oparciu o rozszerzenie pliku podczas wezwania Scene.fromFile().

Czy mogę pobrać z prądu?

Tak i tak. scene.open(InputStream) i Scene.fromStream(InputStream) Obaj przyjmują Java InputStream.Możesz również przejść przez FileFormat parametr, gdy strumień nie przynosi rozszerzenia.

Czy biblioteka jest bezpieczna?

Każdy z nich Scene instancja jest niezależna i nie dzieli się stanem zmiennym z innymi instancjami.

Jak czytać polygony liczące bez iteracji każdego twarzy?

Wzywaj mesh.getPolygonCount() Dla bezpośredniego całkowitego obliczenia.


Zobacz również

 Polski