Xây dựng game engine đa nền tảng quản lý tài nguyên và chuyển động của các đối tượng

Ngày nay, ngành công nghiệp Game đang trên đà phát triển nhanh chóng song song với việc phát triển phần cứng. Game engine sẽ là một công cụ hữu ích cho việc phát triển Game, nếu như các nhà phát triển mỗi khi bắt tay vào làm một Game nào đó từ đầu thì sẽ rất vất vả và mất nhiều công sức. Với một Game engine thì công việc đó trở nên đơn giản và nhanh hơn nhiều, nó sẽ cung cấp các API cho người phát triển Game có thể sử dụng và tạo ra những hiệu ứng một cách nhanh chóng.

Khóa luận sẽ trình bày tổng quan kiến trúc về Game engine mà chúng tôi đang xây dựng và đi chi tiết vào hai thành phần là quản lí tài nguyên trong Game và các chuyển động của đối tượng.

Phần đầu sẽ giới thiệu một cách tổng quan nhất về hệ thống, các thành phần sẽ có trong Game engine, và thiết kế cho các thành phần đó.

Phần thứ hai khóa luận dành để giới thiệu về các tài nguyên sẽ có trong Game engine, tầm quan trọng của việc quản lí tài nguyên cho một hệ thống. Đặc biệt khóa luận sẽ trình bày cách tổ chức và quản lí tài nguyên một cách hiệu quả nhất.

Phần thứ ba của khóa luận sẽ giới thiệu về các chuyển động của các đối tượng trong Game, các kỹ thuật để có thể tạo ra được các loại chuyển động cho đối tượng và cách triển khai các kỹ thuật vào trong Game engine.

 

