Мы рады объявить о доступности Aspose.3D FOSS for Java – бесплатная, открытая библиотека для работы с 3D форматами файлов в Java приложениях. Создана как чистое решение Java без нативных зависимостей, библиотека работает на Java 21 и новее, что делает её доступной для широкого спектра проектов и сред.

В этом посте рассматриваются возможности библиотеки, как начать работу и куда двигаться дальше.

Что такое Aspose.3D FOSS для Java?

Aspose.3D FOSS for Java — это легковесная библиотека обработки 3D файлов, опубликованная под MIT license. Она предоставляет API графа сцены, позволяющее загружать, исследовать, преобразовывать и сохранять 3D модели в нескольких широко используемых форматах. Библиотека полностью написана на Java и не требует внешних нативных бинарных файлов или платформо-специфических конфигураций.

Исходный код доступен на GitHub: https://github.com/aspose-3d-foss/Aspose.3D-FOSS-for-Java

Ключевые особенности

  • Чистый Java – без JNI, без нативных библиотек, без ограничений платформы.
  • Java 21+ совместим.
  • MIT licensed – используйте его в личных, коммерческих или проприетарных проектах без ограничений.
  • Архитектура графа сцены – знакомая иерархия узлов, мешей, камер и материалов.
  • Поддержка нескольких форматов – чтение и запись файлов OBJ, STL, glTF 2.0 и GLB; чтение файлов FBX.

Быстрый старт

Установка Maven

Добавьте следующую зависимость в ваш pom.xml:

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

Ваше первое преобразование

Самый простой пример использования — загрузка 3D‑файла в одном формате и сохранение его в другом. Ниже приведено двухстрочное преобразование из OBJ в STL:

import com.aspose.threed.*;

public class QuickConvert {
    public static void main(String[] args) throws Exception {
        Scene scene = Scene.fromFile("cube.obj");
        scene.save("output.stl");
    }
}

Эта Scene класс является центральной точкой входа. Вызовите Scene.fromFile() с путем к файлу для загрузки модели, затем вызовите save() с целевым путем. Библиотека определяет формат по расширению файла.

Создание сцены с нуля

Вы также можете программно создавать сцены:

import com.aspose.threed.*;

public class BuildScene {
    public static void main(String[] args) throws Exception {
        Scene scene = new Scene();
        Node node = scene.getRootNode().createChildNode("Box");

        Transform t = node.getTransform();
        t.setTranslation(1, 2, 3);

        scene.save("scene.gltf");
    }
}

Это создаёт новую сцену, добавляет дочерний узел с именем «Box» под корневым, размещает его в координатах (1, 2, 3) и экспортирует результат в файл glTF.

Загрузка с параметрами, специфичными для формата

Когда требуется более тонкий контроль над процессом загрузки, каждый формат предоставляет отдельный класс параметров. Например, загрузка STL‑файла с явными параметрами:

import com.aspose.threed.*;

public class LoadWithOptions {
    public static void main(String[] args) throws Exception {
        StlLoadOptions opts = new StlLoadOptions();
        Scene scene = Scene.fromFile("part.stl", opts);

        // Inspect the loaded scene
        System.out.println("Root children: "
            + scene.getRootNode().getChildNodes().size());

        // Re-export as OBJ
        scene.save("part.obj");
    }
}

Эта Scene.fromFile() статический метод принимает любой из типов параметров загрузки: ObjLoadOptions, StlLoadOptions, GltfLoadOptions, или FbxLoadOptions.

Обход графа сцены

После загрузки сцены вы можете пройтись по дереву узлов, чтобы просмотреть или изменить его содержимое:

import com.aspose.threed.*;

public class TraverseScene {
    public static void main(String[] args) throws Exception {
        Scene scene = Scene.fromFile("model.gltf");

        for (Node child : scene.getRootNode().getChildNodes()) {
            System.out.println("Node: " + child.getName());

            Transform t = child.getTransform();
            System.out.println("  Translation: " + t.getTranslation());

            Entity entity = child.getEntity();
            if (entity instanceof Mesh) {
                Mesh mesh = (Mesh) entity;
                System.out.println("  Vertices: "
                    + mesh.getControlPoints().size());
            }
        }
    }
}

Этот шаблон полезен для отладки, создания отчетов о содержимом модели или выборочного изменения частей сцены перед повторным экспортом.

Применение трансформаций

