Aspose.3D FOSS za Java podržava pet 3D formata datoteka: OBJ, STL, glTF, GLB, i FBX (samo uvoz).

Svi primeri koriste com.aspose.threed.* paket:

import com.aspose.threed.*;

Maven zavisnost:

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

Pregled formata

Pre nego što zaronimo, evo brzog pregleda četiri podržana formata i njihovih tipičnih slučajeva upotrebe.

FormatEkstenzijaUvozIzvozPodrška za materijaleHijerarhija scene
OBJ.objDaDaOsnovno (MTL fajlovi)Ravno
STL.stlDaDaNištaRavno
glTF 2.0.gltfDaDaPBRPuno
GLB.glbDaDaPBRPotpuno
FBX.fbxDaNeBogatoPotpuno

OBJ, STL, glTF, i GLB podržavaju i uvoz i izvoz. FBX je podržan za samo uvoz. GLB (binary glTF) se proizvodi putem GltfSaveOptions sa setContentType(FileContentType.BINARY).

OBJ: Wavefront objekat

OBJ je jedan od najšire podržanih 3D mesh formata. Čuva geometriju kao običan tekst, uz opcioni .mtl prateći fajl za materijale.

Učitavanje OBJ fajlova

Najjednostavniji pristup je da se putanja do fajla prosledi direktno:

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

Za veću kontrolu, koristite ObjLoadOptions:

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

Kada OBJ fajl referiše na MTL fajl (preko mtllib direktive), biblioteka će pokušati da automatski učita definicije materijala iz njega. MTL fajl bi trebalo da bude u istom direktorijumu kao OBJ fajl ili na putanji navedenoj u direktivi.

Čuvanje kao OBJ

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

Primene OBJ-a

  • Razmena podataka o mrežama između različitih 3D alata.
  • Uvoz modela iz biblioteka sredstava koje distribuiraju u OBJ formatu.
  • Brza inspekcija geometrije bez složenih hijerarhija scene.

STL: Stereolitografija

STL je standardni format za 3D štampu. Predstavlja sirovu trianguliranu geometriju bez materijala, boja ili hijerarhije scene. STL fajlovi dolaze u dve varijante: ASCII (čitljiv za čoveka) i binarni (kompaktniji).

Učitavanje STL fajlova

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

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

Čuvanje kao STL

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

Da biste kontrolisali izlaz, koristite StlSaveOptions:

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

STL razmatranja

  • STL čuva samo trougaonu geometriju. Materijali, teksture i hijerarhija scene nisu podržani i odbacuju se pri izvozu.
  • STL izvoz radi ne automatski triangulira. Binary STL zapisuje samo prva 3 vrha svakog poligonalnog lica; četvorouglovi i n‑gon lica se tiho skraćuju. ASCII STL zapisuje sve indekse vrhova po licu, što dovodi do neispravnog izlaza za lica koja nisu trouglovi. Uvek koristite unapred triangulisane mreže (lica koja su svi trouglovi) prilikom izvoza u STL.
  • Binarni STL je značajno manji od ASCII STL-a za velike modele.
  • STL je format po izboru kada je cilj 3D štampač ili softver za sečenje.

glTF: GL Transmission Format

glTF je moderan format dizajniran za efikasno prenošenje i učitavanje 3D sadržaja, posebno na webu i u aplikacijama u realnom vremenu. Podržava PBR materijale, hijerarhije scena i animacije.

Učitavanje glTF fajlova

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

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

Čuvanje kao glTF

Osnovno čuvanje koristi ekstenziju fajla da odredi format:

scene.save("output.gltf");

Za detaljnu kontrolu, koristite GltfSaveOptions:

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

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

Detalji GltfSaveOptions

MetodSvrha
setFlipCoordinateSystem(boolean)Preokrenite osu koordinatnog sistema prilikom izvoza. Korisno pri konverziji iz Y‑gore u Z‑gore ili obrnuto.
setPrettyPrint(boolean)Formatirajte izlaz JSON uz uvlačenje radi čitljivosti. Postavite na false za manju veličinu fajla u produkciji.

glTF slučajevi upotrebe

  • Web‑bazirani 3D pregledači (three.js, Babylon.js).
  • Aplikacije u realnom vremenu i game engine‑i.
  • Čuvanje PBR definicija materijala između alata.

FBX: Filmbox (Samo uvoz)

FBX je vlasnički format kompanije Autodesk koji se široko koristi u razvoju igara i digitalnoj kreaciji sadržaja. Aspose.3D FOSS za Java podržava FBX za samo uvoz — izvoz u FBX nije dostupan.

