Как загрузить 3D-модели в Java

Как загрузить 3D-модели в Java

Aspose.3D FOSS для Java обеспечивает простой API для открытия 3D-файлов без каких-либо коренных зависимостей. Scene Объекты, которые вы можете прогуляться по иерархии узелков и читать данные сырой геометрии для каждой мешки на сцене.

Крок за шагом руководство

Шаг 1: Добавить зависимость от мавен

Добавьте асфоз.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: Доступ к вертексным и полигонным данным

Название: Энциклопедия на 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);

ГЛТФ / ГРБ файлы — 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.stlASCII и бинарные режимы автоматически обнаруживаются.
ГЛТФ.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() Для прямого целого счета.


Смотреть также

 Русский