Размещение узлов в 3D‑пространстве осуществляется через Transform объект на каждом Node:

import com.aspose.threed.*;

public class TransformExample {
    public static void main(String[] args) throws Exception {
        Scene scene = new Scene();

        Node parent = scene.getRootNode().createChildNode("Parent");
        parent.getTransform().setTranslation(10, 0, 0);

        Node child = parent.createChildNode("Child");
        child.getTransform().setTranslation(5, 0, 0);
        child.getTransform().setScale(2, 2, 2);

        // Child's world position is (15, 0, 0) due to
        // parent-child transform inheritance

        scene.save("transformed.gltf");
    }
}

Трансформации следуют стандартной модели наследования «родитель‑дитя»: позиция дочернего объекта в мировом пространстве является комбинацией его локальной трансформации и всех трансформаций предков вплоть до корня.

Что включено

Библиотека поставляется с узким набором возможностей, разработанных вокруг модели 3D графа сцены.

Граф сцены

Граф сцены является основой API. Каждый 3D‑файл представляется в виде древовидной структуры:

КлассРоль
SceneКонтейнер верхнего уровня; корень графа сцены
NodeИменованная позиция в дереве; содержит transforms и дочерние узлы
EntityАбстрактная база для визуальных объектов, привязанных к узлам
MeshПолигональная геометрия — вершины, грани, нормали
CameraОпределение виртуальной камеры
TransformЛокальное перемещение, вращение и масштаб узла
GlobalTransformВычисленное преобразование в мировом пространстве

Материалы

Библиотека предоставляет материалную модель PBR (Physically Based Rendering):

  • PbrMaterial – материал physically based rendering с albedo, metalness, roughness, emissive color и transparency. Это единственный конкретный класс материала, доступный в издании Java.

Математические утилиты

The com.aspose.threed пакет включает основные математические примитивы:

  • Vector3 – 3‑компонентный вектор для позиций, направлений и цветов.
  • Matrix4 – 4x4 матрица преобразования.
  • Quaternion – представление вращения.
  • BoundingBox – ограничивающий параллелепипед, выровненный по осям, для пространственных запросов.
Vector3 a = new Vector3(1, 0, 0);
Vector3 b = new Vector3(0, 1, 0);
Vector3 c = Vector3.add(a, b); // (1, 1, 0)

Параметры загрузки и сохранения

Каждый формат имеет отдельные классы параметров, позволяющие управлять поведением импорта и экспорта:

ФорматЗагрузить параметрыСохранить параметры
OBJObjLoadOptionsObjSaveOptions
STLStlLoadOptionsStlSaveOptions
glTF / GLBGltfLoadOptionsGltfSaveOptions
FBXFbxLoadOptions– (только импорт)

Например, чтобы экспортировать glTF с красиво отформатированным JSON и инвертированной системой координат:

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

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

Поддерживаемые форматы

В следующей таблице суммированы форматы, которые Aspose.3D FOSS for Java может читать и записывать.

ФорматРасширениеИмпортЭкспортЗаметки
OBJ.objДаДаС материалами MTL
STL.stlДаДаBinary + ASCII
glTF 2.0.gltfДаДаформат JSON
GLB.glbДаДаBinary glTF через GltfSaveOptions
FBX.fbxДаНетТолько импорт

OBJ, STL, glTF и GLB поддерживают как загрузку, так и сохранение. FBX поддерживается только для импорта.

Руководство по выбору формата

Выбор правильного формата зависит от вашего сценария использования:

  • OBJ идеален, когда вам нужна максимальная совместимость между 3D‑инструментами. Практически любое приложение для моделирования может читать и записывать OBJ. Он хорошо подходит для обмена сеточными данными, но передаёт только базовую информацию о материалах через сопутствующие файлы MTL.
  • STL STL — формат выбора для рабочих процессов 3D‑печати. Он хранит необработанную триангулированную геометрию без материалов и иерархии сцены, что именно ожидает программное обеспечение слайсера. Если ваш конвейер заканчивается 3D‑принтером, STL — очевидный выбор.
  • glTF является современным стандартом для веб‑ и реального времени 3D. Он поддерживает PBR‑материалы, полные иерархии сцены и разработан для эффективной передачи. Используйте glTF при создании веб‑просмотрщиков, работе с three.js или Babylon.js, либо при нацеливании на любой конвейер рендеринга в реальном времени.
  • FBX FBX глубоко интегрирован в рабочие процессы разработки игр и создания цифрового контента. Он поддерживает богатые данные сцены, включая иерархии и материалы. Aspose.3D FOSS for Java supports FBX Только импорт – используйте его для загрузки FBX‑активов и конвертации их в другие форматы.