doc52 trang | Chia sẻ: luyenbuizn | Lượt xem: 1109 | Lượt tải: 0download
Bạn đang xem trước 20 trang nội dung tài liệu Xây dựng game engine đa nền tảng quản lý tài nguyên và chuyển động của các đối tượng, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
ĐẠI HỌC QUỐC GIA HÀ NỘI TRƯỜNG ĐẠI HỌC CÔNG NGHỆ Hoàng Tuấn Hưng XÂY DỰNG GAME ENGINE ĐA NỀN TẢNG QUẢN LÝ TÀI NGUYÊN VÀ CHUYỂN ĐỘNG CỦA CÁC ĐỐI TƯỢNG KHOÁ LUẬN TỐT NGHIỆP ĐẠI HỌC HỆ CHÍNH QUY Ngành: Công nghệ thông tin HÀ NỘI - 2009 ĐẠI HỌC QUỐC GIA HÀ NỘI TRƯỜNG ĐẠI HỌC CÔNG NGHỆ Hoàng Tuấn Hưng XÂY DỰNG GAME ENGINE ĐA NỀN TẢNG QUẢN LÝ TÀI NGUYÊN VÀ CHUYỂN ĐỘNG CỦA CÁC ĐỐI TƯỢNG KHOÁ LUẬN TỐT NGHIỆP ĐẠI HỌC HỆ CHÍNH QUY Ngành: Công nghệ thông tin Cán bộ hướng dẫn: TS. Nguyễn Việt Hà Cán bộ đồng hướng dẫn: ThS. Vũ Quang Dũng HÀ NỘI - 2009 Lời cảm ơn Tôi xin gửi lời cảm ơn tới các thầy cô trong khoa Công nghệ Thông tin trường Đại học Công Nghệ, Đại học Quốc Gia Hà Nội, đặc biệt là các thầy cô ở Bộ môn Công nghệ Phần mềm đã giúp đỡ tôi trưởng thành trong những năm học tập và rèn luyện ở môi trường đại học. Xin chân thành cảm ơn thầy Nguyễn Việt Hà, thầy Vũ Quang Dũng và phòng thí nghiệm TOSHIBA-COLTECH đã tạo điều kiện cho tôi tìm hiểu, nghiên cứu và học hỏi những kinh nghiệm trong quá trình nghiên cứu và làm khoá luận. Tôi xin gửi lời cảm ơn tới các bạn trong lớp K50CD, K50CNPM đã ủng hộ, khuyến khích tôi trong suốt quá trình học tập tại trường. Và lời cuối cùng, tôi xin bày tỏ lòng chân thành và biết ơn vô hạn tới cha mẹ, và người thân, những người luôn ở bên cạnh tôi những lúc tôi khó khăn nhất, giúp tôi vượt qua khó khăn trong học tập cũng như trong cuộc sống. Hà Nội, ngày 10 tháng 05 năm 2009 Sinh viên Hoàng Tuấn Hưng TÓM TẮT Ngày nay, ngành công nghiệp Game đang trên đà phát triển nhanh chóng song song với việc phát triển phần cứng. Game engine sẽ là một công cụ hữu ích cho việc phát triển Game, nếu như các nhà phát triển mỗi khi bắt tay vào làm một Game nào đó từ đầu thì sẽ rất vất vả và mất nhiều công sức. Với một Game engine thì công việc đó trở nên đơn giản và nhanh hơn nhiều, nó sẽ cung cấp các API cho người phát triển Game có thể sử dụng và tạo ra những hiệu ứng một cách nhanh chóng. Khóa luận sẽ trình bày tổng quan kiến trúc về Game engine mà chúng tôi đang xây dựng và đi chi tiết vào hai thành phần là quản lí tài nguyên trong Game và các chuyển động của đối tượng. Phần đầu sẽ giới thiệu một cách tổng quan nhất về hệ thống, các thành phần sẽ có trong Game engine, và thiết kế cho các thành phần đó. Phần thứ hai khóa luận dành để giới thiệu về các tài nguyên sẽ có trong Game engine, tầm quan trọng của việc quản lí tài nguyên cho một hệ thống. Đặc biệt khóa luận sẽ trình bày cách tổ chức và quản lí tài nguyên một cách hiệu quả nhất. Phần thứ ba của khóa luận sẽ giới thiệu về các chuyển động của các đối tượng trong Game, các kỹ thuật để có thể tạo ra được các loại chuyển động cho đối tượng và cách triển khai các kỹ thuật vào trong Game engine. Phần cuối cùng sẽ là tổng kết những kết quả đã đạt được của khóa luận, những vấn đề còn tồn tại và hướng phát triển tiếp theo của đề tài. MỤC LỤC BẢNG CÁC CHỮ VIẾT TẮT API Application Programming Interface CPU Central Processing Unit GPU graphics processing unit LBS Linear Blend Skinning MWE Multi-Weight Enveloping SBS Spherical Blend Skinning SSD Skeletal Subspace Deformation DANH MỤC CÁC HÌNH VẼ BẢNG BIỂU Hình 1. Kiến trúc phân tầng của GEM 4 Hình 2. Kiến trúc tổng thể 6 Hình 3. Biểu đồ lớp của thành phần các kiểu dữ liệu cơ bản 7 Hình 4. Quá trình điều phối event 9 Hình 5. Kiến trúc phân tầng của Render Engine 10 Hình 6. Biểu đồ gói của Render Engine 10 Hình 7. Mô hình quan hệ với các thành phần khác 12 Hình 8.Ví dụ Mesh Bank 13 Hình 9. Mô hình liên kết với các thành phần khác 14 Hình 10. Các thành phần trong Resource manager 15 Hình 11. Biểu đồ lớp Mesh và MeshBank 16 Hình 12. Biểu đồ lớp Texture và TextureBank 17 Hình 13. Biểu đồ lớp Effect và EffectBank 19 Hình 14. Biểu đồ lớp AnimatedMesh và AnimatedMeshBank 20 Hình 15. Biểu đồ lớp Material 21 Hình 16. Ví dụ key-frame 24 Hình 17. Nội suy bậc 1 và bậc 2 25 Hình 18. Mô hình tổ chức các loại animation 26 Hình 19. Biểu đồ lớp KeyFrame 27 Hình 20.Ví dụ Skinning 28 Hình 21. Thành phần trong một nhân vật 29 Hình 22. Hạn chế kỹ thuật SSD 30 Hình 23. Sử dụng kỹ thuật SSD 31 Hình 24. Sử dụng kỹ thuật SBS 31 Hình 25. Sơ đồ chuyển trục tọa độ 32 Hình 26. Mô hình tổ chức khung xương 34 Hình 27. Demo key-frame 37 Hình 28. Demo Skinning 38 MỞ ĐẦU Trong thời đại công nghệ thông tin như hiện nay, sản phẩm công nghệ ngày càng chịu sự đánh giá khắt khe hơn từ phía những người dùng, đặc biệt là về sản phẩm Game được nhận rất nhiều sự đánh giá từ phía các game thủ, hay chỉ là những người chơi bình thường. Ngành công nghiệp game hiện nay có thể nói là bùng nổ, với tốc độ phát triển đến chóng mặt, rất nhiều những game hay và hấp dẫn đã được ra đời trong thời gian qua. Đằng sau những Game phát triển và nổi tiếng như vậy đều có một Game Engine. Game engine là một công cụ hỗ trợ, một middleware giúp người phát triển viết game một cách nhanh chóng, đơn giản hơn đồng thời cung cấp khả năng tái sử dụng mã nguồn cao do có thể phát triển nhiều game từ một game engine. Tại Việt Nam, ngành công nghiệp Game mới chỉ đang phát triển đa số vẫn là phát hành Game là chủ yếu, còn việc xây dựng một Game Engine vẫn gần như chưa có. Đây là một lĩnh vực tiềm năng, hứa hẹn sẽ phát triển nhanh ở Việt Nam trong thời gian sắp tới. Từ những xu hướng phát triển trên, khóa luận tập trung nghiên cứu xây dựng một Game engine để phát triển tại Việt Nam. Hiện nay những Game engine nổi tiếng cũng khá nhiều, tuy nhiên giá thành một Game engine như vậy không phải là nhỏ, vì vậy nhóm phát triển muốn xây dựng một Game engine phục vụ cho những người đam mê về làm Game nhưng không đủ tài chính để có thể mua được một Game engine thương mại. Khóa luận sẽ tập trung đi sâu vào hai thành phần trong Game engine đó là: quản lí tài nguyên và các chuyển động của đối tượng. Trong các phần mềm, việc quản lí tài nguyên luôn được xem xét và cân nhắc cẩn thận để làm sao có thể quản lí một cách hiệu quả nhất, đặc biệt trong Game thì vấn đề này càng cấp thiết hơn bao giờ hết. Một Game muốn được phát triển sẽ phải quản lí tài nguyên tốt, hạn chế tới mức tối đa sử dụng tài nguyên của máy tính người chơi và cũng để tăng tốc cho chương trình. Cần có cơ chế cấp phát và giải phóng bộ nhớ một cách hiệu quả. Trong Game bao giờ cũng phải có các đối tượng chuyển động, vì vậy cần có cách thức phương pháp để quản lí và tạo ra được các nhân vật có chuyển động. Khóa luận sẽ tập trung vào nghiên cứu các kỹ thuật để tạo ra các chuyển động cho nhân vật để cho các chuyển động ngày càng giống với chuyển động của con người, tạo được hiệu ứng tốt cho Game. Ngoài phần mở đầu kết cấu khóa luận bao gồm 6 chương: Chương 1, 2: Đặt vấn đề và tổng quan về hệ thống Game engine của cả nhóm. Chương 3: Giới thiệu về quản lí tài nguyên và cách tổ chức tài nguyên trong hệ thống. Chương 4: Giới thiệu về chuyển động cho các đối tượng, đi vào các kỹ thuật tạo chuyển động. Chương 5: Thực nghiệm các kỹ thuật được nêu ở chương 4 Chương 6: Kết luận, thực hiện đánh giá kết quả đã đạt được, hướng phát triển sắp tới. Chương 1.ĐẶT VẤN ĐỀ 1.1.Bối cảnh nghiên cứu Ngành công nghiệp phát triển game trên thế giới đang phát triển như vũ bão. Cách đây 20 năm, game rất đơn giản và chỉ cần một người hoặc một nhóm nhỏ người phát triển nhưng ngày nay, các game hiện đại với đồ họa và khả năng tương tác ấn tượng thường được phát triển bởi một đội ngũ đông đảo người thiết kế game, lập trình viên, nghệ sĩ… trong thời gian ròng rã từ một đến ba năm. Chính việc game ngày càng trở nên phức tạp như vậy nên hiện nay, các game thương mại không còn phát triển từ nguyên thủy nữa mà được phát triển lên từ game engine. Game engine hỗ trợ việc xây dựng game một cách nhanh chóng, đơn giản hơn đồng thời cung cấp khả năng tái sử dụng code cao do có thể phát triển nhiều game từ một game engine. Ở Việt Nam, Game online mới chỉ thực sự thâm nhập vào thị trường cách đây 6 năm nhưng chỉ trong khoảng thời gian ít ỏi đó, chúng ta đã có một số lượng nhà phát hành game lên tới con số hàng chục, số game được phát hành cũng tương ứng với số lượng đó. Nhưng theo như chúng tôi được biết, gần như tất cả các game online đang được phát hành ở Việt Nam là được nhập khẩu từ nước ngoài, chủ yếu là Trung Quốc và Hàn Quốc ( trừ một số game nhỏ chơi trên web như đánh bài, đánh cờ ..) Một câu hỏi mà có lẽ tất cả những người chơi game đều trăn trở là “bao giờ mới được chơi game Việt Nam?”. Chúng tôi chọn đề tài này làm khóa luận tốt nghiệp không phải với một tham vọng quá lớn, chỉ là muốn đi những bước chân chập chững đầu tiên vào thế giới phát triển game rộng lớn, để thu lượm kiến thức về lĩnh vực khó khăn nhưng đầy thú vị này và hi vọng ở một tương lai không xa, chúng tôi có thể góp một phần sức lực giải đáp trăn trở của cộng đồng người chơi game Việt Nam. 1.2.Mục tiêu Xây dựng một Game Engine đa nền có thể chạy trên nhiều hệ điều hành khác nhau, hướng đến phân khúc phát triển game nhập vai trực tuyến (MMO). Game Engine này được đặt tên là GEM. Đây là mục tiêu dài hạn, còn hiện tại, do thời gian làm luận văn chỉ khoảng 5 tháng nên nhóm chúng tôi chỉ tập trung hoàn thiện thành phần Render Engine trong Game Engine ( Xem chi tiết ở chương 2). 1.3.Giới thiệu chung Như đã giới thiệu ở trên, Game Engine là một lớp trung gian giữa game và nền tảng bên dưới, các thư viện lập trình cấp thấp. GEM là một game engine nên dĩ nhiên nó cũng tuân thủ theo nguyên tắc này. Hình 1. Kiến trúc phân tầng của GEM Đặc điểm đầu tiên của GEM là khả năng chạy đa nền. Để đạt được điều đó, GEM sử dụng các bản build trên các nền tảng khác nhau (chứ không phải sử dụng thông dịch). Các đoạn mã nguồn phụ thuộc nền tảng sẽ được phân chia bằng việc sử dụng các cờ tiền biên dịch, hạn chế tối đa việc sử dụng các lớp abstract – vì việc này sẽ làm giảm hiệu suất chương trình đáng kể [10]. Cũng vì lí đo chạy đa nền nên chúng tôi lựa chọn OpenGL làm giao diện lập trình đồ họa 3D cấp thấp cho GEM, do chuẩn OpenGL là chuẩn mở và không bị phụ thuộc vào hệ điều hành. GEM được thiết kế hướng đối tượng và yêu cầu về hiệu năng chạy cao nên chúng tôi sử dụng ngôn ngữ C++ - Ngôn ngữ đáp ứng hoàn hảo các điều kiện trên. Đa số các Game Engine trên thế giới hiện nay đều được phát triển bằng ngôn ngữ C++. Chúng tôi thiết kế GEM nhắm đến phân khúc phát triển game nhập vai trực tuyến, nên khả năng tương thích với một phạm vi rộng cấu hình phần cứng là một điều kiện quan trọng, dự kiến sẽ hỗ trợ các card đồ họa hỗ trợ openGL 1.4 và shader 1.0 trở lên Bảng cấu hình tối thiểu dự kiến Hãng sãn xuất Dòng card hỗ trợ nVidia Từ GeForce4 Ti trở lên ATI Từ Radeon 9500 trở lên Intel ( card tích hợp ) Từ Intel® GMA 3100 ( chipset G31,Q33) trở lên Chương 2.KIẾN TRÚC TỔNG THỂ GEM là được chia thành nhiều thành phần để tiện cho việc phát triển và bảo trì. Cụ thể GEM gồm các thành phần như sau: Hình 2. Kiến trúc tổng thể Ghi chú: Do thời gian làm luận văn có hạn, chúng tôi mới chỉ hoàn thành những thành phần sau: Giao tiếp với hệ điều hành, Các kiểu dữ liệu cơ bản, Render Engine. Những thành phần này đủ để hỗ trợ người sử dụng tạo ra các khung cảnh 3D và tương tác với chúng. 2.1.Các dữ liệu cơ bản Các kiểu dữ liệu cơ bản là thành phần bao gồm các cấu trúc dữ liệu cơ bản như mảng động, vector, ma trận… các phép toán trên các kiểu dữ liệu đó cung cấp cho thành phần khác sử dụng. Hình 3. Biểu đồ lớp của thành phần các kiểu dữ liệu cơ bản Các kiểu dữ liệu này có thể chia thành 2 nhóm chính: Các yếu tố trong không gian 3D: Vector2, Vector, Vector4: các loại vector biểu diễn tọa độ 2 chiều, 3 chiều và tọa độ đồng nhất. Aabb ( Axis aligned bounding box ): hình hộp chữ nhật có các cạnh dọc theo 3 trục xyz, được mô tả bằng 2 điểm (xmin, ymin, zmin ), ( xmax, ymax, zmax) Sphere: hình cầu, được mô tả bởi tọa độ tầm và bán kính. LineSequent, Line, Ray: đoạn thẳng, đường thẳng, tia. Matrix: ma trận sử dụng để biểu diễn các phép biến đổi: dịch, xoay, co giãn trong không gian 3 chiều. Plane: mặt phẳng được mô tả bằng các hệ số của phương trình: ax + by + cz + d = 0. Frustum: là hình chóp cụt biểu diễn khung nhìn của camera, được mô tả bằng 6 mặt phẳng tạo nên nó. Các kiểu đối tượng lưu trữ: String. Array: mảng động với hệ số mở rộng có thể tùy biến. GemAllocator: sử dụng bởi các lớp khác để thực thi việc cấp phát và giải phóng bộ nhớ. List: linked list 2 chiều. Stack. 2.2.Giao tiếp với hệ điều hành Giao tiếp với hệ điều hành là thành phần thực thi các công việc cần giao tiếp với hệ điều hành như điều phối event, đọc ghi file, lấy thời gian hệ thống… Trong đó quan trọng nhất là quá trình điều phối event: Hình 4. Quá trình điều phối event GEM lấy event từ Message System của hệ điều hành, từ đó lấy các thông tin cần thiết tạo ra GemEvent - lý do cần tạo ra GemEvent là để tránh bị phụ thuộc vào hệ điều hành. Sau đó, GemEvent sẽ được gửi lần lượt đến các thành phần có khả năng nhận và xử lý event. 2.3.Render Engine 2.3.1.Khái quát về Render Engine Render Engine là thành phần cốt lõi của một Game Engine. Nó hỗ trợ người dùng các công việc thiết yếu để tạo ra một khung cảnh 3D. Người dùng sẽ không cần biết nhiều đến những công việc tầng thấp như quá trình đọc file tài nguyên, sử dụng 3D Graphic API, quá trình tạo các effect… mà chỉ cần dùng giao diện do Render Engine cung cấp. Render Engine là thành phần duy nhất trong Game Engine giao tiếp với các thư viện đồ họa cấp thấp ( cụ thể ở đây là openGL và Cg ) Hình 5. Kiến trúc phân tầng của Render Engine 2.3.2.Kiến trúc của Render Engine Render engine gồm các module sau: Hình 6. Biểu đồ gói của Render Engine - Graphic Driver là module duy nhất trực tiếp sử dụng 3D Graphic API (openGL), cung cấp cho các module khác một giao diện đơn giản hơn để tương tác với card đồ họa. - Quản lý tài nguyên là module quản lý các tài nguyên cần thiết để xây dựng một khung cảnh 3D như mesh, animated mesh, texture 2D, cubemap…Module này được trình bày chi tiết trong chương 3 của khóa luận này. - Quản lý khung cảnh là module thực hiện việc tổ chức và kiểm soát các đối tượng tồn tại trong một khung cảnh 3D, từ đó thực hiện quá trình render toàn bộ khung cảnh đó tạo nên hình ảnh 2D tại vị trí nhìn. Module này được trình bày chi tiết trong khóa luận “Xây dựng Game Engine đa nền tảng – Quản lý khung cảnh” - Trương Đức Phương. - Hiệu ứng ánh sáng và vật liệu là module mở rộng các thành phần của Quản lý khung cảnh để tạo các hiệu ứng về ánh sáng, vật liệu, và đổ bóng. Module này được trình bày chi tiết trong khóa luận “Xây dựng Game Engine đa nền tảng – Hiệu ứng ánh sáng và vật liệu” - Bùi Hoàng Khánh. - Mô phỏng tự nhiên là module mở rộng các thành phần của Quản lý khung cảnh để mô phỏng các yếu tố tự nhiên cần có trong game như nước, địa hình, lửa, khói… Module này được trình bày chi tiết trong khóa luận “Xây dựng Game Engine đa nền tảng –Mô phỏng tự nhiên” - Trần Thái Dương. - Chuyển động của đối tượng là module mở rộng các thành phần của Quản lý khung cảnh, thực hiện quá trình nội suy trong các mô hình chuyển động ( thường là các nhân vật trong game ) thông qua hai kĩ thuật thông dụng là key-frame và skinning. Module này được trình bày chi tiết trong chương 4 của khóa luận này. 2.4. Các thành phần còn lại Các thành phần Mạng, Trí tuệ nhân tạo, Tính toán vật lí, Âm thanh chưa được triển khai nên chúng tôi không đề cập đến trong tài liệu này. Chương 3.QUẢN LÝ TÀI NGUYÊN 3.1.Giới thiệu Trong tất cả các Game thì vấn đề được quan tâm đầu tiên chính là tài nguyên của game. Những người chơi khi quyết định cho mình một game nào đó thì họ sẽ phải xem xét tài nguyên trong máy họ còn bao nhiêu, và tài nguyên mà game sẽ tiêu tốn bao nhiêu để có thể quản lý tài nguyên trong máy mình một cách hợp lý nhất. Đó mới chỉ đơn thuần là về phía người chơi, vấn đề quan trọng và nặng nhọc nhất lại thuộc về phía những người viết game. Game dù có hay và hấp dẫn đến bao nhiêu đi chăng nữa nhưng quản lý tài nguyên không tốt cũng rất khó để thành công, bởi những người chơi game không phải ai cũng sở hữu cho mình những bộ máy tính siêu mạnh, mà mục tiêu nhắm đến ở đây là nhiều người có thể chơi được và làm sao tốc độ đạt được cũng là tốt nhất. Vì vậy cần phải có một cơ chế quản lý tài nguyên thật hiệu quả và hợp lý. Một game engine thường có các tài nguyên cơ bản: các mesh (thông tin mô tả hình dạng vật thể), các texture (thường là các hình ảnh 2D), các animated mesh (thông tin và các vật thể có chuyển động, thường là các nhân vật), các material (vật liệu phủ lên bề mặt các vật thể), các effect. 3.2. Quản lý tài nguyên trong GEM Hình 7. Mô hình quan hệ với các thành phần khác GEM sẽ có một module để quản lý các tài nguyên và sẽ được quản lý một cách tập trung. GEM sẽ có các bank để chứa các mesh, animated mesh, texture, effect, … đã được nhập vào. Như vậy thì sẽ giảm được tối đa tài nguyên, bởi vì ta chỉ lưu duy nhất một phiên bản của mỗi đối tượng, còn các đối tượng giống nhau sẽ tham chiếu tới nó. Với phương pháp quản lý như vậy thì một vấn đề đặt ra là: làm thế nào để xác định được đối tượng cần (có thể) được giải phóng. Để giải quyết vấn đề này thì với mỗi một bản dữ liệu (mesh, texture, …) chúng ta sẽ có biến đếm số lần nó được tham chiếu, khi biến đếm từ 1 trở về 0 tức là nó không còn được tham chiếu nữa, thì dữ liệu đó có thể được giải phóng. Ví dụ: Hình 8.Ví dụ Mesh Bank 3.3. Liên kết giữa các thành phần Hình 9. Mô hình liên kết với các thành phần khác Module quản lí tài nguyên là một thành phần cốt lõi trong GEM, tất cả các module khác như: quản lí sceneGraph, ánh sáng và đổ bóng, hiệu ứng tự nhiên đều phải sử dụng đến các thành phần trong module quản lí tài nguyên. Module này sẽ cung cấp các tài nguyên như: Mesh, Material, Texture, AnimatedMesh, Effect cho các sceneNode của những module khác nhau sử dụng chúng. Các module khác sẽ không phải quan tâm đến việc quản lí tài nguyên ra sao, mà chỉ việc khai báo và sử dụng các tài nguyên đó. Còn việc quản lí: xóa, cấp phát bộ nhớ, tham chiếu, … là việc của quản lí tài nguyên. 3.4. Các thành phần trong Resource Manager Hình 10. Các thành phần trong Resource manager Trong module quản lí tài nguyên sẽ có các thành phần: các mesh (thông tin mô tả hình dạng vật thể), các texture (thường là các hình ảnh 2D), các animated mesh (thông tin và các vật thể có chuyển động, thường là các nhân vật), các Material (vật liệu phủ lên bề mặt các vật thể), các effect để tương tác với GPU. MeshBank dùng để lưu trữ tập trung tất cả các mesh, tương tự như vậy có TextureBank, EffectBank, AnimatedMeshBank để lưu trữ các: Texture, Effect, AnimatedMesh. Các lớp DlightEffect, ShadowEffect, BumpEffect, WaterEffect sẽ được thừa kế từ lớp Effect để tạo ra các effect với chức năng khác nhau. Lớp AnimatedMesh sẽ được thừa kế từ hai lớp KeyFrame và Skinning. 3.5. Biểu đồ lớp 3.5.1.Quản lý Mesh Hình 11. Biểu đồ lớp Mesh và MeshBank Để quản lí một mesh (các vật thể) ta sẽ cần lưu những thông tin quan trọng sau: Lớp Mesh Các thuộc tính: vertexArray: chứa thông tin về các đỉnh của mesh normalArray: chứa thông tin về véc tơ normal texCoordArray: chứa thông tin về texcoordinate numVertices: số lượng đỉnh của mesh đó user: cho biết số lượng tham chiếu đang chiếu tới nó Các phương thức: getUser(): lấy ra số lượng các tham chiếu đang sử dụng nó setUser(): Khi ta dùng một mesh nào đó thì tăng số lượng tham chiếu tới nó lên (tăng user) delUser(): Khi ta không dùng một mesh nào đó thì sẽ xóa số lượng tham chiếu tới nó đi. Khi nào user=0 thì hệ thống quản lí tài nguyên sẽ tự động xóa mesh đó khỏi bộ nhớ. Lớp MeshBank Các thuộc tính: meshArray: lưu trữ một danh sách các mesh khi được nạp vào Các phương thức: insertMesh(_mesh, k): thêm một _mesh vào vị trí k trong danh sách appendMesh(_mesh): thêm _mesh vào cuối danh sách các mesh hiện có deleteMesh(k): xóa một mesh ở vị trí k trong danh sách getMeshFromID(meshID): lấy ra một mesh ở vị trí meshID trong danh sách useMesh(meshID): gọi phương thức setUser() của phần tử có vị trí meshID dontUseMesh(meshID): gọi phương thức delUser() của phần tử có vị trí meshID 3.5.2.Quản lý Texture Hình 12. Biểu đồ lớp Texture và TextureBank Lớp Texture Các thuộc tính: m_User: số lượng đối tượng đang sử dụng nó m_NativeGDID: là ID của texture được quản lí bởi card đồ họa m_Info: Thông tin về một texture m_Name: tên của texture Các Phương thức: Có các phương thức get, set, del User như lớp mesh Thông tin về một textute gồm: { E_TEXTURE_FORMAT tfFormat; E_PIXEL_FORMAT tfPixelFormat; u32 tfMaxMipMapLevels; u32 tfWidth; u32 tfHeight; s32 tfSize; bool tfGenMipmap; bool tfCompressed; E_TEXTURE_FILTER tfFilter; E_TEXTURE_WRAP tfWrap; E_TEXTURE_TYPE tfType; } TextureInfo; E_TEXTURE_FORMAT: là một loại định dạng của texture trong card đồ họa E_PIXEL_FORMAT: định dạng của dữ liệu fixel được sử dụng trong card đồ họa tfMaxMipMapLevels: giá trị tầng lớn nhất của MipMap, nếu =0 tức là không có mipmap. tfWidth, tfHeight: kích cỡ của texture tfSize: kích cỡ của dữ liệu pixel tfGenMipmap: nếu = true card đồ họa sẽ tự động sinh ra mipmap cho texture tfCompressed: =true nếu dữ liệu pixel được tạo định dạng E_TEXTURE_TYPE: loại của texture: 1D, 2D, 3D, Cubemap E_TEXTURE_WRAP: cách gắn texcoordinate E_TEXTURE_FILTER: để xác định việc gắn texture, có 2 loại: min, map tức là thu nhỏ hoặc phóng to Lớp TextureBank Do texture không lưu dữ liệu mà lưu thông tin về texture, còn những dữ liệu đó đã nằm trong card đồ họa. Vì vậy bank sẽ không lưu texture dưới dạng con trỏ như các bank khác. Các phương thức trong lớp TextureBank cũng giống như trong lớp MeshBank, vì texture có thêm thuộc tính m_Name nên trong bank sẽ có thêm các phương thức để quản lí theo tên (cũng tương tự như ID). 3.5.3.Quản lý Effect Hình 13. Biểu đồ lớp Effect và EffectBank Lớp Effect Các thuộc tính: cgContext: lưu context chứa chương trình Cg cgEffect: Lưu effect cgTechnique: lưu technique của chương trình Cg phù hợp nhất với GPU hiện tại Các phương thức: updateEffectParameter(): cập nhật giá trị các tham số trong chương trình cg getFirstPass(): lấy pass đầu tiên trong chương trình cg getNextPass(aPass): lấy pass ngay sau aPass Lớp EffectBank Các thuộc tính: effectArray: mảng lưu danh sách các Effect Các phương thức: append(_effect): lưu một Effect vào danh sách các effect, trả về id của effect thêm vào remove(id): xóa effect có ID là id ra khỏi danh sách các effect getEffectFromID(id): trả về một Effect có ID là id 3.5.4.Quản lý AnimatedMesh Hình 14. Biểu đồ lớp AnimatedMesh và AnimatedMeshBank AnimatedMesh là một loại mesh có sẵn các chuyển động, để tạo ra được loại mesh này ta dùng hai kỹ thuật: key-frame và skinning. Lớp AnimatedMesh sẽ được thừa kế từ 2 lớp Key-frame và skinning. Để có thể tương tác được với các mesh có sẵn chuyển động này thì ta sẽ phải quản lí các thông tin sau: Lớp AnimatedMesh Các thuộc tính: vertexArray: chứa vị trí các đỉnh của mesh tại một thời điểm phụ thuộc vào hàm tính nội suy numVertice: số lượng đỉnh cho một mesh coorPerVer: số chiều của đỉnh (thông thường là 3: x,y,z) normalArray: chứa thông tin về normal numNormals: số lượng các normal có trong mảng coorPerNor: số chiều của normal texCoordArray: mảng chứa các textcoordinate (tọa độ texture) numTexcoords: số lượng texcoordinate có trong mảng coorPerTex: số chiều của texcoordinate user: số lượng tham chiếu đang chiếu tới mesh (đang sử dụng mesh) Các phương thức: interpolate(factor): hàm tính nội suy theo factor, hàm này sẽ gọi các phương thức nội suy ở lớp Key-frame và skinning để lấy ra các đỉnh, normal, … của mesh tại một thời điểm. getUser(): trả về số lượng đang tham chiếu tới mesh (đang sử dụng nó) setUser(): khi một đối tượng nào đó sử dụng mesh thì tăng user lên delUser(): khi một đối tượng không sử dụng mesh nữa thì sẽ giảm số lượng tham chiếu tới mesh đó đi. Khi user=0 tức là không có tham chiếu nào tới nó Lớp AnimatedMeshBank : cũng được quản lí như trong lớp MeshBank 3.5.5.Quản lý Material Hình 15. Biểu đồ lớp Material Material là vật liệu, chất liệu được phủ lên các đối tượng, phục vụ cho việc tính toán ánh sáng. Quản lí material có các thông tin sau: Lớp Material Các thuộc tính: Illum: loại mô hình chiếu sáng: Phong, Lambert, Blinn … Ka: màu ambient của vật liệu Kd: màu diffuse của vật liệu Ks: màu specular của vật liệu Tf: màu của vật liệu Ni: hệ số bóng của vật liệu Các phương thức: loadFromMtl(fileName: String): lấy thông tin về material từ file .mtl Các phương thức khác để set, và get các thuộc tính Chương 4.CHUYỂN ĐỘNG CỦA CÁC ĐỐI TƯỢNG 4.1.Giới thiệu Trong lịch sử phát triển game từ trước đến nay thì một phần hết sức quan trọng làm nên thành công của game đó là chuyển động của các nhân vật trong game. Từ những thập niên 80, 90 của thế kỷ trước game đã bắt đầu phát triển, thời đó game dung lượng rất nhỏ - với chỉ một đĩa mềm dung lượng hơn 1 MegaByte là ta có thể lưu trữ rất nhiều game, và các game chạy trên nền MS-DOS. Tuy những game nhỏ như vậy nhưng các nhân vật trong game cũng đã bắt đầu có chuyển động. Chẳng hạn như game Mario hay Ninja các nhân vật cũng đã có các chuyển

Các file đính kèm theo tài liệu này:

  • docHoang Tuan Hung_K50CNPM_Khoa luan tot nghiep dai hoc.doc
Tài liệu liên quan