Aspose.3D FOSS for Java understøtter fem 3D‑filformater: OBJ, STL, glTF, GLB, og FBX (kun import).

Alle eksempler bruger com.aspose.threed.* pakken:

import com.aspose.threed.*;

Maven‑afhængighed:

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

Formatoversigt

Før du dykker ned, er her en hurtig oversigt over de fire understøttede formater og deres typiske anvendelsestilfælde.

FormatUdvidelseImportExportMaterialestøtteSceneshierarki
OBJ.objJaJaGrundlæggende (MTL‑filer)Flad
STL.stlJaJaIngenFlad
glTF 2.0.gltfJaJaPBRFuld
GLB.glbJaJaPBRFuld
FBX.fbxJaNejRigFuld

OBJ, STL, glTF og GLB understøtter både import og eksport. FBX understøttes til kun import. GLB (binær glTF) genereres via GltfSaveOptions med setContentType(FileContentType.BINARY).

OBJ: Wavefront Object

OBJ er et af de mest udbredte understøttede 3D-mesh-formater. Det gemmer geometri som almindelig tekst, med en valgfri .mtl medfølgende fil til materialer.

Indlæsning af OBJ‑filer

Den enkleste metode er at videregive filstien direkte:

Scene scene = Scene.fromFile("model.obj");

For mere kontrol, brug ObjLoadOptions:

ObjLoadOptions opts = new ObjLoadOptions();
Scene scene = Scene.fromFile("model.obj", opts);

Når OBJ-filen refererer til en MTL-fil (via en mtllib direktiv), vil biblioteket forsøge at indlæse materialedefinitioner fra den automatisk. MTL-filen skal være i samme mappe som OBJ-filen eller på den sti, der er angivet i direktivet.

Gem som OBJ

Scene scene = Scene.fromFile("input.fbx");
scene.save("output.obj");

OBJ‑anvendelsestilfælde

  • Udveksling af mesh‑data mellem forskellige 3D‑værktøjer.
  • Import af modeller fra asset‑biblioteker, der distribueres i OBJ‑format.
  • Hurtig inspektion af geometri uden komplekse scenehierarkier.

STL: Stereolithografi

STL er standardformatet til 3D‑print. Det repræsenterer rå trianguleret geometri uden materialer, farver eller scenehierarki. STL‑filer findes i to varianter: ASCII (menneskelæselig) og binær (kompakt).

Indlæsning af STL‑filer

// Simple load
Scene scene = Scene.fromFile("part.stl");

// With explicit options
StlLoadOptions opts = new StlLoadOptions();
Scene scene = Scene.fromFile("part.stl", opts);

Gem som STL

Scene scene = Scene.fromFile("model.obj");
scene.save("output.stl");

For at kontrollere outputtet, brug StlSaveOptions:

StlSaveOptions opts = new StlSaveOptions();
scene.save("output.stl", opts);

STL‑overvejelser

  • STL gemmer kun trekantgeometri. Materialer, teksturer og scenehierarki understøttes ikke og fjernes ved eksport.
  • STL-eksport gør ikke triangulere automatisk. Binær STL skriver kun de første 3 hjørner af hver polygonflade; firkant- og n‑gon‑flader bliver tavst afkortet. ASCII STL skriver alle hjørneindekser per flade, hvilket giver fejlbehæftet output for ikke‑trekantede flader. Brug altid forud‑triangulerede mesh (alle flader er trekanter), når du eksporterer til STL.
  • Binær STL er betydeligt mindre end ASCII STL for store modeller.
  • STL er det foretrukne format, når målet er en 3D‑printer eller slicer‑software.

glTF: GL Transmission Format

glTF er et moderne format designet til effektiv transmission og indlæsning af 3D‑indhold, især på nettet og i realtids‑applikationer. Det understøtter PBR‑materialer, scenehierarkier og animationer.

Indlæsning af glTF‑filer

