Trong phần này tôi sẽ giới thiệu khái niệm scenegraph cho mô hình scene 3D. Một vài ví dụ minh họa sử dụng scenegraph để thiết kế ứng dụng. Lợi ích cũng như hạn chế khi sử dụng scenegraph Java 3D.
Ứng dụng 3D mô tả thể giới ảo ba chiều, bao gồm các đối tượng hình học. Trong Java 3D thế giới ảo này được gọi là VirtualUniverse, lớp cao nhất chứa các yếu tố có thể định nghĩa trong thế giới ảo này. Mặt khác, VirtualUniverse còn gồm các đối tượng phi hình học nhưng có thể điều khiển hoặc gây ảnh hưởng tới các đối tượng khác. Ví dụ Light là một dạng đối tượng phi hình học, tuy không thể nhìn thấy đối tượng này nhưng có thể thấy ảnh hưởng của Light trong miền ảnh hưởng của nó.
Java 3D sử dụng scenegraph để mô tả thế giới ảo bao gồm đối tượng, thuộc tính của từng đối tượng và mối quan hệ với các đối tượng khác trong thế giới, dữ liệu điểm nhìn (viewpoint), … Mô tả scenegraph cho phép người phát triển ứng dụng có thể áp dụng nguyên lý hướng đối tượng như là trừu tượng và sử dụng lại trong thiết kế của họ.
Scenegraph là một cây có cấu trúc thứ bậc trên xuống, không cho phép tạo thành một chu trình, bắt đầu là Virtual Universe (nút gốc của scenegraph), tiếp là các nhánh, trên nhánh là các nút, mỗi nút là một đối tượng. Scenegraph gồm các đối tượng có dẫn xuất từ lớp Node. Mỗi một thể hiện của lớp Node chỉ có một cha. Ngoài ra, scenegraph còn chứa các đối tượng có dẫn xuất từ lớp Group. Theo cấu trúc có thứ bậc lớp Group có thể có các nút con thuộc lớp Node hoặc lớp Group. Cấu trúc thứ bậc đó được minh họa ở hình dưới đây [3]:
Hình 4.1: Cấu trúc có thứ bậc trong scenegraph Group 1
Node 1.1 Node 1.2 Node 1.3 Group 2
Group 3 Node 2.1 Node 2.2
Node 3.1 Group 4
Có ba lớp đối tượng chính trong scenegraph:
- Nút quản lý như Locale, BranchGroup, TransformGroup, ViewPlatform, Switch, … có nguồn từ nút Group.
- Nút Geometry như Shape3D, Background, … có nguồn từ nút Leaf.
- Nút điều khiển như Behaviors, Morph, Light, Sound, Clip, … Xem xét chương trình HelloUniverse, hiển thị hình lập phương. Sau khi biên dịch và chạy, chương trình có kết quả hiển thị như hình dưới đây [11]:
Hình 4.2: Kết quả khi chạy chương trình HelloUniverse.java Scenegraph của HelloUniverse như sau:
Hình 4.3: Cấu trúc scenegraph của HelloUniverse.java Trong đó:
VirtualUniverse là nút cao nhất của scenegraph, mô tả không gian và tọa độ của hệ thống. Mỗi VirtualUniverse bao gồm một tập các đối tượng Locale. Locale xác định vùng địa lý trong VirtualUniverse và được định vị tại một điểm tọa độ 3D.
Dưới nút Locale có hai nhánh con: nhánh bên trái là content branch graph, mô tả khối hình học, ánh sáng, bố cục và nền. Content branch graph sẽ khác với các ứng dụng khác nhau.
Trong ví dụ HelloUniverse, Content branch graph là một shape3D được mô tả bằng ColorCube, quay một góc 45o được thực hiện qua nút Behaviour.
Nút Shape3D là một container bao gồm hình khối (Geometry) và diện mạo (Appearance). Lớp chính của geometry là GeometryArray, dùng để vẽ các điểm, đường và đa giác. Có rất nhiều lớp con của Appearance như color, texture, transparency.
Nhánh bên phải là View branch graph, chỉ vị trí, hướng nhìn, phối cảnh trong thế giới ảo từ thế giới vật lý (đằng trước monitor). Nút ViewPlatform chỉ vị trí nhìn trong thế giới ảo; trạng thái của nút View trả lại cái mà người nhìn có thể nhìn thấy trong ảnh của thế giới vật lý (ảnh 2D trên monitor). Nút Canvas3D là thành phần Java GUI cho phép đặt ảnh 2D trong ứng dụng Java và applet.
VirtualUniverse, Locale và View branch graph có chung một cấu trúc trong các ứng dụng.