Известные ограничения

Важно отметить, что Scene.render() является не поддерживается в версии FOSS. Вызов этого метода приведёт к выбросу UnsupportedOperationException. Библиотека предназначена для файловой 3D‑обработки — загрузки, манипулирования, трансформации и сохранения моделей — а не для рендеринга в реальном времени на дисплей.

Открытый исходный код и лицензирование

Aspose.3D FOSS for Java выпущен под MIT License. Это означает, что вы свободны:

  • Использовать библиотеку в коммерческих и проприетарных приложениях.
  • Изменять исходный код в соответствии с вашими потребностями.
  • Распространяйте библиотеку как часть вашего собственного программного обеспечения.

Нет роялти, нет ограничений по использованию и нет требований к указанию авторства, кроме тех, что указаны в лицензии MIT.

Полный исходный код размещён на GitHub, и мы приветствуем вклады: https://github.com/aspose-3d-foss/Aspose.3D-FOSS-for-Java

Системные требования

ТребованияПодробности
Java версия21 or later
ЗависимостиНет (чистый Java)
ПлатформыЛюбая платформа, на которой работает JVM
Инструмент сборкиMaven (рекомендовано)

Начало работы

Вот ресурсы, которые помогут вам быстро приступить к работе:

  • Документация – всесторонние руководства и пошаговые обзоры API доступны на документационный сайт Aspose.3D.
  • База знаний – практические статьи‑руководства и советы по устранению неполадок в Aspose.3D KB.
  • Справочник API – подробный справочник классов и методов по адресу Aspose.3D Справочник API.
  • Исходный код – просматривать и вносить вклад в GitHub.
  • Maven Central – пакет опубликован как com.aspose:aspose-3d-foss на Maven Central.

Распространённые сценарии использования

Ниже приведены практические сценарии, где Aspose.3D FOSS для Java хорошо подходит:

Конвейеры конвертации форматов

Многие команды получают 3D‑активы в одном формате, но им нужны в другом. Дизайнерская команда может работать с FBX, тогда как веб‑команда нуждается в glTF. Библиотека позволяет создавать автоматизированные конвейеры конвертации:

// Convert all incoming FBX assets to GLB for the web team
Scene scene = Scene.fromFile("asset.fbx");

GltfSaveOptions opts = new GltfSaveOptions();
opts.setContentType(FileContentType.BINARY);

scene.save("asset.glb", opts);

3D Model Inspection and Validation

Прежде чем интегрировать 3D‑актив в своё приложение, вы можете захотеть проверить его содержимое — подсчитать количество узлов, проверить геометрию или убедиться, что ожидаемые элементы присутствуют:

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

int nodeCount = scene.getRootNode().getChildNodes().size();
System.out.println("Top-level nodes: " + nodeCount);

for (Node child : scene.getRootNode().getChildNodes()) {
    if (child.getEntity() instanceof Mesh) {
        Mesh mesh = (Mesh) child.getEntity();
        System.out.println(child.getName() + ": "
            + mesh.getControlPoints().size() + " vertices");
    }
}

Сборка сцены

Вы можете загрузить несколько моделей и объединить их в одну сцену:

Scene scene = new Scene();

Scene part1 = Scene.fromFile("chassis.obj");
Scene part2 = Scene.fromFile("wheels.obj");

// Add nodes from each part into the combined scene
for (Node child : part1.getRootNode().getChildNodes()) {
    scene.getRootNode().getChildNodes().add(child);
}
for (Node child : part2.getRootNode().getChildNodes()) {
    scene.getRootNode().getChildNodes().add(child);
}

scene.save("assembled.gltf");

Что дальше

В предстоящих постах мы рассмотрим:

  • Подробный разбор ключевых возможностей API графа сцены, материалов и математических утилит.
  • Практическое руководство по работе с каждым поддерживаемым 3D‑форматом — OBJ, STL, glTF и FBX — включая варианты загрузки/сохранения и шаблоны пакетного преобразования.

Следите за обновлениями, а также смело исследуйте библиотеку и делитесь своими отзывами на GitHub.