Aspose.3D FOSS for Java obsługuje pięć formatów plików 3D: OBJ, STL, glTF, GLB, i FBX (tylko import). Ten post jest praktycznym przewodnikiem format po formacie, pokazującym, jak wczytywać i zapisywać każdy z nich, jakie opcje są dostępne oraz jak konwertować pomiędzy nimi.

Wszystkie przykłady używają com.aspose.threed.* pakiet:

import com.aspose.threed.*;

Zależność Maven:

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

Krajobraz formatu

Zanim zanurkujemy, oto szybki przegląd czterech obsługiwanych formatów i ich typowych zastosowań.

FormatRozszerzenieImportEksportWsparcie materiałoweHierarchia scen
OBJ.objTakTakPodstawowe (pliki MTL)Płaski
STL.stlTakTakBrakPłaski
glTF 2.0.gltfTakTakPBRPełny
GLB.glbTakTakPBRPełny
FBX.fbxTakNieBogatyPełny

OBJ, STL, glTF i GLB obsługują zarówno import, jak i eksport. FBX jest obsługiwany dla tylko import. GLB (binary glTF) jest generowany za pomocą GltfSaveOptions przy użyciu setContentType(FileContentType.BINARY).

OBJ: Wavefront Object

OBJ jest jednym z najpowszechniej wspieranych formatów siatek 3D. Przechowuje geometrię jako zwykły tekst, z opcjonalnym .mtl plikiem towarzyszącym dla materiałów.

Ładowanie plików OBJ

Najprostsze podejście to przekazanie ścieżki do pliku bezpośrednio:

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

Aby uzyskać większą kontrolę, użyj ObjLoadOptions:

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

Gdy plik OBJ odwołuje się do pliku MTL (poprzez mtllib dyrektywę), biblioteka spróbuje automatycznie wczytać definicje materiałów z tego pliku. Plik MTL powinien znajdować się w tym samym katalogu co plik OBJ lub w ścieżce określonej w dyrektywie.

Zapisywanie jako OBJ

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

Zastosowania OBJ

  • Wymiana danych siatki pomiędzy różnymi narzędziami 3D.
  • Importowanie modeli z bibliotek zasobów, które udostępniają je w formacie OBJ.
  • Szybka inspekcja geometrii bez złożonych hierarchii sceny.

STL: Stereolitografia

STL jest standardowym formatem do druku 3D. Reprezentuje surową, triangulowaną geometrię bez materiałów, kolorów ani hierarchii sceny. Pliki STL występują w dwóch wariantach: ASCII (czytelny dla człowieka) i binarnym (kompaktowym).

Ładowanie plików STL

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

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

Zapisywanie jako STL

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

Aby kontrolować wyjście, użyj StlSaveOptions:

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

Rozważania dotyczące STL

  • Pliki STL zawierają wyłącznie trójkątną geometrię. Materiały, tekstury i hierarchia sceny są tracone podczas eksportu.
  • Binarny STL jest znacznie mniejszy niż ASCII STL przy dużych modelach.
  • STL jest formatem wyboru, gdy celem jest drukarka 3D lub oprogramowanie slicer.

glTF: GL Transmission Format

glTF jest nowoczesnym formatem zaprojektowanym do efektywnego przesyłania i ładowania treści 3D, szczególnie w sieci i w aplikacjach czasu rzeczywistego. Obsługuje materiały PBR, hierarchie scen oraz animacje.

Ładowanie plików glTF

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

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

Zapisywanie jako glTF

Podstawowe zapisywanie używa rozszerzenia pliku do określenia formatu:

scene.save("output.gltf");

Aby uzyskać szczegółową kontrolę, użyj GltfSaveOptions:

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

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

Szczegóły GltfSaveOptions

MetodaCel
setFlipCoordinateSystem(boolean)Odwróć oś układu współrzędnych podczas eksportu. Przydatne przy konwersji z Y‑up na Z‑up lub odwrotnie.
setPrettyPrint(boolean)Formatuj wyjściowy JSON z wcięciami dla czytelności. Ustaw na false dla mniejszego rozmiaru pliku w produkcji.

