Come scaricare i modelli 3D in Java

Come scaricare i modelli 3D in Java

Aspose.3D FOSS per Java fornisce un semplice API per aprire file 3D senza alcuna dipendenza nativa. Scene l’oggetto si può camminare la gerarchia dei nodi e leggere i dati di geometria cruda per ogni mesh nella scena.

Guida passo dopo passo

Passo 1: Aggiungi la dipendenza Maven

Aggiungi la dipendenza di Aspose.3D FOSS al tuo pom.xml.Non sono richieste ulteriori biblioteche native.

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

Passo 2: Importare le classi richieste

Il Scene La classe è il contenitore di alto livello per tutti i dati 3D. Importarlo insieme al contenuto Node, Mesh, e qualsiasi classe di opzione di carico specifica per il formato che hai bisogno.

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;

Tutte le classi pubbliche vivono sotto il com.aspose.threed Il pacchetto.


Passo 3: Caricare un file

Utilizzare lo statico Scene.fromFile() Metodo per aprire qualsiasi formato supportato. La biblioteca rileva il formato automaticamente dalla estensione del file.

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

In alternativa, creare un Scene Appello e appello open().Questo è utile quando si desidera passare le opzioni di carico o gestire gli errori esplicitamente:

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

Entrambi gli approcci supportano i file OBJ, STL (binario e ASCII), glTF 2.0 / GLB e FBX.


Passo 4: Trascorrere le nuvole della scena

Una scena caricata è un albero di Node oggetti radicati in scene.getRootNode().Utilizzo getChildNodes() per iterare recurentemente e visitare tutti i nodi:

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

Ogni Node Può essere zero o più. Entity oggetti (messe, telecamere, luci). controllare node.getEntities() per controllare ogni entità collegata a un nodo, o utilizzare node.getEntity() per recuperare l’entità primaria.


Passo 5: Accesso a dati verticali e poligonici

Il cast di un nodo all’entità Mesh e chiamare getControlPoints() per le posizioni verticali e getPolygons() Per le liste di indice faccia:

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() Ritorna a List<Vector4> dove x, y, z Prendere la posizione e w Il coordinato è omogeno (normalmente 1.0).

mesh.getPolygons() Ritorna a List<int[]> dove ogni array è il set ordinato di indicatori di controllo per una faccia.


Passo 6: Applicare opzioni di carico specifiche per il formato

Per il controllo fin-grinato su come un file viene interpretato, passare una opzione di carico all’indirizzo: Scene.fromFile() o scene.open().

Il file di 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);

file di 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);

Il file di 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);

Formati di importazione supportati

formatiestensioneNotizie
OBJ.objWavefront OBJ: opzionale .mtl file; è possibile con ObjLoadOptions.setEnableMaterials(true)
STL.stlASCII e modalità binarie sono autodetettate
Il GTTF.gltf, .glbglTF 2.0; le varianti binarie GLB e JSON sono entrambi supportate
FBX.fbxIl supporto di FBX binario

Problemi e fissazioni comuni

IOException di Load - Verificare che il percorso del file è corretto e il file esiste. utilizzare percorsi assoluti durante lo sviluppo per eliminare l’ambiguità di lavoro-directorio.

NullPointerException Entità di accesso Non tutti i nodi portano geometria. sempre guardare con node.getEntity() instanceof Mesh prima di scorrere o iterare node.getEntities() per gestire i nodi con più oggetti collegati.

Il sistema coordinato è errato Se il modello caricato appare flessibile o rotto, utilizzare setFlipCoordinateSystem(true) per la classe di opzioni di carico appropriata (ObjLoadOptions, GltfLoadOptions,o StlLoadOptions).

La scena si sposta ma getChildNodes() è vuoto — Alcuni file memorizzano la geometria sotto sottoscene piuttosto che il nodo radicale. scene.getSubScenes() e controllare il nodo radicale di ciascuna sottoscena.


Domande frequenti (FAQ)

Quali formati posso caricare?

OBJ, STL (binario e ASCII), glTF 2.0 / GLB, e FBX. La rilevazione del formato è automatica sulla base dell’estensione del file quando si chiama Scene.fromFile().

Posso caricare da un flusso?

Sì sì. scene.open(InputStream) e Scene.fromStream(InputStream) Entrambi accettano Java InputStream.Puoi anche passare a FileFormat Parametri quando il flusso non porta una estensione.

La biblioteca è sicura?

Ogni Scene L’indice è indipendente e non condivide lo stato mutabile con gli altri.

Come faccio a leggere i numeri di poligono senza iterare ogni viso?

Chiamate mesh.getPolygonCount() per un totale contatore diretto.


Vedi anche

 Italiano