Khóa luận 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

MỤC LỤC

MỞ ĐẦU 1

Chương 1.ĐẶT VẤN ĐỀ 3

1.1.Bối cảnh nghiên cứu 3

1.2.Mục tiêu 3

1.3.Giới thiệu chung 4

Chương 2.KIẾN TRÚC TỔNG THỂ 6

2.1.Các dữ liệu cơ bản 7

2.2.Giao tiếp với hệ điều hành 8

2.3.Render Engine 9

2.3.1.Khái quát về Render Engine 9

2.3.2.Kiến trúc của Render Engine 10

2.4. Các thành phần còn lại 11

Chương 3.QUẢN LÝ TÀI NGUYÊN 12

3.1.Giới thiệu 12

3.2. Quản lý tài nguyên trong GEM 12

3.3. Liên kết giữa các thành phần 14

3.4. Các thành phần trong Resource Manager 15

3.5. Biểu đồ lớp 16

3.5.1.Quản lý Mesh 16

3.5.2.Quản lý Texture 17

3.5.3.Quản lý Effect 19

3.5.4.Quản lý AnimatedMesh 20

3.5.5.Quản lý Material 21

Chương 4.CHUYỂN ĐỘNG CỦA CÁC ĐỐI TƯỢNG 23

4.1.Giới thiệu 23

4.2.Khái quát về animation 23

4.3.Kỹ thuật tạo chuyển động nhân vật 24

4.3.1.Kỹ thuật nội suy Key-Frame 24

4.3.1.1. Giới thiệu 24

4.3.1.2. Nội suy bậc 1 25

4.3.1.3. Nội suy bậc 2 25

4.3.1.4.Triển khai kỹ thuật key-frame 25

4.3.2.Kỹ thuật skinning 28

4.3.2.1.Giới thiệu 28

4.3.2.2. Kỹ thuật Skeletal Subspace Deformation 29

4.3.2.3. Kỹ thuật Animation Space 31

4.3.2.4. Kỹ thuật Multi-Weight Enveloping 32

4.3.2.5.Triển khai skinning 33

Chương 5.THỰC NGHIỆM 35

5.1. Demo key-frame 35

5.2. Demo Skinning 38

Chương 6.KẾT LUẬN 39

6.1.Kết quả đạt được 39

6.2.Định hướng tương lai 39

PHỤ LỤC 40

TÀI LIỆU THAM KHẢO 44

 

 

