Як завантажити 3D-моделі в Java

Як завантажити 3D-моделі в Java

Aspose.3D FOSS для Java забезпечує простий API для відкриття 3D-файлів без будь-яких корінних залежності. Scene об’єкт можна прогулятися по іерархії нід і читати дані з сирової геометрії для кожного меча на сцені.

Крок за кроком - Guide

Крок 1: Додайте Maven Залежність

Додайте асфоз.3Д FOSS залежності до вашого pom.xml.Додаткових корінних бібліотек не потрібно.

<dependency>
  <groupId>org.aspose</groupId>
  <artifactId>aspose-3d-foss</artifactId>
  <version>26.5.0</version>
</dependency>

Крок 2: Ввезення необхідних класів

І те Scene класу є контейнер верхнього рівня для всіх 3D даних. імпортувати його разом з Node, Mesh, і будь-які формат-специфічні класи опції завантаження, які вам потрібні.

import com.aspose.threed.Scene;
import com.aspose.threed.Node;
import com.aspose.threed.Mesh;
import com.aspose.threed.Entity;
import com.aspose.threed.ObjLoadOptions;
import com.aspose.threed.GltfLoadOptions;
import com.aspose.threed.StlLoadOptions;

Всі державні класи живуть під com.aspose.threed Пакетний пакет .


Крок 3: Завантажити файл

Використовуйте статичний Scene.fromFile() Метод відкриття будь-якого підтримуваного формату. Бібліотека автоматично виявляє формат з розширення файлу.

// Automatic format detection from the file extension
Scene scene = Scene.fromFile("model.obj");

Альтернативно, створювати Scene Причини та дзвінки open().Це корисно, коли ви хочете пропустити опції завантаження або вирішити помилки експлицитно:

Scene scene = new Scene();
scene.open("model.obj");

Обидва підходи підтримують OBJ, STL (бінарний і ASCII), glTF 2.0 / GLB, і FBX файли.


Крок 4: Перехід сценічних нод

Сцену, що навантажується, є дерево Node Об’єкти, що закріплені в scene.getRootNode().Використання getChildNodes() Ітертично і відвідайте всі вузли:

import com.aspose.threed.Scene;
import com.aspose.threed.Node;

public class SceneWalker {
    public static void main(String[] args) throws Exception {
        Scene scene = Scene.fromFile("model.obj");
        walkNode(scene.getRootNode(), 0);
    }

    static void walkNode(Node node, int depth) {
        String indent = "  ".repeat(depth);
        System.out.println(indent + "Node: " + node.getName());
        for (Node child : node.getChildNodes()) {
            walkNode(child, depth + 1);
        }
    }
}

Кожен з них Node Можна переносити нуль або більше. Entity об’єкти (міші, камери, світло). перевірка node.getEntities() для перевірки кожного суб’єкта, прикріпленого до ніду або використання node.getEntity() Відновлення первинної організації.


Крок 5: Доступ до Vertex і полігонів даних

Використовуйте суб’єкт ноду для Mesh І зателефонуйте getControlPoints() для вертольотів і getPolygons() Для списку індексу обличчя:

import com.aspose.threed.Scene;
import com.aspose.threed.Node;
import com.aspose.threed.Entity;
import com.aspose.threed.Mesh;

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

for (Node node : scene.getRootNode().getChildNodes()) {
    Entity entity = node.getEntity();
    if (entity instanceof Mesh) {
        Mesh mesh = (Mesh) entity;
        System.out.printf("Mesh '%s': %d vertices, %d polygons%n",
            node.getName(),
            mesh.getControlPoints().size(),
            mesh.getPolygonCount());

        // First vertex position (Vector4: x, y, z, w)
        if (!mesh.getControlPoints().isEmpty()) {
            var v = mesh.getControlPoints().get(0);
            System.out.printf("  First vertex: (%.4f, %.4f, %.4f)%n", v.x, v.y, v.z);
        }

        // First polygon: array of control-point indices
        if (!mesh.getPolygons().isEmpty()) {
            int[] poly = mesh.getPolygons().get(0);
            System.out.println("  First polygon indices: " + java.util.Arrays.toString(poly));
        }
    }
}

