ใน โพสต์แนะนำ, เราได้อธิบายว่า 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. โมเดล 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
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
หนึ่ง 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());
}
}
Camera
Camera เป็น Entity ที่แนบกับโหนด:
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
วัสดุการเรนเดอร์แบบอิงฟิสิกส์ที่ใช้พารามิเตอร์ albedo, metalness, และ roughness นี่เป็นโมเดลวัสดุมาตรฐานสำหรับ 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 ที่กำหนดตำแหน่ง การหมุน และสเกลของมันสัมพันธ์กับพาเรนท์ของมัน.
การแปลงท้องถิ่น
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.
ยูทิลิตี้คณิตศาสตร์
ไลบรารีนี้รวมประเภทคณิตศาสตร์หลักสำหรับการดำเนินการ 3 มิติ.
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 | I/O ที่ไม่ขึ้นกับรูปแบบ |
| วัสดุ | PbrMaterial | ลักษณะพื้นผิว (PBR) |
| การแปลง | Transform, GlobalTransform | การกำหนดตำแหน่งเชิงพื้นที่ |
| คณิตศาสตร์ | Vector3, Matrix4, Quaternion, BoundingBox | 3D math primitives |
ในโพสต์ถัดไป เราจะเดินผ่านบทแนะนำเชิงปฏิบัติแบบตามรูปแบบที่ครอบคลุม OBJ, STL, glTF, และ FBX พร้อมตัวเลือกการโหลดและบันทึกรายละเอียด.