ב פוסט ההקדמה, סקרנו מה Aspose.3D FOSS for 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 for Java. כל מודל תלת‑ממדי – בין אם נטען מקובץ או נבנה תכנותית – מיוצג כעץ של צמתים שמושרש ב 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().
צומת
A 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 ו‑Mesh
An 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());
}
}
מצלמה
מצלמות הן entities שמצורפות לצמתים:
Scene scene = new Scene();
Node cameraNode = scene.getRootNode().createChildNode("MainCamera");
// Camera entity can be assigned to the node
הגדרות המצלמה נשמרות בעת ייצוא לפורמטים התומכים בהן (כגון glTF).
הערה: ה Light class אינו זמין בגרסת 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 for Java מספק מודל חומר PBR (Physically Based Rendering) דרך PbrMaterial. זהו ה‑class המוחשי היחיד של חומר בגרסת 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 ב‑scene graph יש Transform שקובעת את ה‑position, ה‑rotation וה‑scale שלו ביחס להורה שלו.
טרנספורם מקומי
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 הוא ה‑world-space transform המחושב, שלוקח בחשבון את כל שרשרת ההורים. זה read-only ומתעדכן אוטומטית.
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.
כלי מתמטיקה
הספרייה כוללת סוגי מתמטיקה בסיסיים לפעולות תלת‑ממד.
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
Quaternion
ייצוג סיבוב שמונע נעילת גימבל ומבצע אינטרפולציה חלקה. קווטרניונים משמשים פנימית במערכת ההמרה.
BoundingBox
תיבת גבול מיושרת לציר לשאילתות מרחביות, בדיקות התנגשות וניתוח סצנה.
BoundingBox bbox = new BoundingBox();
// BoundingBox can be computed from mesh geometry
מגבלות ידועות
ראוי לציין ש Scene.render() הוא לא נתמך בגרסת ה‑FOSS. קריאה אליו תגרום ל‑ UnsupportedOperationException. הספרייה נועדה לעיבוד 3D מבוסס קבצים – טעינה, שינוי, ושמירה – ולא לרינדור בזמן אמת.
סיכום
התכונות המרכזיות של Aspose.3D FOSS עבור Java מחולקות לחמישה תחומים:
| אזור | מחלקות | מטרה |
|---|---|---|
| Scene Graph | 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 עם אפשרויות טעינה ושמירה מפורטות.