Zastosowania glTF

  • Przeglądarki 3D oparte na sieci (three.js, Babylon.js).
  • Aplikacje w czasie rzeczywistym i silniki gier.
  • Zachowywanie definicji materiałów PBR pomiędzy narzędziami.

FBX: Filmbox (tylko import)

FBX jest formatem własnościowym firmy Autodesk, szeroko stosowanym w tworzeniu gier i cyfrowej treści. Obsługuje rozbudowane hierarchie scen, materiały i animacje. Aspose.3D FOSS dla Java obsługuje FBX dla tylko import – eksport do FBX nie jest dostępny.

Ładowanie plików FBX

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

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

Konwertowanie FBX na inne formaty

Ponieważ eksport FBX nie jest obsługiwany, konwertuj zaimportowane sceny FBX do glTF, GLB, OBJ lub STL:

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

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

Zastosowania FBX

  • Importowanie zasobów z narzędzi Autodesk (Maya, 3ds Max) i konwertowanie ich na inne formaty.
  • Ładowanie postaci z riggingiem i animowanych scen w celu ponownego eksportu do glTF/GLB.

Konwersja wsadowa

Typowy przepływ pracy polega na konwertowaniu całego katalogu plików z jednego formatu na inny. Oto wzorzec dla konwersji wsadowej:

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

To ładuje każdy .obj plik w katalogu, konwertuje każdy do glTF z ładnie sformatowanym wyjściem i zapisuje wyniki. Możesz dostosować ten wzorzec do dowolnej kombinacji formatu źródłowego i docelowego.

Referencja konwersji między formatami

Poniższa tabela pokazuje, czego można się spodziewać przy konwersji między formatami.

OdDoGeometriaMateriałyHierarchiaNotatki
OBJSTLZachowaneUtraconeN/ASTL nie obsługuje materiałów
OBJglTF/GLBZachowanePrzekonwertowano na PBRPłaskiMateriały MTL mapowane tam, gdzie to możliwe
STLOBJZachowaneBrakN/ABrak materiałów w źródle
STLglTF/GLBZachowaneDomyślnePłaskiZastosowano domyślny materiał
glTFOBJZachowanyUproszczonySpłaszczonePBR do podstawowego materiału
glTFSTLZachowaneUtraconeSpłaszczoneTylko geometria
FBXOBJZachowaneUproszczoneSpłaszczoneUproszczenie materiału
FBXSTLZachowaneUtraconeSpłaszczoneTylko geometria
FBXglTF/GLBZachowanePrzekonwertowano na PBRZachowaneDobra wierność

Ogólne wytyczne konwersji

  • Geometria jest zawsze zachowywana we wszystkich parach formatów.
  • Materiały najlepiej zachowują się w formatach glTF i FBX, które oba obsługują bogate modele materiałów. Konwersja do STL zawsze usuwa materiały. Konwersja do OBJ upraszcza materiały do podstawowego modelu MTL.
  • Hierarchia sceny jest zachowywana w formatach glTF i FBX. OBJ i STL tworzą płaskie struktury.

Łącząc wszystko razem

Oto kompletny przykład, który wczytuje plik OBJ, przegląda jego węzły i eksportuje zarówno do glTF, jak 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.");
    }
}

Podsumowanie

Aspose.3D FOSS for Java zapewnia spójne API w wielu formatach. Kluczowe punkty:

  • OBJ – prosty wymiana siatek z podstawowymi materiałami.
  • STL – format tylko geometryczny dla procesów druku 3D.
  • glTF / GLB – nowoczesny format obsługujący PBR do zastosowań webowych i w czasie rzeczywistym. Użyj GltfSaveOptions z setContentType(FileContentType.BINARY) dla wyjścia GLB.
  • FBX – tylko import; bogaty format do ładowania zasobów z silników gier i narzędzi DCC.

Użyj klas opcji ładowania i zapisu specyficznych dla formatu (ObjLoadOptions, StlLoadOptions, StlSaveOptions, GltfLoadOptions, GltfSaveOptions, FbxLoadOptions) gdy potrzebujesz precyzyjnej kontroli nad procesem importu lub eksportu.

Aby uzyskać więcej szczegółów, odwiedź Aspose.3D dokumentację lub przeglądaj źródło na GitHub.