mesh.getControlPoints() Повернення А List<Vector4> де x, y, z Використовуйте позицію і w Координат є однородним (зазвичай 1.0).

mesh.getPolygons() Повернення А List<int[]> де кожна аррея є замовленим набором контрольно-точок індексу для однієї сторони.


Крок 6: Використовуйте формат-специфічні опції завантаження

Для тонкого контролю за тим, як файл тлумачується, перейдіть до прикладу опціонів навантаження. Scene.fromFile() або scene.open().

Файли ЗДР - ObjLoadOptions:

import com.aspose.threed.Scene;
import com.aspose.threed.ObjLoadOptions;

ObjLoadOptions options = new ObjLoadOptions();
options.setFlipCoordinateSystem(true);  // Convert right-hand Y-up to Z-up
options.setScale(0.01);                  // Convert centimetres to metres
options.setEnableMaterials(true);        // Load the .mtl material file alongside
options.setNormalizeNormal(true);        // Normalize all normals to unit length

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

Файли GLTF / GLB — GltfLoadOptions:

import com.aspose.threed.Scene;
import com.aspose.threed.GltfLoadOptions;

GltfLoadOptions options = new GltfLoadOptions();
options.setFlipCoordinateSystem(true);  // Flip the coordinate system if needed

Scene scene = Scene.fromFile("model.glb", options);

Файли СТЛ — StlLoadOptions:

import com.aspose.threed.Scene;
import com.aspose.threed.StlLoadOptions;

StlLoadOptions options = new StlLoadOptions();
options.setFlipCoordinateSystem(true);
options.setRecalculateNormal(true);  // Recompute normals from face geometry

Scene scene = Scene.fromFile("model.stl", options);

Підтримка імпортних форматів

ФорматрозширенняЗауважимо
OBJ.objWavefront OBJ; факультативний .mtl Звіт про матеріал; дозволено з ObjLoadOptions.setEnableMaterials(true)
STL.stlАСЦІ та двосторонні режими автоматично виявляються.
ГЛТФ.gltf, .glbglTF 2.0; двосторонні GLB і JSON варіанти підтримуються як
FBX.fbxПідтримка бінарних FBX

Загальні проблеми та рішення

IOException На борту — Перевірте, чи є шлях файлу правильним і чи існує файл. Використовуйте абсолютні шляхи під час розробки для усунення робочої та директорської недбалості.

NullPointerException Доступний суб’єкт Не кожен нод несе геометрию. завжди бережіть з node.getEntity() instanceof Mesh перед випробуванням або ітеризмом node.getEntities() Зберігати в ньому кілька прикріплених об’єктів.

Координаційна система не відповідає Якщо завантажений модель виглядає зволоженим або ротаційним, використовуйте setFlipCoordinateSystem(true) У відповідній категорії (ObjLoadOptions, GltfLoadOptions,або StlLoadOptions).

Сценарій завантажується, але getChildNodes() Порожній — Деякі файли зберігають геометрию під суб-сцені, а не корінь. scene.getSubScenes() І перевіряти коріння кожного під-сцені.


Часто задавані запитання (FAQ)

Які формати можна завантажити?

OBJ, STL (бінарний і ASCII), glTF 2.0 / GLB, і FBX. Формат виявлення автоматично заснований на розширення файлу при зателефонуванні Scene.fromFile().

Чи можна завантажувати з потоку?

Так і так. scene.open(InputStream) і Scene.fromStream(InputStream) Обидва брали участь у Java. InputStream.Також можна пройти через FileFormat параметр, коли потік не переносить розширення.

Чи є бібліотека безпечною?

Кожен з них Scene Принцип є незалежним і не поділяє мутальний стан з іншими прикладами.

Як я можу читати полігонні рахунки без ітерції кожної обличчя?

Зателефонуйте mesh.getPolygonCount() За прямим цілісним рахунком.


Дивись також

 Українська