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ń.
| Format | Rozszerzenie | Import | Eksport | Wsparcie materiałowe | Hierarchia scen |
|---|---|---|---|---|---|
| OBJ | .obj | Tak | Tak | Podstawowe (pliki MTL) | Płaski |
| STL | .stl | Tak | Tak | Brak | Płaski |
| glTF 2.0 | .gltf | Tak | Tak | PBR | Pełny |
| GLB | .glb | Tak | Tak | PBR | Pełny |
| FBX | .fbx | Tak | Nie | Bogaty | Peł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
| Metoda | Cel |
|---|---|
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.
| Od | Do | Geometria | Materiały | Hierarchia | Notatki |
|---|---|---|---|---|---|
| OBJ | STL | Zachowane | Utracone | N/A | STL nie obsługuje materiałów |
| OBJ | glTF/GLB | Zachowane | Przekonwertowano na PBR | Płaski | Materiały MTL mapowane tam, gdzie to możliwe |
| STL | OBJ | Zachowane | Brak | N/A | Brak materiałów w źródle |
| STL | glTF/GLB | Zachowane | Domyślne | Płaski | Zastosowano domyślny materiał |
| glTF | OBJ | Zachowany | Uproszczony | Spłaszczone | PBR do podstawowego materiału |
| glTF | STL | Zachowane | Utracone | Spłaszczone | Tylko geometria |
| FBX | OBJ | Zachowane | Uproszczone | Spłaszczone | Uproszczenie materiału |
| FBX | STL | Zachowane | Utracone | Spłaszczone | Tylko geometria |
| FBX | glTF/GLB | Zachowane | Przekonwertowano na PBR | Zachowane | Dobra 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
GltfSaveOptionszsetContentType(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.