Tổ chức dữ liệ u

Một phần của tài liệu nghiên cứu và xây dựng thử nghiệm 3G Engine (Trang 99 - 100)

Vấn đề đầu tiên là ta phải tổ chức dữ liệu cho khung xương làm sao để ta có thể tách rời các phần của cơ thể ví dụ như phần thân, phần đầu ra thành các phần độc lập nhau? Việc phân tách giúp ta có thể điều khiển từng thành phần riêng biệt và đặc biệt ta có thể thay đổi hình dạng cho nhân vật. Chúng ta có thể gắn các đầu khác nhau vào trong cùng một thân hình để tạo ra các nhân vật khác nhau. Và làm sao ta có thể gắn thêm các phần khác vào trong cấu trúc khung xương? Ví dụ như khi nhân vật cầm một khẩu súng thì làm sao ta có thể gắn khẩu súng này vào tay nhân vật và chuyển động của khẩu súng khớp với chuyển động của tay.

Để giải quyết được vấn đề này ta sẽ cho các nút trong cấu trúc cây của khung xương kế thừa từ một cấu trúc dữ liệu đặc biệt chỉ chứa các dữ liệu biến đổi. Việc tổ chức dữ liệu này tương tự như khái niệm Scene Graph được dùng rất nhiều trong việc quản lý Game. Một nút biến đổi (transform node) sẽ lưu các thông tin sau:

Tên.

Nút cha của nó.

Vị trí và góc quay ban đầu.

Vị trí và góc quay trong mối quan hệ với nút cha.

Vị trí, góc quay và ma trận biến đổi so với thể giới (vị trí và góc quay thật sự trongcảnh 3D).

Việc biến đổi của các khớp xương chính là sự biến đổi của các nút biến đổi. Bây giờ ta có thể tạo ra các cấu trúc khung xương riêng cho phần thân, phần đầu. Sau đó ta sẽ gắn đầu vào thân bằng cách ta thực hiện viện gán nút đều tiên của đầu là nút con của đốt xương cổ của phần thân.

Tương tự như vậy, nếu ta muốn cho nhân vật cầm một cây súng thì ta cũng tạo ra một cầu trúc khung xương cho cây súng. Sau đó ta thực thực việc thiết lập nút cha của cây súng là một khớp xương ở tay, bây giờ biến đổi của cây súng sẽ phụ thuộc vào biến đổi của khớp xương tay.

Rõ ràng việc tổ chức dữ liệu như vậy giúp ta giải quyết được nhiều vấn đề và giúp ta quản lý các đối tượng dễ dàng và thống nhất. Một cách tổng quát, ta có thể tạo một cây kế thừa kết nối tất cả các đối tượng có cấu trúc khung xương. Việc tìm kiếm, cập nhật và hiển thị sẽđều thực hiện trên cây chung này. Đây cũng chính là ý tưởng và cách thức thực hiện của một Scene Graph.

Vấn đề tiếp theo là làm sao ta có thể thực hiện việc cập nhật và truy xuất các khớp trong khung xương nhanh chóng và phù hợp với việc tổ chứa dữ liệu trên tập tin md5?

Dựa vào đặc điểm tập tin md5 lưu các khớp trong một khung xương theo một trình tự tăng dần của các khớp xương ta có thể có cách tổ chức dữ liệu tương ứng. Nếu ta tổ chức các khớp trong khung xương là các cấu trúc trong đó có các con trỏ chỉ đển các nút con thì đây là cách tổ chức sát với khái niệm của cấu trúc xương. Tuy nhiên việc tổ chức như vậy thì cứ mỗi lần cập nhật hoặc tìm kiếm một khớp xương theo tên hoặc theo chỉ số định danh ta cần phải duyệt cây theo đệ quy. Do thao tác tìm kiếm và duyệt như vậy dùng với tần suất rất lớn sẽ làm cho chi phí tăng nhanh. Để khắc phục vấn đề này, ta đơn giản sẽ tổ chức các khớp của khung xương thành một mảng. Khi đó việc tìm kiếm một khớp xương theo chỉ số ta sẽ thực hiện truy xuất thẳng đến phần tử có thỉ số tương ứng trong mảng. Như vậy, với một cải tiến nhỏ ta đã giảm đi được rất nhiều chi phí trong việc tìm kiếm.

Một phần của tài liệu nghiên cứu và xây dựng thử nghiệm 3G Engine (Trang 99 - 100)