Scene scene = Scene.fromFile("scene.gltf");

// With options
GltfLoadOptions opts = new GltfLoadOptions();
Scene scene = Scene.fromFile("scene.gltf", opts);

Gem som glTF

Den grundlæggende gemning bruger filendelsen til at bestemme formatet:

scene.save("output.gltf");

For detaljeret kontrol, brug GltfSaveOptions:

GltfSaveOptions opts = new GltfSaveOptions();
opts.setFlipCoordinateSystem(true);
opts.setPrettyPrint(true);

scene.save("output.gltf", opts);

GltfSaveOptions-detaljer

MetodeFormål
setFlipCoordinateSystem(boolean)Vend koordinatsystemets akse under eksport. Nyttigt ved konvertering fra Y‑op til Z‑op eller omvendt.
setPrettyPrint(boolean)Formater output‑JSON’en med indrykning for læsbarhed. Sæt til false for mindre filstørrelse i produktion.

glTF-anvendelsestilfælde

  • Webbaserede 3D-fremvisere (three.js, Babylon.js).
  • Realtime-applikationer og spilmotorer.
  • Bevare PBR-materialdefinitioner på tværs af værktøjer.

FBX: Filmbox (kun import)

FBX er et proprietært format fra Autodesk, som er udbredt i spiludvikling og digital indholdsoprettelse. Aspose.3D FOSS for Java understøtter FBX til kun import — eksport til FBX er ikke tilgængelig.

Kun binær FBX. FBX‑importøren læser kun binære FBX‑filer. At give en ASCII FBX‑fil udløser ImportException("ASCII FBX format not yet supported - only binary FBX is supported"). Node‑hierarki og materialekstraktion fra FBX er ikke fuldt verificeret; komplekse FBX‑scener kan muligvis ikke indlæses fuldstændigt. Animationer og rigging er ikke implementeret.

Indlæsning af FBX-filer

Scene scene = Scene.fromFile("character.fbx");

// With options
FbxLoadOptions opts = new FbxLoadOptions();
Scene scene = Scene.fromFile("character.fbx", opts);

Konvertering af FBX til andre formater

Da FBX-eksport ikke understøttes, kan importerede FBX-scener konverteres til glTF, GLB, OBJ eller STL:

Scene scene = Scene.fromFile("character.fbx");

// Save as GLB
GltfSaveOptions opts = new GltfSaveOptions();
opts.setContentType(FileContentType.BINARY);
scene.save("character.glb", opts);

FBX-anvendelsestilfælde

  • Import af statiske mesh-aktiver fra Autodesk-værktøjer (Maya, 3ds Max) og konvertering til andre formater.
  • Indlæsning af binær FBX-geometri og geneksport til glTF/GLB, OBJ eller STL.

Batchkonvertering

En almindelig arbejdsgang er at konvertere en hel mappe med filer fra ét format til et andet. Her er et mønster for batchkonvertering:

import com.aspose.threed.*;
import java.io.File;

public class BatchConvert {
    public static void main(String[] args) throws Exception {
        File inputDir = new File("models/obj");
        File outputDir = new File("models/gltf");
        outputDir.mkdirs();

        GltfSaveOptions saveOpts = new GltfSaveOptions();
        saveOpts.setPrettyPrint(true);

        File[] objFiles = inputDir.listFiles(
            (dir, name) -> name.toLowerCase().endsWith(".obj")
        );

        if (objFiles == null) return;

        for (File objFile : objFiles) {
            String baseName = objFile.getName()
                .replaceFirst("\\.obj$", "");

            Scene scene = Scene.fromFile(objFile.getAbsolutePath());
            String outPath = new File(outputDir, baseName + ".gltf")
                .getAbsolutePath();

            scene.save(outPath, saveOpts);
            System.out.println("Converted: " + objFile.getName()
                + " -> " + baseName + ".gltf");
        }
    }
}

