Aspose.3D FOSS для Java поддерживает пять 3D форматов файлов: OBJ, STL, glTF, GLB, и FBX (только импорт).
Все примеры используют com.aspose.threed.* пакет:
import com.aspose.threed.*;
Зависимость Maven:
<dependency>
<groupId>com.aspose</groupId>
<artifactId>aspose-3d-foss</artifactId>
<version>26.1.0</version>
</dependency>
Ландшафт форматов
Прежде чем погрузиться в детали, вот краткий обзор четырёх поддерживаемых форматов и их типичных сценариев использования.
| Формат | Расширение | Импорт | Экспорт | Поддержка материалов | Иерархия сцены |
|---|---|---|---|---|---|
| OBJ | .obj | Да | Да | Базовый (файлы MTL) | Плоский |
| STL | .stl | Да | Да | Нет | Плоский |
| glTF 2.0 | .gltf | Да | Да | PBR | Полный |
| GLB | .glb | Да | Да | PBR | Полный |
| FBX | .fbx | Да | Нет | Богатый | Полный |
OBJ, STL, glTF и GLB поддерживают как импорт, так и экспорт. FBX поддерживается для только импорт. GLB (binary glTF) создаётся с помощью GltfSaveOptions с setContentType(FileContentType.BINARY).
OBJ: Wavefront Object
OBJ — один из самых широко поддерживаемых форматов 3D‑сеток. Он хранит геометрию в виде простого текста, с необязательным .mtl сопутствующим файлом для материалов.
Загрузка OBJ‑файлов
Самый простой способ — передать путь к файлу напрямую:
Scene scene = Scene.fromFile("model.obj");
Для большего контроля используйте ObjLoadOptions:
ObjLoadOptions opts = new ObjLoadOptions();
Scene scene = Scene.fromFile("model.obj", opts);
Когда файл OBJ ссылается на файл MTL (через mtllib директиву), библиотека попытается автоматически загрузить из него определения материалов. Файл MTL должен находиться в том же каталоге, что и файл OBJ, либо по пути, указанному в директиве.
Сохранение в OBJ
Scene scene = Scene.fromFile("input.fbx");
scene.save("output.obj");
Сценарии использования OBJ
- Обмен данными сетки между различными 3D‑инструментами.
- Импорт моделей из библиотек ассетов, распространяемых в формате OBJ.
- Быстрый осмотр геометрии без сложных иерархий сцены.
STL: стереолитография
STL — это стандартный формат для 3D‑печати. Он представляет собой необработанную триангулированную геометрию без материалов, цветов и иерархии сцены. Файлы STL бывают двух вариантов: ASCII (читаемый человеком) и бинарный (компактный).
Загрузка STL‑файлов
// Simple load
Scene scene = Scene.fromFile("part.stl");
// With explicit options
StlLoadOptions opts = new StlLoadOptions();
Scene scene = Scene.fromFile("part.stl", opts);
Сохранение в STL
Scene scene = Scene.fromFile("model.obj");
scene.save("output.stl");
Чтобы контролировать вывод, используйте StlSaveOptions:
StlSaveOptions opts = new StlSaveOptions();
scene.save("output.stl", opts);
Особенности STL
- Файлы STL содержат только триангулированную геометрию. Материалы, текстуры и иерархия сцены теряются при экспорте.
- Бинарный STL значительно меньше по размеру, чем ASCII STL, для больших моделей.
- STL является предпочтительным форматом, когда целью является 3D‑принтер или программное обеспечение для слайсинга.
glTF: GL Transmission Format
glTF — современный формат, разработанный для эффективной передачи и загрузки 3D‑контента, особенно в вебе и в реальном времени. Он поддерживает PBR‑материалы, иерархии сцен и анимацию.
Загрузка файлов glTF
Scene scene = Scene.fromFile("scene.gltf");
// With options
GltfLoadOptions opts = new GltfLoadOptions();
Scene scene = Scene.fromFile("scene.gltf", opts);
Сохранение как glTF
Базовое сохранение использует расширение файла для определения формата:
scene.save("output.gltf");
Для детального контроля используйте GltfSaveOptions:
GltfSaveOptions opts = new GltfSaveOptions();
opts.setFlipCoordinateSystem(true);
opts.setPrettyPrint(true);
scene.save("output.gltf", opts);
Подробности GltfSaveOptions
| Метод | Назначение |
|---|---|
setFlipCoordinateSystem(boolean) | Перевернуть ось системы координат при экспорте. Полезно при преобразовании из Y‑up в Z‑up или наоборот. |
setPrettyPrint(boolean) | Форматировать вывод JSON с отступами для читаемости. Установите false для уменьшения размера файла в продакшн. |
Сценарии использования glTF
- Веб‑ориентированные 3D‑просмотрщики (three.js, Babylon.js).
- Приложения в реальном времени и игровые движки.
- Сохранение определений PBR‑материалов между инструментами.
FBX: Filmbox (только импорт)
FBX — это проприетарный формат от Autodesk, который широко используется в разработке игр и создании цифрового контента. Он поддерживает сложные иерархии сцен, материалы и анимацию. Aspose.3D FOSS для Java поддерживает FBX для только импорт – экспорт в FBX недоступен.
Загрузка файлов FBX
Scene scene = Scene.fromFile("character.fbx");
// With options
FbxLoadOptions opts = new FbxLoadOptions();
Scene scene = Scene.fromFile("character.fbx", opts);
Преобразование FBX в другие форматы
Поскольку экспорт FBX не поддерживается, преобразуйте импортированные сцены FBX в glTF, GLB, OBJ или STL:
Scene scene = Scene.fromFile("character.fbx");
// Save as GLB
GltfSaveOptions opts = new GltfSaveOptions();
opts.setContentType(FileContentType.BINARY);
scene.save("character.glb", opts);
Сценарии использования FBX
- Импорт ассетов из инструментов Autodesk (Maya, 3ds Max) и их преобразование в другие форматы.
- Загрузка скелетных персонажей и анимированных сцен для повторного экспорта в glTF/GLB.
Пакетное преобразование
Обычный рабочий процесс — преобразование всей директории файлов из одного формата в другой. Ниже приведён шаблон для пакетного преобразования:
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");
}
}
}
Это загружает каждый .obj файл в каталоге, преобразует каждый в glTF с красиво отформатированным выводом и сохраняет результаты. Вы можете адаптировать этот шаблон для любой комбинации исходного и целевого формата.
Справочник по перекрестному преобразованию форматов
В следующей таблице показано, чего ожидать при преобразовании между форматами.
| От | К | Геометрия | Материалы | Иерархия | Заметки |
|---|---|---|---|---|---|
| OBJ | STL | Сохранено | Потеряно | N/A | STL не поддерживает материалы |
| OBJ | glTF/GLB | Сохранено | Преобразовано в PBR | Плоский | Материалы MTL сопоставлены, где возможно |
| STL | OBJ | Сохранено | Нет | N/A | Нет материалов в источнике |
| STL | glTF/GLB | Сохранено | По умолчанию | Плоский | Применён материал по умолчанию |
| glTF | OBJ | Сохранено | Упрощено | Уплощено | PBR в базовый материал |
| glTF | STL | Сохранено | Утеряно | Уплощено | Только геометрия |
| FBX | OBJ | Сохранено | Упрощено | Уплощено | Упрощение материалов |
| FBX | STL | Сохранено | Потеряно | Уплощено | Только геометрия |
| FBX | glTF/GLB | Сохранено | Преобразовано в PBR | Сохранено | Хорошая точность |
Общие рекомендации по преобразованию
- Геометрия всегда сохраняется во всех парах форматов.
- Материалы лучше всего сохраняются между glTF и FBX, которые оба поддерживают богатые модели материалов. При конвертации в STL материалы всегда теряются. При конвертации в OBJ материалы упрощаются до базовой модели MTL.
- Иерархия сцены сохраняется между glTF и FBX. OBJ и STL создают плоские структуры.
Сводим всё вместе
Вот полный пример, который загружает файл OBJ, исследует его узлы и экспортирует в glTF и 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.");
}
}
Итоги
Aspose.3D FOSS for Java предоставляет вам единый API для нескольких форматов. Ключевые моменты:
- OBJ – простой обмен сеткой с базовыми материалами.
- STL – формат, содержащий только геометрию, для конвейеров 3D‑печати.
- glTF / GLB – современный формат с поддержкой PBR для веба и реального времени. Используйте
GltfSaveOptionsсsetContentType(FileContentType.BINARY)для вывода в GLB. - FBX – только импорт; богатый формат для загрузки ассетов из игровых движков и DCC‑инструментов.
Используйте классы параметров загрузки и сохранения, специфичные для формата (ObjLoadOptions, StlLoadOptions, StlSaveOptions, GltfLoadOptions, GltfSaveOptions, FbxLoadOptions) когда требуется тонко настроенный контроль над процессом импорта или экспорта.
Для получения более подробной информации посетите Aspose.3D документацию или просмотрите исходный код на GitHub.