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: ĐẠ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
1
ĐẠ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
i
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 ...
52 trang |
Chia sẻ: haohao | Lượt xem: 1016 | Lượt tải: 1
Bạn đang xem trước 20 trang mẫu 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, để tải tài liệu gốc về máy 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
1
ĐẠ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
i
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
ii
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.
iii
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................................................................................................................... 3
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 ............................................................................................13
3.4. Các thành phần trong Resource Manager........................................................................14
3.5. Biểu đồ lớp ..........................................................................................................................15
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 ..................................................................................23
4.3.1.Kỹ thuật nội suy Key-Frame.........................................................................................23
4.3.1.1. Giới thiệu..................................................................................................................24
4.3.1.2. Nội suy bậc 1 ............................................................................................................24
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 ..........................................................................................................27
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
iv
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...................................................................................................................37
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
v
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
vi
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 .....................................................................11
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
1
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.
2
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.
3
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
4
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ở
5
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
6
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.
7
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)
8
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:
9
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ư
10
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:
11
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.
12
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, …
13
đã đượ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
14
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
15
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
16
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
17
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
18
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
19
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
20
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
21
- 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
22
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
23
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
24
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
25
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.
26
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:
27
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
28
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.
29
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
i
iii vBTwv
1
1
30
- 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
n
i
iw
1
1
31
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)
n
i
ii PTv
1
32
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 như sau:
Tp
P
P
P
TTTv
n
n
.
.
.
)...(
2
1
21
33
(4)
Nhân trọng số bao phủ và gán trọng số cho mỗi thành phần của ma trận M ta
được:
(5)
Trọng số thêm mới này cho phép mỗi thành phần của v bị phụ thuộc nhau sẽ độc
lập với nhau khi bone di chuyển. Chiều chuyển động của bone thì liên quan đến model
vì vậy có thể giới hạn trong một số trường hợp cụ thể.
MWE linh hoạt hơn Animation Space, do đó nó yêu cầu nhiều thông tin hơn để
thiết lập số lượng lớn trọng số cho mỗi bone. Số lượng trọng số tăng lên nghĩa là khả
năng của một số trọng số được xác định rõ ràng hơn so với Animation Space hay SSD
4.3.2.5.Triển khai skinning
Để triển khai kỹ thuật skinning, đối với một mesh ta sẽ phải quản lí các thông tin
sau:
- Một mesh điển hình
- Một khung xương (hệ thống các bone, joint)
Một mesh ta cần lưu các thông tin về:
Danh sách các đỉnh
Danh sách các normal để tính toán phản xạ ánh sáng
Danh sách texcoordinate của các đỉnh để gắn texture lên mesh
Số lượng các đỉnh, normal, textcoord
v
mmmm
mmmm
mmmm
wvMwv
n
i
n
i iiii
iiii
iiii
iii
1 1 34,33,32,31,
24,23,22,21,
14,13,12,11,
1000
v
b
mwmwmwmw
mwmwmwmw
mwmwmwmw
v
n
i
iiiiiiii
iiiiiiii
iiiiiiii
1
34,34,33,33,32,32,31,31,
24,24,23,23,22,22,21,21,
14,14,13,13,12,12,11,11,
1000
34
Chiều của mỗi đỉnh, normal, textcoord
Ta sẽ quản lý khung xương theo dạng cây như hình dưới:
Hình 26. Mô hình tổ chức khung xương
Các node có thể là: bone, joint.
Việc quản lí khung xương dựa theo cấu tạo của nhân vật, ta sẽ đi từ trên đầu
xuống, rồi tới cổ, vai, tay, …
Như vậy theo cách triển khai của kỹ thuật skinning đã giảm được rất nhiều tài
nguyên cho việc lưu trữ các nhân vật. Ở kỹ thuật Key-frame ta phải lưu trữ rất nhiều
key-frame, mỗi key-frame tương ứng với mesh trong skinning. Nhân vật càng nhiều
chuyển động thì số lượng key-frame càng tăng lên làm tốn rất nhiều tài nguyên. Với
kỹ thuật skinning ta chỉ phải lưu một mesh điển hình và khung xương của nó. Các
mesh khác sẽ được tính toán trong quá trình chuyển động dựa vào khung xương, các
đỉnh của mesh sẽ chuyển động thay đổi theo khung xương.
35
Chương 5.THỰC NGHIỆM
Để minh họa cho các cơ sở lý thuyết ở trên, khóa luận sẽ trình bày demo cho hai
kỹ thuật tạo chuyển động cho nhân vật. Dưới đây là demo thành phần trong khóa luận
này, cả nhóm sẽ có một demo chung ghép các thành phần với nhau.
5.1. Demo key-frame
Như đã trình bày trong phần triển khai, để quản lí được đối tượng có các chuyển
động, ta sẽ phải quản lí tất cả các key-frame. Mỗi key-frame sẽ có các thông tin về: vị
trí các đỉnh, véc tơ normal, textcoord. Và trong tất cả các key-frame số đỉnh, véc tơ
normal, textcoord là như nhau, chỉ khác nhau về vị trí. Hiện tại hỗ trợ loại file chứa
các đối tượng có chuyển động ở dạng MD2. Trong dạng MD2, các đối tượng sẽ được
xét luôn có các loại animation như: RUN, STAND, JUMP… và các loại animation đó
được xác định bởi 3 thành phần:
- Key-frame bắt đầu
- Key-frame kết thúc
- Số lượng fps cho 1s (số lượng khung hình)
Số lượng fps tính trong trường hợp lý tưởng để tính toán nội suy. Tuy nhiên,
khóa luận này sẽ không tính toán nội suy dựa vào số fps.
// first, last, fps
{ 0, 39, 9 }, // STAND
{ 40, 45, 10 }, // RUN
{ 46, 53, 10 }, // ATTACK
{ 54, 57, 7 }, // PAIN_A
{ 58, 61, 7 }, // PAIN_B
{ 62, 65, 7 }, // PAIN_C
{ 66, 71, 7 }, // JUMP
{ 72, 83, 7 }, // FLIP
{ 84, 94, 7 }, // SALUTE
{ 95, 111, 10 }, // FALLBACK
{ 112, 122, 7 }, // WAVE
{ 123, 134, 6 }, // POINT
{ 135, 153, 10 }, // CROUCH_STAND
{ 154, 159, 7 }, // CROUCH_WALK
{ 160, 168, 10 }, // CROUCH_ATTACK
{ 196, 172, 7 }, // CROUCH_PAIN
{ 173, 177, 5 }, // CROUCH_DEATH
{ 178, 183, 7 }, // DEATH_FALLBACK
{ 184, 189, 7 }, // DEATH_FALLFORWARD
{ 190, 197, 7 }, // DEATH_FALLBACKSLOW
{ 198, 198, 5 }, // BOOM
36
Các model theo chuẩn MD2 sẽ có 21 loại animation và được định nghĩa trong
danh sách trên.
Cách tính nội suy như sau (dùng nội suy bậc 1):
Phương thức setAnimation(type,duration) sẽ xét loại animation nào cho model. Từ
bảng trên ta sẽ xác định được vị trí key-frame bắt đầu và vị trí key-frame kết thúc của
loại animation đó. Biến duration là khoảng thời gian để chạy hết một loại animation đã
được xét.
Đặt:
- first: vị trí key-frame bắt đầu
- last: vị trí key-frame kết thúc
- time: thời gian chạy giữa 2 key-frame liên tiếp nhau
- old_time: thời điểm key-frame thứ n được render.
- curr_time: thời điểm hiện tại
Từ số lượng key-frame cho một animation (xác định bởi first và last) và thời gian
chạy cho animtion đó (duration) ta sẽ tính được thời gian để chạy 1 key-frame
time= duration/(last-first+1)
Tại mỗi thời điểm ta xét (curr_time-old_time)>= time không? Nếu đúng thì ta sẽ
chuyển đến key-frame thứ n+1 (key-frame tiếp theo) và gán lại old_time=curr_time,
ngược lại tức là thời gian cho một key-frame vẫn chưa hết thì ta sẽ tính toán nội suy ra
các frame mới dựa vào key-frame thứ n và n+1 và curr_time.
Như vậy với cách tính nội suy như trên kỹ thuật key-frame được triển khai.
Kết quả thực nghiệm:
Cấu hình máy chạy demo:
CPU: T7250 (2*2.0GHZ)
RAM: 2GB
HDH: Windows Vista
Card đồ họa: card tích hợp Intel(R) 965
Số khung hình /1s đạt được: ~70
37
Hình 27. Demo key-frame
5.2. Demo Skinning
38
Hình 28. Demo Skinning
Để có thể tạo ra được animation bằng kỹ thuật skinning thì thông tin về model sẽ
được quản lí bằng khung xương và mesh phủ bên ngoài. Các nhà thiết kế đã thiết kế
sẵn các animation và xuất ra một định dạng nào đó bằng các chương trình như: Maya,
3d Max… animation được tạo ra bằng việc thay đổi khung xương – tức là thay đổi các
trọng số kết với với ma trận biến đổi của các bone. Các tham số này sẽ thay đổi theo
thời gian, mỗi thời điểm thì trọng số sẽ khác nhau, từ đó dùng các kỹ thuật nhân trọng
số với ma trận biến đổi các bone kết hợp với mesh cho model đó tạo ra được các frame
khác nhau tạo thành animation.
Kết quả thực nghiệm:
Cấu hình máy chạy demo: như trên
Số khung hình /1s đạt được: ~30
39
Chương 6.KẾT LUẬN
6.1.Kết quả đạt được
Khóa luận tốt nghiệp đã nêu được 3 phần rõ ràng:
- Phần đầu: Chương 1, 2, 3 trình bày tổng quan về hệ thống của nhóm, phát
triển một cộng cụ giúp phát triển game một cách dễ dàng và nhanh chóng.
- Phần thứ 2: Chương 4 khóa luận đã nêu các giải pháp để quản lí các tài
nguyên trong game engine, và các thành phần tài nguyên có trong game
engine, cách sử dụng các tài nguyên đó.
- Phần 3: Chương 5 khóa luận đã trình bày các kỹ thuật để tạo chuyển động
cho các đối tượng trong game.
Trong quá trình thực hiện khóa luận, chúng tôi thực hiện xây dựng một hệ thống
phát triển game đến thời điểm hiện tại đã có thể tạo ra được một khung cảnh 3D, bên
trong có các vật thể như: bàn, ghế, tường, nồi, bếp, … và các hiệu ứng như: ánh sáng,
đổ bóng, hiệu ứng mặt nước, lửa, chuyển động. Đề tài có tính thực tiễn rất cao đặc biệt
tính thương mại. Ở Việt Nam, việc phát triển game engine mới chỉ đang bắt đầu và
hứa hẹn một tương lai tươi sáng cho ngành công nghiệp game.
6.2.Định hướng tương lai
Hiện nay thị trường game đang rất phát triển.Tuy nhiên việc tạo ra các game
engine ở Việt Nam còn đang bỏ ngỏ, vì vậy nhóm mong muốn phát triển được một
game engine tại Việt Nam với giá thành rẻ hơn rất nhiều so với các game engine nước
ngoài. Chúng tôi sẽ tiếp tục hoàn thiện và năng cấp tính năng cho hiệu ứng chuyển
động cho các nhân vật của mình, để đem lại cho người chơi những trải nghiệm thú vị.
Sắp tới nhóm cũng sẽ phát triển theo các tính năng cao cấp khác như: âm thanh, xử lý
va chạm vật lí, … và đưa các hiệu ứng chuyển động cho nhân vật vào cho GPU để tính
toán, giảm tải cho CPU và GPU cũng chuyên dụng hơn cho việc tính toán đồ họa.
Do điều kiện và thời gian nghiên cứu còn nhiều hạn chế nên khóa luận chắc chắn
không tránh khỏi những thiếu sót. Rất mong nhận được sự đóng góp ý kiến của các
thầy cô giáo, bạn bè và những người quan tâm.
Xin cảm ơn!
40
PHỤ LỤC
A. Bảng thuật ngữ
Thuật ngữ Ý nghĩa
Ambient Tính chất phản xạ ánh sáng đối với ánh sáng đến từ mọi
hướng.
AnimatedMesh Giống như mesh nhưng thay vì mô tả một đối tượng tĩnh
không biến đổi, animated mesh mô tả một đối tượng biến
đổi với nhiều hoạt động khác nhau.
animation Các loại chuyển động
bank Là nơi lưu trữ các tài nguyên
bone Là các đoạn xương được liên kết với nhau bằng khớp nối
Camera Đối tượng mô phỏng một khung nhìn
Diffuse Tính chất phản xạ khuếch tán.
Game Engine Middleware cung cấp một giao diện đơn giản hơn để phát
triển game
Height map Ảnh bitmap lưu thông tin về độ cao của từng pixel. Dùng để
tính vector pháp tuyến cho từng pixel dựa vào độ cao của nó
và các pixel xung quanh.
Joint Khớp nối các xương trong khung xương
Key-frame Khung hình cơ sở để xây dựng animation
Material Định nghĩa nguyên liệu làm nên đối tượng, do đó quy định
tính chất phản xạ ánh sáng của bề mặt đối tượng. Material
gồm ba thành phần là ambient, diffuse và specular
Mesh Là một mạng lưới các đa giác dùng để mô tả hình dạng của
vật thể trong không gian 3 chiều.
41
mipmap Là một tập hợp những bức ảnh được tính toán trước và tối
ưu hóa đi cùng một texture chính, làm tăng tốc độ render.
Mỗi ảnh bitmap của tập mipmap là một phiên bản của
texture chính vẫn được sử dụng khi khung nhìn đủ để render
nó ở trạng thái chi tiết đầy đủ, bộ render sẽ chuyển sang ảnh
mipmap thích hợp khi texture được nhìn tứ khoảng cách
hoặc với kích thước nhỏ hơn
Model Các mô hình đối tượng được dựng nên từ mạng lưới đa giác
model Những dạng hình học của một đối tượng
Normal Vectơ vuông góc với tiết diện của mặt bề mặt tại điểm P,
dùng để tính toán yếu tố phản xạ ánh sáng của bề mặt.
Normal map Ảnh bitmap lưu thông tin về vector pháp tuyến của từng
pixel
openGL Một chuẩn 3d graphic API
pixel Điểm ảnh
Render Là việc từ các dữ liệu về khung cảnh, đối tượng 3D, ta thực
hiện các phép biến đổi, các tính toán để đưa ra hình ảnh 2D
thu được tại vị trí nhìn ( giống nhau quá trình mắt người hay
các camera thu hình ảnh 2D từ môi trường ).
Scene graph Một cấu trúc dữ liệu phân tầng bao gồm sự miêu tả của một
cảnh vật được render
sketelon Khung xương của nhân vật, đối tượng
Specular Tính chất phản xạ gương.
Texture Là một hoặc một loạt các bức ảnh dùng để tăng độ chi tiết
cho các đối tượng.
Vertex Điểm trong không gian 3 chiều.
42
B. Bảng biểu tượng
Biểu tượng Tên Ý nghĩa
Package Đặc tả một gói
Class Đặc tả một lớp
Aggregation
Composition
Genaralization
Dependency
Import
Access
Merge
Note
Active Đặc tả một hành động
43
Initial state Đặc tả trạng thái bắt đầu
Final state Đặc tả trạng thái kết thúc
Choice
Đăc tả lựa chọn theo điều
kiện
Fork
Join
44
TÀI LIỆU THAM KHẢO
[1]
[2]
[3]
[4]
[5]
[6] A.Mohr and M. Gleicher. Deformation sensitive deformation. Technical Report
4/7/2003, University of Wisconsin, Madison, 2003.
[7] BLOOMENTHAL, J. 2002. Medial-based vertex deformation.
[8] J. P. Lewis, M. Cordner, and N. Fong. Pose space deformation: a unified approach to
shape interpolationand skeleton-driven deformation.
[9] Jonathan Kreuzer. Object Space Normal Mapping with Skeletal Animation
Tutorial.
[10] Karel Driesen and Urs Hölzle, The Direct Cost of Virtual Function Calls in
C++, 1995 ACM.
[11] KAVAN, L., AND ˇZ ´ARA, J. 2003. Real-time skin deformation with bones
blending.
[12] Khronos Group. OpenGL Specifcation Version 2.0.
[13] Merry, P. Marais, and J. Gain. Animation space: A truly linear framework for
character animation.
[14] Mohr, L. Tokheim, and M. Gleicher. Direct manipulation of interactive character
skins.
[15] NVIDIA. GPU Gems 1, 2, 3.
[16] P. G. Kry, D. L. James, and D. K. Pai. Eigenskin: real time large deformation
character skinning in hardware.
[17] P.-P. J. Sloan, C. F. Rose, III, and M. F. Cohen.Shape by example.
[18] Richard S. Wright, Michael Sweet. OpenGL Super Bible.
[19] X. C. Wang and C. Phillips. Multi-weight enveloping: least-squares approximation
techniques for skin animation.
Các file đính kèm theo tài liệu này:
- LUẬN VĂ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.pdf