Dette indlæser hver .obj fil i en mappe, konverterer hver til glTF med pænt formateret output, og gemmer resultaterne. Du kan tilpasse dette mønster til enhver kilde- og målformatkombination.

Reference til tværformatkonvertering

Følgende tabel viser, hvad du kan forvente ved konvertering mellem formater.

FraTilGeometriMaterialerHierarkiNoter
OBJSTLBevarteMistetN/ASTL har ingen materialestøtte
OBJglTF/GLBBevarteKonverteret til PBRFladMTL-materialer kortlagt hvor det er muligt
STLOBJBevarteIngenN/AIngen materialer i kilden
STLglTF/GLBBevarStandardFladStandardmaterial anvendt
glTFOBJBevaretForenkletFladetPBR til grundmateriale
glTFSTLBevaretTabtFladetKun geometri
FBXOBJBevaretForenkletFladetMaterialeforenkling
FBXSTLBevaretTabtFladtryktKun geometri
FBXglTF/GLBBevaretKonverteret til PBRBevaretGod nøjagtighed

Generelle konverteringsretningslinjer

  • Geometri bevares generelt på tværs af formatpar, med én vigtig undtagelse: ved eksport til STL skal mesh‑erne udelukkende bestå af trekantsflader. Binær STL afkorter stiltiende quad‑ og n‑gon‑flader til deres første 3 hjørner; ASCII STL genererer fejlbehæftet output for ikke‑trekantflader.
  • Materialer overlever bedst mellem glTF- og FBX‑importerede scener, der indeholder materialedata. Konvertering til STL fjerner altid materialer. Konvertering til OBJ forenkler materialer til den grundlæggende MTL‑model.
  • Sceneshierarki bevares mellem glTF-formatfiler. OBJ og STL producerer flade strukturer. FBX‑hierarki og materialekstraktion er ikke fuldt verificeret i denne version.

Sammenlægning af alt

Her er et komplet eksempel, der indlæser en OBJ‑fil, inspicerer dens noder og eksporterer til både glTF og GLB:

import com.aspose.threed.*;

public class FormatWorkflow {
    public static void main(String[] args) throws Exception {
        // Load
        Scene scene = Scene.fromFile("input.obj");

        // Inspect
        System.out.println("Nodes in scene:");
        for (Node child : scene.getRootNode().getChildNodes()) {
            System.out.println("  " + child.getName());
            Transform t = child.getTransform();
            System.out.println("    Translation: "
                + t.getTranslation());
        }

        // Export to glTF with options
        GltfSaveOptions gltfOpts = new GltfSaveOptions();
        gltfOpts.setPrettyPrint(true);
        scene.save("output.gltf", gltfOpts);

        // Export to GLB (binary glTF)
        GltfSaveOptions glbOpts = new GltfSaveOptions();
        glbOpts.setContentType(FileContentType.BINARY);
        scene.save("output.glb", glbOpts);

        System.out.println("Export complete.");
    }
}

Opsummering

Aspose.3D FOSS for Java giver dig et konsistent API på tværs af flere formater. Nøglepunkterne:

  • OBJ – simpel mesh‑udveksling med grundlæggende materialer.
  • STL – kun-geometri-format til 3D‑print‑pipeline.
  • glTF / GLB – moderne PBR‑kapabelt format til web‑ og realtidsbrug. Brug GltfSaveOptions med setContentType(FileContentType.BINARY) til GLB‑output.
  • FBX – kun import; rigt format til indlæsning af assets fra spilmotorer og DCC‑værktøjer.

Brug format‑specifikke indlæsnings‑ og gemmeindstillingsklasser (ObjLoadOptions, StlLoadOptions, StlSaveOptions, GltfLoadOptions, GltfSaveOptions, FbxLoadOptions) når du har brug for finjusteret kontrol over import‑ eller eksportprocessen.

For flere detaljer, besøg den Aspose.3D-dokumentation eller gennemse kilden på GitHub.