В въведителен пост, ние разгледахме какво е Aspose.3D FOSS за Java и как да започнете. Тази публикация навлиза по-дълбоко в ключовите функции, които съставляват библиотеката, с примерен код за всяка област.
Всички примери предполагат следния импорт:
import com.aspose.threed.*;
И Maven зависимостта:
<dependency>
<groupId>com.aspose</groupId>
<artifactId>aspose-3d-foss</artifactId>
<version>26.1.0</version>
</dependency>
API за сценичен граф
Сценичният граф е основата на Aspose.3D FOSS за Java. Всеки 3D модел – независимо дали е зареден от файл или създаден програмно – се представя като дърво от възли, коренящо се в Scene обект.
Scene
Класът Scene клас е входната точка за всички операции. Можете да създадете празна сцена или да заредите такава от файл:
// Empty scene
Scene scene = new Scene();
// Load from file
Scene loaded = Scene.fromFile("model.obj");
// Load with explicit options
Scene fromStl = Scene.fromFile("part.stl", new StlLoadOptions());
Коренът на дървото от възли се достъпва чрез getRootNode().
Node
Е Node представлява именувана позиция в дървото на сцената. Възлите могат да имат деца, създавайки йерархия. Всеки възел носи локален Transform и изчислен GlobalTransform.
Scene scene = new Scene();
// Create a child node under the root
Node box = scene.getRootNode().createChildNode("Box");
// Create a nested hierarchy
Node arm = scene.getRootNode().createChildNode("Arm");
Node hand = arm.createChildNode("Hand");
Node finger = hand.createChildNode("Finger");
Можете също да създавате възли независимо и да ги прикрепяте по-късно:
Node standalone = new Node("Standalone");
scene.getRootNode().getChildNodes().add(standalone);
Entity and Mesh
Един Entity е абстрактен базов клас за всичко, което може да бъде прикрепено към възел – геометрия, камери и светлини. Най-често срещаният тип обект е Mesh, който съдържа полигонална геометрия (върхове, лица и нормали).
Scene scene = Scene.fromFile("cube.obj");
// Traverse nodes and inspect entities
for (Node child : scene.getRootNode().getChildNodes()) {
Entity entity = child.getEntity();
if (entity instanceof Mesh) {
Mesh mesh = (Mesh) entity;
System.out.println("Node: " + child.getName());
System.out.println(" Vertices: " + mesh.getControlPoints().size());
}
}
Камера
Камерите са обекти, които се прикрепват към възли:
Scene scene = new Scene();
Node cameraNode = scene.getRootNode().createChildNode("MainCamera");
// Camera entity can be assigned to the node
Дефинициите на камерите се запазват при експортиране към формати, които ги поддържат (например glTF).
Бележка: Това Light класът не е наличен в изданието Java. Данните за осветление на сцената от импортирани файлове се съхраняват като общи Entity обекти.
Зареждане и запазване, независими от формата
Една от силните страни на библиотеката е, че графът на сцената е независим от формата. Зареждате от който и да е поддържан формат, манипулирате сцената чрез единен API и я запазвате в който и да е поддържан формат.
// Load OBJ, save as glTF
Scene scene = Scene.fromFile("input.obj");
scene.save("output.gltf");
// Load FBX, save as STL (FBX is import only)
Scene scene2 = Scene.fromFile("character.fbx");
scene2.save("character.stl");
// Load STL, save as GLB
Scene scene3 = Scene.fromFile("part.stl", new StlLoadOptions());
GltfSaveOptions opts = new GltfSaveOptions();
opts.setContentType(FileContentType.BINARY);
scene3.save("part.glb", opts);
Форматът се определя от разширението на файла. Можете също да предадете явни опции за запазване, за да контролирате изхода:
GltfSaveOptions opts = new GltfSaveOptions();
opts.setFlipCoordinateSystem(true);
opts.setPrettyPrint(true);
scene.save("output.gltf", opts);
Материали
Aspose.3D FOSS за Java предоставя PBR (Physically Based Rendering) материален модел чрез PbrMaterial. Това е единственият конкретен материален клас в изданието Java.
PbrMaterial
Материал за физически базирано рендериране, който използва параметрите албедо, металност и грубост. Това е стандартният материален модел за glTF и съвременните реално‑времеви енджини.
PbrMaterial pbr = new PbrMaterial();
pbr.setAlbedo(new Vector4(0.8, 0.2, 0.2, 1.0)); // Red-ish base color
pbr.setMetallicFactor(0.0); // Non-metallic
pbr.setRoughnessFactor(0.5); // Medium roughness
Запазването на материалите между различни формати зависи от възможностите на целевия формат. PBR материалите се съпоставят естествено с изхода glTF и GLB.
Трансформация и Пространство
Всеки Node в графа на сцената има Transform което определя неговото положение, ротация и мащаб спрямо родителя си.
Локална трансформация
Scene scene = new Scene();
Node node = scene.getRootNode().createChildNode("TestNode");
Transform t = node.getTransform();
t.setTranslation(1, 2, 3); // Position
t.setScale(2, 2, 2); // Uniform scale
t.setEulerAngles(0, 45, 0); // Euler rotation in degrees
Глобална трансформация
Това GlobalTransform е изчислената трансформация в световното пространство, като се взема предвид целият родителски низ. Тя е само за четене и се актуализира автоматично.
Node parent = scene.getRootNode().createChildNode("Parent");
parent.getTransform().setTranslation(10, 0, 0);
Node child = parent.createChildNode("Child");
child.getTransform().setTranslation(5, 0, 0);
// Child's global position is (15, 0, 0)
GlobalTransform global = child.getGlobalTransform();
Това наследяване на трансформации между родител и дете следва стандартния модел на сценичен граф, използван от 3D двигатели и DCC инструменти.
Математически помощни функции
Библиотеката включва основни математически типове за 3D операции.
Vector3
Триизмерен вектор, използван за позиции, посоки, нормали и цветове.
Vector3 a = new Vector3(1, 0, 0);
Vector3 b = new Vector3(0, 1, 0);
// Addition
Vector3 sum = Vector3.add(a, b); // (1, 1, 0)
Matrix4
4x4 матрица за трансформация, която комбинира транслация, ротация и мащабиране в една единствена операция.
Matrix4 mat = new Matrix4();
// Matrix4 is used internally by transforms
// and can be retrieved from GlobalTransform
Кватернион
Представяне на ротация, което избягва gimbal lock и осигурява гладка интерполация. Кватернионите се използват вътрешно от системата за трансформации.
BoundingBox
Осиално подравнена bounding box за пространствени заявки, проверки за колизии и анализ на сцената.
BoundingBox bbox = new BoundingBox();
// BoundingBox can be computed from mesh geometry
Известни ограничения
Струва си да се отбележи, че Scene.render() е не се поддържа в FOSS изданието. Извикването му ще предизвика UnsupportedOperationException. Библиотеката е проектирана за файлово‑базирана 3D обработка — зареждане, трансформиране и запазване — вместо за рендериране в реално време.
Резюме
Ключовите характеристики на Aspose.3D FOSS за Java се разделят на пет области:
| Област | Класове | Цел |
|---|---|---|
| Граф на сцената | Scene, Node, Entity, Mesh, Camera | Йерархично представяне на модела |
| Формати | Опции за зареждане/запис за OBJ, STL, glTF/GLB; зареждане за FBX | Вход/изход, независим от формата |
| Материали | PbrMaterial | Външен вид на повърхността (PBR) |
| Трансформации | Transform, GlobalTransform | Пространствено позициониране |
| Математика | Vector3, Matrix4, Quaternion, BoundingBox | 3D math primitives |
В следващата публикация ще преминем през практични уроци за всеки формат, обхващащи OBJ, STL, glTF и FBX, с подробни опции за зареждане и запазване.