doc52 trang | Chia sẻ: netpro | Lượt xem: 1647 | Lượt tải: 2download
Bạn đang xem trước 20 trang tài liệu Khóa luận 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
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 động như đi, chạy, đấm, đá, … Tuy những chuyển động đó còn rất thô sơ nhưng đã đánh dấu những bước phát triển của game. Dần theo thời gian game đã phát triển một cách vũ báo cùng với sự phát triển của phần cứng, ngày nay dung lượng của game được tính bằng Gigabyte chứ không phải Kilobyte. Đáp ứng theo sự phát triển đó thì các hiệu ứng trong game ngày nay cũng rất cao cấp, các chuyển động của nhân vật cũng phong phú và uyển chuyển hơn rất nhiều. Game ngày càng hướng tới mục đích tạo ra những không gian gần gũi và giống thật nhất, các cử chỉ, chuyển động của nhân vật trong game cũng ngày càng giống người hơn. Vì vậy để tạo ra những chuyển động cho nhân vật thì những người thiết kế nhân vật cũng như những người lập trình viên đã phải rất nỗ lực để đem lại cho người chơi những trải nghiệm thú vị nhất. 4.2.Khái quát về animation Animation (chuyển động) là kết quả cuả một hoạt động xảy ra theo thời gian – chẳng hạn một đối tượng dao động, một ánh sáng tắt dần đi hay là một nhân vật trong game đang chạy. Các game được sử dụng kỹ thuật animation sẽ đem lại hiệu quả cao hơn về hình ảnh, giúp hình ảnh di chuyển, chuyển động một cách uyển chuyển, mượt mà, tạo sức hấp dẫn cho các hoạt cảnh [3]. Ngày nay với những máy móc, công cụ hiện đại thì các nhân vật trong game được thiết kế ngày càng giống người hơn, và các kỹ thuật để tạo ra chuyển động cho nhân vật ngày càng được cải tiển và phát triển. Kỹ thuật chính để tạo ra animation có hai kỹ thuật là nội suy Key-Frame và Skinning. 4.3.Kỹ thuật tạo chuyển động nhân vật 4.3.1.Kỹ thuật nội suy Key-Frame 4.3.1.1. Giới thiệu Hình 16. Ví dụ key-frame Kỹ thuật nội suy Key-frame là một kĩ thuật rất cổ điển và hữu dụng cho việc tạo hoạt cảnh. Ngày xưa khi tạo ra các cử động chẳng hạn cho phim hoạt hình thì người tạo phim thường phải vẽ ra các hình ảnh, khung hình (frame) cử động liên tiếp nhau rồi nối liền thành một hành động, để cho hành động đó được mượt mà thì sẽ phải vẽ 24hình/1giây. Như vậy để có được những hành động xảy ra trong thời gian ngắn thì các họa sĩ đã phải mất rất nhiều công sức vẽ ra các hình ảnh cử động của các nhân vật, hơn thế việc vẽ các cử động đó không phải là một việc đơn giản vì rất nhiều hình mới có thể tạo ra được một chuyển động, và phải làm sao cho người xem không cảm nhận được là đang xem các hình rời rạc mà là một chuyển động thật nên các hình vẽ chỉ khác nhau ở những chi tiết rất nhỏ, đòi hỏi người họa sĩ phải có độ tinh tế rất cao. Ngày nay với sự phát triển của máy tính thì công việc trở nên đơn giản hơn nhiều, thay vì việc vẽ một loạt các khung hình thì ta chỉ phải vẽ một số khung hình chính (key frame) rồi những khung hình ở giữa các khung hình chính đó ta không phải vẽ mà sẽ dùng những hàm toán học để máy tính sẽ tính toán ra các khung hình đó. Nhờ có sự giúp đỡ của máy tính thì đã giải phóng được rất nhiều sức lao động của con người, và để tạo ra được các hiệu ứng hình ảnh tốt, mượt mà sống động thì phụ thuộc rất nhiều vào các hàm nội suy. Có hai loại hàm nội suy là hàm nội suy bậc một và hàm nội suy bậc hai, tùy thuộc vào các loại cử động, chuyển động khác nhau mà ta dùng loại hàm nội suy nào cho phù hợp. 4.3.1.2. Nội suy bậc 1 blendedPosition= positionA*(1-f) + positionB*f f là một hàm nội suy có giá trị từ 0 đến 1. Khi f=0 tức là lúc đó chuyển động được bắt đầu từ trạng thái A (frameA), và f cứ tăng dần từ 0 đến 1 để các trạng thái của nhân vật được biến đổi dần dần từ trạng thái A sang trạng thái B. Khi f=1 tức là chuyển động kết thúc tại trạng thái B (frameB). 4.3.1.3. Nội suy bậc 2 blendedPosition= positionA*(1-f*f) + positionB*f*f Nội suy bậc 1 có ưu điểm đối với các hoạt cảnh diễn ra có nhiều trạng thái thay đổi và tốc độ chuyển động nhanh. Vì với nội suy bậc 1 thì có ít sự tính toán hơn nội suy bậc 2 cho nên những chuyển động với tốc độ nhanh thì nó có thể đáp ứng được mà chất lượng hình ảnh đem lại vẫn rất tốt. Tuy nhiên đối với các chuyển động với tốc độ chậm thì nội suy bậc 1 sẽ cho hình ảnh bị giật, lúc đó ta sẽ phải dùng nội suy bậc 2 để tính toán một cách chi tiết và cụ thể hơn để đem lại được hiệu quả hình ảnh tốt. [3] Hình 17. Nội suy bậc 1 và bậc 2 4.3.1.4.Triển khai kỹ thuật key-frame Khi xây dựng một game nào đó thì bao giờ cũng có sự kết hợp chặt chẽ giữa deginer (người thiết kế) và programer (người lập trình). Công việc của những người thiết kế là tạo ra các khung cảnh, đồ vật, nhân vật, cây cối,… còn công việc của những người lập trình là tổ chức, liên kết các khung cảnh, nhân vật đó để tạo ra được một game hoàn chỉnh. Cụ thể hơn các nhân vật sẽ được những người thiết kế tạo ra rồi sau đó xuất ra một file theo định dạng nào đó, trong file đó sẽ lưu những thông tin cần thiết về nhân vật giúp cho người lập trình có thể sử dụng và quản lý được. Trong kỹ thuật key-frame mỗi đối tượng (nhân vật) ta sẽ phải biết được các thông tin sau: Số lượng frame Số lượng các đỉnh trong một frame Thông tin về tọa độ các đỉnh Thông tin về Texcoords Thông tin về vector normal … Trong GEM thông tin về animation của một đối tượng sẽ được quản lý như sau: Hình 18. Mô hình tổ chức các loại animation Mỗi đối tượng (nhân vật) sẽ có các loại animation như: STAND, RUN, JUMP, FLIP, WAVE… Thông tin về các loại animation này sẽ gồm có key-frame bắt đầu và key-frame kết thúc. Trong một loại animation nào đó thì sẽ có các key-frame, số lượng key-frame cho một loại animation là khác nhau (phụ thuộc vào người thiết kế). Mỗi frame sẽ chứa thông tin về tọa độ các đỉnh, số lượng đỉnh trong các frame là giống nhau chỉ khác nhau về vị trí các đỉnh. Mô hình lớp của các đối tượng sử dụng key-frame: Hình 19. Biểu đồ lớp KeyFrame Các thuộc tính: + vertexArray: mảng chứa tất cả các đỉnh của tất cả các key-frame (các đỉnh sẽ được đặt liên tiếp nhau trong mảng hết key-frame này đến key-frame khác) + normalArray: mảng chứa các vector normal của các đỉnh + texCoordArray: mảng chứa texture Coordinate của các đỉnh + num_frame: số lượng key-frame + num_xyz: số lượng đỉnh trong một key-frame Các phương thức: + loadModel(filename: String): load một model từ một file rồi lấy ra các thông tin về model đó. + setAnimation(type: s32, duration: f32): phương thức này cho phép ta xét loại animation cho nhân vật như: RUN, STAND, JUMP, BOOM… và duration là khoảng thời gian để chạy hết một loại animation đó. Chẳng hạn animation RUN có 15 key-frame thì thời gian để chạy hết 15 key-frame đó là duration và cứ chạy liên tục 15 key-frame đó. Muốn cho nhân vật chuyển động nhanh lên thì ta giảm duration đi và tăng duration chuyển động sẽ chậm lại. + interpolate(): phương thức này sẽ tính toán nội suy ra các frame, dựa vào thời gian chạy và số lượng key-frame cuả loại animation mà nó sẽ quyết định chuyển đến key-frame tiếp theo hay sẽ tính nội suy ra các frame. 4.3.2.Kỹ thuật skinning 4.3.2.1.Giới thiệu Hình 20.Ví dụ Skinning Kỹ thuật skinning được phát triển dựa trên kỹ thuật nội suy key-frame và dựa trên cấu tạo của con người, cấu tạo của các con vật, … Với kỹ thuật nội suy key-frame để tạo ra animation thì ta sẽ trộn các frame với nhau, tuy nhiên kỹ thuật này sẽ làm tốn tài nguyên của chúng ta hơn. Còn kỹ thuật Skinning để tạo ra được animation thì ta sẽ dùng khung xương (skeleton) và các khớp nối điều khiển chuyển động của nhân vật. Ngày nay kỹ thuật Skinning được sử dụng rất phổ biến, hầu hết các game đều sử dụng kỹ thuật này bởi tính hữu ích của nó. Những nhân vật chuyển động bằng khớp xương là thành phần cơ bản trong ngành đồ họa máy tính và các ứng dụng tương tác. Kỹ thuật đắp vỏ bề ngoài của nhân vật (skin) bằng việc sử dụng trọng số của các đỉnh gắn lên một khung xương, hoặc việc tính nội suy ra các mô hình, hình dạng có sẵn là những kỹ thuật rất phổ biến trong games hoặc các ứng dụng animation khác. Trong các ứng dụng đó thì các nhân vật là các đối tượng và sẽ được định nghĩa trước bone (xương), joint (khớp nối), skin (vỏ bề ngoài của nhân vật) để cho các những người lập trình có thể tương tác với nhân vật. Hình 21. Thành phần trong một nhân vật Chuyển động bằng khung xương là một kỹ thuật rất phổ biến trong việc tạo ra các cử động, động tác cho nhân vật. Kỹ thuật này sử dụng một hệ thống các khớp nối (joint) để liên kết các khúc xương (bone) và điều khiển các chuyển động, trong quá trình chuyển động các khớp nối này sẽ biến đổi (transformation) hoặc xoay (rotate) các đỉnh của mesh, và một đỉnh có thể bị điều khiển bởi một số khớp nối (từ 2 đến 4), chẳng hạn như trên một điểm nào đó thuộc bàn tay sẽ bị tác động bởi khớp của cổ tay và khớp của ngón tay. Quá trình đắp các đỉnh của mesh vào khung xương được gọi là skinning, có ba kỹ thuật skinning phổ biến là: Linear Blend Skinning (LBS) hay Skeletal Subspace Deformation (SSD) Animation Space (AS) Multi-Weight Enveloping (MWE) 4.3.2.2. Kỹ thuật Skeletal Subspace Deformation Skeletal Subspace Deformation (SSD) là một kỹ thuật đơn giản và phổ biến nhất để tính toán sự thay đổi hình dáng theo khung xương của skin [8,17,19,14,6]. SSD tính toán vị trí mới của mỗi đỉnh bằng việc kết hợp tuyến tính kết quả của mỗi đỉnh biến đổi với mỗi bone. Mỗi một trọng số wi là sự tác động của một bone và tổng của các trọng số của các bone tác dụng lên một đỉnh là vị trí mới của đỉnh đó. (1) v’: vị trí mới sau khi thay đổi. n: số bone tác động lên đỉnh đó. wi: trọng số của bone thứ i. Ti: ma trận biến đổi cho bone i. Bi: ma trận biến đổi cho bone i trước khi thay đổi nó. v: vị trí của đỉnh trước khi thay đổi trong đó: Theo kỹ thuật SSD thì không thực hiện được với những nhân vật được thiết kế khung xương có các khớp nối theo kiểu xoay quanh trục. Trong việc tính toán vị trí của các đỉnh cho các tư thế mới, ma trận biến đổi cho các bone được nội suy theo kiểu tuyến tính, mà nội suy tuyến tính cho các ma trận đó lại không tương đương với việc nội suy tuyến tính ma trận cho việc xoay. Hình 22. Hạn chế kỹ thuật SSD Mặc dù vậy, SSD vẫn phổ biến vì tính đơn giản và hiệu quả của nó. Đã có rất nhiều nghiên cứu quan trọng để cải tiến thuật toán SSD. Một phương pháp đó là tập hợp lại các dữ liệu đúng của các kỹ thuật nội suy khác mà phổ biến để sửa lỗi cho những vị trí đỉnh sai của SSD. Lỗi của mỗi đỉnh sẽ được tính lại theo các mesh ví dụ đó sau đó ghép vào mesh được tạo ra bằng kỹ thuật SSD, càng sử dụng nhiều mesh ví dụ thì sẽ đem lại độ chính xác càng cao, tuy nhiên sẽ tốn tài nguyên để lưu trữ . Vì vậy cần xem xét mục đích để sử dụng số lượng mesh ví dụ cho hợp lý. Một phương pháp khác là sử dụng kỹ thuật Spherical Blend Skinning (SBS) [7,11]. Hình 23. Sử dụng kỹ thuật SSD Hình 24. Sử dụng kỹ thuật SBS 4.3.2.3. Kỹ thuật Animation Space Animation Space (AS) [13] cung cấp một cách mềm dẻo hơn SSD bằng việc chỉ thay đổi các vị trí còn lại của các đỉnh. Đặt Pi=wiBi-1v công thức của SSD trở thành: (2) Hình 25. Sơ đồ chuyển trục tọa độ Công thức (2) có thể được triển khai như sau: (3) Ta có thể coi véc tơ p như tọa độ của v’ trong một không gian đa chiều, gọi là không gian animation (animation space). Không gian ở đây là 4n chiều. Ta có thể chuyển ma trận từ không gian animation sang không gian model. Trong (3) thì T coi như animation matrix. 4.3.2.4. Kỹ thuật Multi-Weight Enveloping Kỹ thuật Multi-Weight Enveloping (MWE) cũng thay đổi trọng số từ công thức (1). Ma trận biến đổi của mỗi bone kết hợp với ma trận biến đổi nghịch đảo còn lại để tạo ra được ma trận trọng số cho mỗi đỉnh, và mười hai trọng số cho mỗi đỉnh liên quan. Đặt Mi= TiBi-1 công thức (1) được viết lại

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

  • docXâ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.doc