Samo binarni FBX. FBX uvoznik čita samo binarne FBX fajlove. Prosleđivanje ASCII FBX fajla izaziva ImportException("ASCII FBX format not yet supported - only binary FBX is supported"). Hijerarhija čvorova i ekstrakcija materijala iz FBX-a nisu u potpunosti verifikovani; složene FBX scene možda se neće učitati u potpunosti. Animacije i rigovanje nisu implementirani.

Učitavanje FBX fajlova

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

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

Konvertovanje FBX-a u druge formate

Pošto izvoz FBX-a nije podržan, konvertujte uvezene FBX scene u glTF, GLB, OBJ ili STL:

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

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

FBX primene

  • Uvoz statičkih mesh resursa iz Autodesk alata (Maya, 3ds Max) i konvertovanje u druge formate.
  • Učitavanje binarne FBX geometrije i ponovni izvoz u glTF/GLB, OBJ ili STL.

Grupna konverzija

Uobičajen radni tok je konvertovanje celog direktorijuma fajlova sa jednog formata na drugi. Evo obrasca za grupnu konverziju:

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

Ovo učitava sve .obj datoteku u direktorijumu, konvertuje svaku u glTF sa lepo formatiranim izlazom i čuva rezultate. Možete prilagoditi ovaj obrazac za bilo koju kombinaciju izvornog i odredišnog formata.

Referenca za konverziju između formata

Sledeća tabela prikazuje šta možete očekivati pri konvertovanju između formata.

OdDoGeometrijaMaterijaliHijerarhijaNapomene
OBJSTLSačuvanoIzgubljenoN/ASTL nema podršku za materijale
OBJglTF/GLBSačuvanoPretvoreno u PBRRavnoMTL materijali mapirani gde je moguće
STLOBJSačuvanoNištaN/ANema materijala u izvoru
STLglTF/GLBSačuvanoPodrazumevanoRavnoPodrazumevani materijal je primenjen
glTFOBJSačuvanoPojednostavljenoIzravnanoPBR u osnovni materijal
glTFSTLSačuvanoIzgubljenoIzravnatoSamo geometrija
FBXOBJSačuvanoPojednostavljenoIzravnatoPojednostavljenje materijala
FBXSTLSačuvanoIzgubljenoIzravnatoSamo geometrija
FBXglTF/GLBSačuvanoKonvertovano u PBRSačuvanoDobra vernost

Opšti smernice za konverziju

  • Geometrija se generalno čuva između parova formata, uz jedan važan izuzetak: prilikom izvoza u STL, mreže moraju biti sastavljene isključivo od trouglastih površina. Binarni STL tiho skraćuje kvadratne i n‑gon površine na njihove prve 3 verteksa; ASCII STL proizvodi neispravan izlaz za ne‑trouglaste površine.
  • Materijali najbolje opstaju između glTF i FBX‑uvezanih scena koje uključuju podatke o materijalima. Pretvaranje u STL uvek uklanja materijale. Pretvaranje u OBJ pojednostavljuje materijale na osnovni MTL model.
  • Hijerarhija scene se čuva između glTF‑format fajlova. OBJ i STL proizvode ravne strukture. FBX hijerarhija i ekstrakcija materijala nisu u potpunosti verifikovani u ovoj verziji.

Sastavljanje svega zajedno

Evo kompletnog primera koji učitava OBJ fajl, ispituje njegove čvorove i izvozi u i glTF i 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.");
    }
}

Sažetak

Aspose.3D FOSS za Java vam pruža dosledan API kroz više formata. Ključne tačke:

  • OBJ – jednostavna razmena mreža sa osnovnim materijalima.
  • STL – format samo za geometriju za 3D‑print pipeline‑e.
  • glTF / GLB – moderan PBR‑sposoban format za web i real‑time upotrebu. Koristite GltfSaveOptions sa setContentType(FileContentType.BINARY) za GLB izlaz.
  • FBX – samo za uvoz; bogat format za učitavanje resursa iz game engine‑ova i DCC alata.

Koristite format‑specifične klase opcija učitavanja i čuvanja (ObjLoadOptions, StlLoadOptions, StlSaveOptions, GltfLoadOptions, GltfSaveOptions, FbxLoadOptions) kada vam je potrebna detaljna kontrola nad procesom uvoza ili izvoza.

Za više detalja, posetite Aspose.3D dokumentaciju ili pregledajte izvor na GitHub.