.III Nhiệm vụ thực hiện và kết quả cần có Tìm hiểu về đồ họa 3D và thư viện sẽ sử dụng Opengl: Hiểu được cơ bảncách thức hoạt động cũng như các phép toán hình học trong không gian phép x
Trang 1KHOA CÔNG NGHỆ THÔNG TIN
Tel (84-511) 736 949, Fax (84-511) 842 771
Website: itf.ud.edu.vn, E-mail: cntt@edu.ud.vn
LUẬN VĂN TỐT NGHIỆP KỸ SƯ NGÀNH CÔNG NGHỆ THÔNG TIN
MÃ NGÀNH : 05115
ĐỀ TÀI : XÂY DỰNG GAME GIẢI TRÍ BOMBER-MAN 3D
Mã số : 06T1-038 Ngày bảo vệ : 15/06 /2011
SINH VIÊN : Trương Quang Thanh
CBHD : ThS Phan Thanh Tao
ĐÀ NẴNG, 06/2011
Trang 2
Trang 3
Trang 4
trình học của bất kỳ sinh viên nào, không những mang lại một cái nhìn định hướng trước khi sinh viên rời khỏi ghế nhà trường mà còn tạo điều kiện để sinh viên có thể tiếp xúc được với công việc thực tế, vốn có những điểm khác biệt với việc học ở trường
Để hoàn thành được luận văn này, đầu tiên em xin chân thành cảm ơn
sự hướng dẫn và chỉ bảo tận tình của thầy Ths Phan Thanh Tao.
Em cũng rất cảm ơn các thầy cô trong khoa Công nghệ Thông tin trường Đại học Bách Khoa Đà Nẵng đã tận tình giảng dạy, truyền đạt những kiến thức quý báu trong thời gian qua và tạo điều kiện cho em hoàn thành luận văn này.
Xin chân thành cảm ơn sự giúp đỡ, động viên của của tất cả các bạn trong quá trình học tập cũng như quá trình thực hiện luận văn.
Em cũng muốn cảm ơn những người thân trong gia đình đã động viên, giúp đỡ và tạo điều kiện để hoàn thành luận văn.
Rất mong nhận được sự đóng góp ý kiến của thầy cô và các bạn.
Đà Nẵng 6/2011 Sinh viên thực hiện Trương Quang Thanh.
Trang 5Tôi xin cam đoan :
1 Những nội dung trong luận văn này là do tôi thực hiện dưới sự hướng dẫn trực tiếp của thầy Ths Phan Thanh Tao.
2 Mọi tham khảo dùng trong luận văn đều được trích dẫn rõ ràng tên tác giả, tên công trình, thời gian, địa điểm công bố.
3 Mọi sao chép không hợp lệ, vi phạm quy chế đào tạo, hay gian trá, tôi xin chịu hoàn toàn trách nhiệm.
Sinh viên, Trương Quang Thanh
Trang 8MỤC LỤC
MỞ ĐẦU 1
.I Giới thiệu đề tài 1
.II Mục đích 1
.III Nhiệm vụ thực hiện và kết quả cần có 1
.IV Nội dung thực hiện 2
CƠ SỞ LÝ THUYẾT 4
.I CÁC PHÉP BIẾN ĐỔI AFFINE TRONG KHÔNG GIAN ĐỒ HỌA 2D VÀ 3D 4
.I.1 Các phép biến đổi trong không gian hai chiều 4
.I.1.1 Phép tịnh tiến 4
.I.1.2 Phép quay 5
.I.1.3 Phép tỉ lệ 6
.I.1.4 Phép đối xứng 6
.I.2 Tọa độ đồng nhất, kết hợp các phép biến đổi , các phép biến đổi ngược 7
.I.2.1 Tọa độ đồng nhất 7
.I.2.2 Các phép biến đổi ngược 8
.I.2.3 Kết hợp các phép biến đổi trong không gian hai chiều 9
.I.3 Các phép biến đổi trong không gian ba chiều 12
.I.3.1 Phép tịnh tiến 12
.I.3.2 Phép quay 13
.I.3.3 Phép tỉ lệ 19
.I.3.4 Phép đối xứng 19
.I.4 Một ví dụ về phép biến đổi 19
.II THƯ VIỆN OPENGL – CÁC PHÉP BIẾN ĐỔI TRONG OPENGL 20
.III OpenGL là gì ? 20
.III.1.1 OpenGL có thể làm gì và không thể làm gì? 21
.III.1.2 Các tác vụ OpenGL 21
.III.1.3 Hoạt động của OpenGL 21
.III.1.4 Mô hình hoạt động 22
.III.1.5 Yêu cầu hệ thống cho việc dùng OpenGL 23
.III.1.6 Một số thuật ngữ 24
.IV Các phép biến đổi trong Opengl 26
.IV.1.1 Tổng quan 26
.IV.1.2 Phép tịnh tiến - Translate 28
.IV.1.3 Phép xoay – Rotate 29
.IV.1.4 Phép kéo dãn - Scale 30
.IV.1.5 Thứ tự các phép biến đổi 30
.IV.1.6 Phép chiếu phối cảnh và trực giao 32
.IV.1.7 Một số hàm khác của OpenGL được sử dụng trong chương trình 34
.V CÁC THUẬT TOÁN TÌM ĐƯỜNG ĐI 37
Mô tả các thủ tục tìm kiếm rộng, sâu và sâu dần 39
Thuật giải tìm đường đi có giá thành nhỏ nhất 40
Tìm kiếm với tri thức bổ sung 40
Tìm đường đi trên đồ thị tổng quát 42
.VI Mô hình xây dựng từ 3DsMax 43
Trang 9Định nghĩa về mô hình (module) 43
Dữ liệu module được export từ 3DsMAX 45
OBJ WaveFront Format (file *.obj) 45
Material File Format (*.mtl) 48
BÀI TOÁN VÀ GIẢI THUẬT 53
.I PHÁT BIỂU YÊU CẦU 53
Ý tưởng 53
Thông tin tổng quát 53
Một vài hình ảnh game mẫu 54
.II PHÂN TÍCH VÀ THIẾT KẾ 55
Xây dựng cấu trúc dữ liệu cho các đối tượng trong game 55
Dữ liệu Background 56
Dữ liệu vật lý (Item) 60
Lớp Characters 64
.III CÁC GIẢI THUẬT CHO BÀI TOÁN 66
Thuật toán tìm đường 66
Thuật toán bom nổ 68
Di chuyển cho các nhân vật 69
Xử lý va chạm 70
.IV CẤU TRÚC MODULE CỦA GAME 70
Mô hình chung của một game 70
Khởi tạo – Init() 72
Cập nhật – Update() 72
Vẽ - Paint() 73
Tạm dừng – Pause() 73
Giải phóng bộ nhớ - DTOR 73
Thoát khỏi chương tình – Exit() 74
Phân tích các module cho chương trình 74
Phân tích mô hình dạng chung 74
Chia nhỏ module cho chương trình 75
CÀI ĐẶT CHƯƠNG TRÌNH 77
.I Cài đặt cấu trúc cho game 77
.II Cài đặt di chuyển 79
Cài đặt điều khiển cho nhân vật chính 79
Cài đặt AI cho quái vật 80
.III Cài đặt xử lý bom nổ 81
.IV Xử lý va chạm 82
.V Lớp Character 83
.VI Điều khiển bàn phím 83
.VII Một số hình ảnh trong game 85
KẾT LUẬN 87
.I Kết quả đạt được 87
Đánh giá kết quả 87
Khả năng mở rộng 87
.II Hướng phát triển 88
Trang 10[1] Dave Astle Kevin Hawkins Beginning OpenGL Game Programming Thomson Course Technology 25 Thomson Place, Boston, MA 2004 http://www.courseptr.com, 337
tr 89
[2] Bùi Minh Trường, Lập trình OpenGl với AUX Trường ĐH Wakayawa Nhật Bản, 114
tr 89
[3] Trang web http://nehe.gamedev.net/ 89
TÓM TẮT LUẬN VĂN TỐT NGHIỆP 90
Trang 11MỞ ĐẦU
.I Giới thiệu đề tài
Trong quá trình thực tập tốt nghiệp và từ việc tìm hiểu thực tế đã cho thấy cáccông việc hiện nay hầu hết đều gắn liền với máy vi tính Một nhu cầu cần thiết luôn
có sau khi kết thúc những công việc này là việc giải trí trên chính chiếc máy vi tính
mà họ sử dụng cho công việc Việc giải trí có thể như nghe nhạc, xem phim, đọc sách,
… Và có thêm một trò chơi đơn giản nhằm làm phong phú hơn nhu cầu giải trí là mộtđiều cần thiết
.III Nhiệm vụ thực hiện và kết quả cần có
Tìm hiểu về đồ họa 3D và thư viện sẽ sử dụng (Opengl): Hiểu được cơ bảncách thức hoạt động cũng như các phép toán hình học trong không gian (phép xoay,phép chiếu, phép kéo dãn, phép tịnh tiến, …)
Tìm hiểu về cấu trúc một mô hình 3D được tạo bởi 3D-Max: Thực hiện đọc dữliệu từ mô hình và xây dựng hình ảnh 3D từ nó cho chương trình
Giải pháp thuật toán cho chương trình: Cách thức xây dựng chương trình hoànchỉnh và cấu trúc theo module cho chương trình
Trang 12chương trình thực thi (Ma trận dữ liệu, danh sách liên kết, hàng đợi, …)
Giải pháp xây dựng AI cho chương trình: Dựa vào dữ liệu và thuật toán để xâydựng AI cho game (Tự động di chuyển, tự động tìm đường, đổi hướng, tăng tốc …)
.IV Nội dung thực hiện
Phần 1: Nghiên cứu cơ sở lý thuyết sử dụng cho đề tài
Nội dung nghiên cứu lý thuyết liên quan bao gồm:
Đồ họa 3D với các phép toán Affine
Thư viện đồ họa OpenGL với phép toán Affine
Các lý thuyết về thuật toán tìm đường
Cấu trúc mô hình xây dựng từ 3DsMax
Một số ví dụ tiêu biểu đi kèm
Phần 2: Phát biểu, mô tả đề tài
Phát biểu, mô tả đề tài bao gồm tài liệu đặt tả và tài liệu phân tích thiết kết dựatheo lý thuyết nghiên cứu liên quan
Trình bày hướng giải quyết đề tài, bao gồm thuật toán và các phương pháp lưutrữ dữ liệu
Cách giải quyết các vấn đề nảy sinh trong quá trình thực hiện đề tài
Phân tích cấu trúc chương trình để có thể chia nhỏ chương trình thành nhiềumodule nhằm tạo thuận lợi cho giai đoạn mã hóa chương trình
Phần 3: Mã hóa chương trình
Dựa vào các phân tích, thiết kế và giải thuật cũng như các module đã có ở phần trên
để thực hiện công việc mã hóa
Phần 4: Phần kết luận
Trang 13So sánh với những gì tham khảo được, đánh giá kết quả mình đã thực hiện baogồm những gì đã hoàn thành, những khó khăn và những gì chưa đạt được Đồng thờitìm đánh giá khả năng mở rộng phát triển của đề tài.
Trình bày một số ví dụ cụ thể để minh họa những gì có thể tiếp tục giải quyếttrong tương lai để phát triển thêm đề tài
Trang 14mô hình (modeling transformations).Trong không gian đồ họa hai chiều và ba chiều
ta có các phép biến đổi hình học cơ bản là tịnh tiến (translation), phép quay (rotation),phép tỉ lệ (scaling) và phép đối xứng (reflection) Các phép biến đổi khác là trườnghợp đặc biệt hoặc là sự kết hợp của các phép biến đổi trên Trong chương này ta sẽ đềcập đến cơ sở toán học của các phép biến đổi hình học thông qua các phương trìnhđược biểu diễn dưới dạng ma trận tọa độ
.I.1 Các phép biến đổi trong không gian hai chiều
Trang 15Nếu ta kí hiệu tọa độ các điểm và véc tơ như sau:
khi đó phép tịnh tiến được mô tả bởi phương trình:
Phép tịnh tiến không làm thay đổi hình dạng của vật thể (rigid-body)
.I.1.2 Phép quay
Trong khônggian hai chiều ta xét phép quay vật thể quanh tâm quay (pivotpoint) I(xr,yr) với góc quay θ (θ>0 nếu chiều quay ngược chiều kim đồng hồ và θ<0nếu chiều quay cùng chiều kim đồng hồ)
Trước hết ta xét trường hợp đơn giản nhất đó là phép quay quanh gốc tọa độ,như trong hình
Hình: 2 Phép quay điểm P quanh gốc một góc θ
Ta có các phương trình biến đổi sau:
x'= r cos(Φ+θ)= r cosΦcosθ- r sinΦsinθ
Trang 16Mặt khác ta lại có x=r cosΦ và y=r sinΦ Thay vào hai phương trình trên ta có:
x'= x cosθ- y sinθy'= x sinθ+ y cosθ
Do đó phép quay được mô tả bởi phương trình
Trường hợp tâm quay I không trùng gốc toạ độ ta sẽ xét sau
Phép quay cũng giống như phép tịnh tiến không làm thay đổi hình dáng của vật thể
.I.1.3 Phép tỉ lệ
Phép tỉ lệ sẽ nhân hoành độ và tung độ ban đầu với hệ số tỉ lệ sx và sy tương ứng, cụ thể ta sẽ có x'= x.sx và y'= y.sy Phương trình của phép biến đổi tỉ lệ có thể được mô ta như sau:
Khi (sx, sy)≠(1, 1) phép biến đổi tỉ lệ sẽ làm thay đổi hình dáng của vật thể Trường hợp đặc biệt: Khi sx=1 và sy=-1 phép tỉ lệ trở thành phép đối xứng Reox quatrục ox, tương tự nếu sx=-1 và sy=1 phép tỉ lệ trở thành phép đối xứng Reoy qua trục
oy
.I.1.4 Phép đối xứng
Ta xét trường hợp phép đối xứng qua một đường thẳng d qua gốc toạ độ và tạovới ox một góc θ như trong hình 3.3.Ta kí hiệu phép biến đổi là Red
Trang 17Hình: 3 Phép lấy đối xứng điểm P’ của P qua đường thẳng d
Ta có thể thực hiện phép đối xứng trên bằng cách áp dụng liên tiếp các phép biến đổi theo thứ tự sau đây:
(1) Áp dụng phép quay R(-θ) đưa dường thẳng d về vị trí trục ox
(2) Áp dụng phép lấy đối xứng Sox qua trục ox
(3) Áp dụng phép quay R(θ) đưa dường thẳng d về vị trí trí ban đầu
.I.2 Tọa độ đồng nhất, kết hợp các phép biến đổi , các phép biến đổi ngược.
(Homogeneous Coordinates, Inverse Transformations and Composite ransformations)
.I.2.1 Tọa độ đồng nhất
Ta có nhận xét rằng các phép biến đổi mô hình mà ta đã xét đều có thể minhhọa bằng các phương trình ma trận trong đó phép quay và phép tỉ lệ được biểu diễnbằng phép nhân còn phép tịnh tiến được biểu diễn bằng phép cộng Vấn đề đặt ra làkhi ta kết hợp nhiều phép biến đổi với nhau thì ta sẽ không thể biểu diễn thông quamột ma trận tổng thể Giải pháp cho vấn đề đó là sử dụng tọa độ đồng nhất Với tọa
độ đồng nhất ta biểu diễn tọa độ của một điểm (x,y) dưới dạng (xh, yh, h) trong đóx=xh/h và y=yh/h.Với tọa độ đồng nhất ta thấy tọa độ của một điểm có vô số cáchbiểu diễn ứng với các giá trị h khác nhau Để thuận tiện ta sẽ chọn h=1 khi đó điểm
Trang 18sẽ được biểu diễn hoàn toàn bằng phép nhân ma trận như sau:
Phép tịnh tiến:
Phép quay:
Phép tỉ lệ:
.I.2.2 Các phép biến đổi ngược
Ta sẽ tìm ma trận biết đổi của các phép biến đổi ngược của các phép biến đổi
Trang 19Tương tự phép biến đổi ngược của phép tỉ lệ với hệ số (sx, sy) là phép biến đổi tỉ lệ với hệ số (1/sx, 1/sy) và ma trận biến đổi là:
.I.2.3 Kết hợp các phép biến đổi trong không gian hai chiều
Sử dụng tọa độ đồng nhất cho phép ta biểu diễn các phép biến đổi mô hình bằng phép nhân ma trận và tìm ma trận biến đổi khi kết hợp các phép biến đổi với nhau
Trang 20Chứng tỏ: R(θ2).R(θ1)=R(θ1+θ2)
c Kết hợp hai phép tỉ lệ
Tương tự như phép tịnh tiến và phép quay, khi kết hợp hai phép biến đổi tỉ lệ với hệ số là (s1x, s1y) và (s2x, s2y) ta có
d Phép quay quanh một tâm quay bất kì
Trong mục 1.2 ta xét phép quay có tâm là gốc toạ độ, bây giờ ta xét trườnghợp tổng quát khi tâm quay I(xr, yr) không phải là gốc tọa độ như trong hình 3.3 ta kíhiệu phép quay đó là R(xr,yr,θ)
Hình: 4 Phép quay có tâm quay không là gốc tọa độ
Trang 21Ta có thể thực hiện phép quay trên bằng cách áp dụng liên tiếp các phép biếnđổi theo thứ tự sau đây:
(1) Áp dụng phép tịnh tiến T(-xr, -yr) để tịnh tiến tâm quay về gốc toạ độ (2) Áp dụng phép quay R(θ) quay đối tượng quanh gốc toạ độ một góc θ (3) Áp dụng phép tịnh tiến T(xr, yr) để tịnh tiến tâm quay từ gốc toạ độ về vịtrí ban đầu
R(xr,yr,θ)=T(xr, yr).R(θ).T(-xr, -yr)
e Phép đối xứng qua một đường thẳng bất kì
Trong trường hợp tổng quát nếu trục đối xứng là một đường thẳng d bất kì, tathay phép đối xứng bằng cách áp dụng lần lượt các phép biến đổi sau:
(1) Áp dụng phép tịnh tiến đưa đường thẳng d về vị trí d' đi qua gốc toạ độ (2) Áp dụng phép đối xứng qua đường thẳng d'
(3) Áp dụng phép tịnh tiến đưa đường thẳng d' về vị trí đường thẳng d ban đầu
Trường hợp 1: Đường thẳng d có phương trình y=ax+b, giả sử đường thẳng
cắt trục ox tại điểm (x0, y0) như trong hình
Trang 22Theo nhận xét ở trên ta có
Red=T(x0, y0) Red' T(-x0, -y0)
(Red' là phép đối xứng qua một đường thẳng chạy qua gốc toạ độ mà ta đã biết
ở trên)
Trường hợp 2: Đường thẳng d có phương trình y=y0 (d song song với trục
ox), khi đó
Red=T(0, y0) Reox T(0, -y0)
Trường hợp 3: Đường thẳng d có phương trình x=x0 (d song song với trục
oy), khi đó
Red=T(x0, 0) Reoy T(-x0, 0)
.I.3 Các phép biến đổi trong không gian ba chiều
Trong không gian ba chiều ta cũng có các phép biến đổi giống như trong khônggian hai chiều Các phép biến đổi sẽ được minh hoạ qua các ma trận 4x4, toạ độ cácđiểm được biểu diễn theo toạ độ đồng nhất nghĩa là thay cho toạ độ (x, y, z) ta sẽdùng (x, y, z, 1)
.I.3.1 Phép tịnh tiến
Giả sử véc tơ tịnh tiến là (tx, ty, tz) khi đó phương trình phép tịnh tiến như sau (T là ma trận của phép tịnh tiến):
Trang 23Hình: 5 Phép tịnh tiến khối P theo vecto V
.I.3.2 Phép quay
Khi thực hiện phép quay trong không gian ba chiều ta cần phải biết trục quay
và góc quay Chiều của góc quay được xác định theo chiều cùng chiều kim đồng hồ(chiều âm) và ngược chiều kim đồng hồ (chiều dương) khi mắt nhìn dọc theo trụcquay (ta sẽ gọi đó là hướng nhìn) Ví dụ phép quay minh hoạ trên hình 3.6 là phépquay theo chiều dương, trục quay ox và hướng nhìn là theo hướng âm của trục ox
Trang 24Hình: 6 Phép quay chiều dương, trục quay ox, hướng nhìn là hướng âm trục ox
a Phép quay quanh các trục toạ độ
Trước hết ta xét các phép quay một góc θ theo các trục ox, oy, oz khi hướngnhìn là hướng âm của trục đó
Phép quay quanh trục oz: Ta có thể có công thức biến đổi toạ độ bằng cách mởrộng công thức phép quay trong không gian hai chiều
x'= x cosθ- y sinθ
y'= x sinθ+ y cosθ
z'=z
Biểu diễn tương đương dưới dạng ma trận như sau
Phép quay quanh trục ox:
x'= x
y'= y cosθ- z sinθ
z'= y sinθ+ z cosθ
Trang 25Phép quay quanh trục oy:
x'= x cosθ+ z sinθ
y'= y
z'= -x sinθ+ z cosθ
b Phép quay quanh một trục song song với trục toạ độ
Giả sử trục quay song song với trục ox (các trường hợp còn lại tương tự), ta thực hiệnlần lượt các lệnh biến đổi sau:
(1) Áp dụng phép tịnh tiến T để đưa trục quay về trục ox
(2) Áp dụng phép quay R(θ) quay đối tượng quanh trục ox một góc θ
(3) Áp dụng phép tịnh tiến T-1 để đưa trục quay về vị trí ban đầu
c Phép quay quanh một trục bất kì
Giả sử trục quay là một đường thẳng d đi qua hai điểm P1(x1, y1, z1) vàP2(x2, y2, z2) Phép quay R(θ) quanh đường thẳng d một góc θ theo hướng nhìn từđiểm P2 tới P1 Ta thực hiện lần lượt các phép biến đổi sau:
(1) Áp dụng phép tịnh tiến đưa trục quay về vị trí đi qua gốc toạ độ
(2) Áp dụng phép quay đưa trục quay về vị trí trùng với một trục toạ độ
(3) Áp dụng phép quay vật thể quanh trục quay (trục toạ độ)
(4) Áp dụng phép quay đưa trục quay về vị trí tại bước 2
(5) Áp dụng phép quay đưa trục quay về vị trí ban đầu Quá trình được minhhoạ trong hình đưới
Trang 26Hình: 7 Phép quay quanh một trục bất kì
Ta sẽ tìm ma trận biến đổi của từng phép biến đổi theo từng bước
Bước 1: Tịnh tiến đưa điểm P1 về gốc toạ độ bằng cách tịnh tiến theo véc tơ x1, -y1, -z1), đoạn thẳng P1P2 chuyển thành P1'P2' Ma trận phép biến đổi là:
(-Bước 2: Đây là bước phức tạp nhất, đưa trục quay P1'P2' về trùng với một trụctoạ độ, ta sẽ chọn đó là trục oz Để thuận tiện ta sẽ chọn véc tơ đơn vị u thuộc đườngthẳng P1'P2' và có hướng trùng với hướng của véc tơ V=P1'P2' như sau:
Trang 27Mục đích bây giờ ta phải đưa véc tơ u về trục oz bằng cách áp dụng hai phépquay sau:
(1) Quay một góc α quanh trục ox đưa véc tơ u về vị trí véc tơ u'' nằm trên mặtphẳng xz
(2) Quay một góc β quanh trục oy đưa véc tơ u'' vị trí uz thuộc trục oz Quátrình được minh hoạ trong hình
Hình: 8 Ví dụ về phép quay
Độ lớn của góc α chính bằng góc giữa véc tơ u'(0, b, c) (là hình chiếu của véc
tơ u lên mặt phẳng yz) và chiều dương trục oz, như trong hình dưới
Trang 28Theo định nghĩa tích có hướng của hai véc tơ ta có:
u'' x uz=uy.||u''||.||uz|| sinβ Mặt khác u'' x uz=uy.(-a) do đó sinβ=-a
Bước 3: Áp dụng phép quay một góc θ quanh trục oz
Bước 4 và bước 5: Áp dụng các phép biến đổi ngược đưa đường thẳng d về vịtrí ban đầu
Tóm lại ta có phương trình ma trận kết hợp các phép biến đổi như sau:
Trang 29Nếu trục toạ độ là trục đối xứng thì phép đối xứng tương đương với phép quay
1800 quanh trục đó Ví dụ phép đối xứng qua trục ox có ma trận là:
Phép đối xứng qua mặt phẳng xy có ma trận biến đổi là:
Tương tự khi mặt phẳng đối xứng là xz hoặc yz
.I.4 Một ví dụ về phép biến đổi
Về phép biến đổi thực hiện tịnh tiến một điểm P[1,0,0] theo vecto V[1,0,0] rồi xoay
nó quanh trục Oz 90 độ
Trang 30Theo kết quả ở trên ta sẽ thấy việc thực hiện phép biến đổi phải theo đúng thứ
tự rất quan trọng nếu không sẽ cho kết quả hoàn toàn khác nhau
Trang 31.III.1.1 OpenGL có thể làm gì và không thể làm gì?
Cung cấp khả năng xử lý các đối tượng 2 và 3 chiều bao gồm ma trận chuyểnđổi, hiệu ứng ánh sáng, chống răng cưa, sương mù, texture và một số chức năng nângcao đối với việc xử lý pixel Tuy nhiên nó không cung cấp phương tiện ở cấp cao để
mô tả hoặc xây dựng kiểu mẫu cho các đối tượng hình học phức tạp Người dùngmuốn làm điều này phải bắt đầu từ các primitive đơn giản (điểm, đoạn, đa giác)
Đôi khi, các lệnh của OpenGL chỉ cho phép ta mô tả sự mong muốn đối vớiviệc các đối tượng xuất hiện như thế nào nhưng không chắc kết quả sẽ chính xác nhưvậy
.III.1.2 Các tác vụ OpenGL
Để yêu cầu OpenGL thực hiện một tác vụ nào đó, chúng ta gọi các hàm Cáchàm sẽ được xử lý đúng theo trình tự gọi và đôi khi có một khoảng thời gian trì trệtrước khi chúng được xử lý Điều này là do một primitive phải được vẽ hoàn tất trướckhi thực hiện tiếp các lệnh gọi sau đó
.III.1.3 Hoạt động của OpenGL
Cơ chế hoạt động của OpenGL là cơ chế ống dẫn (đầu ra giai đoạn trước là đầuvào giai đoạn sau)
Hình: 9 Cơ chế hoạt động đường ống của OpenGL
• Display list Là nơi lưu lại một số lệnh để xử lý sau.
Trang 32đánh giá các đa thức của dữ liệu đưa vào.
• Per-vertex operations and primitive assembly xử lý các primitive
(điểm, đoạn, đa giác) được mô tả bởi các vertex Các vertex sẽ được xử
lý và các primitive được cắt xén vào viewport để chuẩn bị cho khâu kếtiếp
• Rasterization sinh ra một loạt các địa chỉ framebuffer và các giá trị liên
quan bằng cách sử dụng mô tả 2 chiều của điểm, đoạn, đa giác Mỗiphần tử (fragment ) được sinh ra sẽ đưa vào giai đoạn kế
• Per-fragment operations Các tác vụ sau cùng (cập nhật có điều kiện
cho framebuffer dựa vào dữ liệu vào và dữ liệu được lưu trữ trước đócủa giá trị z (đối với z buffering), thực hiện trộn màu cho các pixel vàlàm một số thao tác khác) sẽ được thực hiện trên dữ liệu trước khi nóđược chuyển thành pixel và đưa vào framebuffer
Trường hợp dữ liệu vào ở dạng pixel không phải vertex, nó sẽ được đưa thẳngvào giai đoạn xử lý pixel Sau giai đoạn này, dữ liệu ở dạng pixel sẽ được lưu trữ vàotexture memory để đưa vào giai đoạn Per-fragment operation hoặc được đưa vàoRasterization như dữ liệu dạng vertex
.III.1.4 Mô hình hoạt động
Mô hình diễn dịch các lệnh của OpenGL là mô hình Client/Server Code trongchương trình (client) sẽ đưa ra mệnh lệnh Các mệnh lệnh này sẽ được diễn dịch vàthực thi bởi OpenGL (server) Server có thể không ở chung một máy với client (liênlạc thông qua network) Một server có thể quản lý nhiều ngữ cảnh (context)(tương tựdll), mỗi ngữ cảnh là một trạng thái gói gọn của OpenGL Client có thể nối kết vàomột trong bất kỳ các ngữ cảnh này Giao thức (protocol) yêu cầu có thể là bất cứ giaothức nào sẵn có hoặc sử dụng một giao thức riêng Không có lệnh OpenGL nào đượccung cấp để nhận dữ liệu của người dùng (user input)
Trang 33Hệ thống điều hành nào cấp phát (allocate) tài nguyên framebuffer sẽ là hệthống cuối cùng điều khiển các hiệu quả tác dụng của các lệnh OpenGL lênframebuffer đĩ:
• Quyết định phần nào của framebuffer mà OpenGL cĩ thể truy xuất tại mộtthời điểm
• Truyền đạt đến OpenGL cấu trúc của caÙc phần đĩ
Khơng cĩ lệnh OpenGL nào cấu hình framebuffer hoặc khởi động OpenGLcũng như quản lý thiết bị hiển thị (việc này do graphic driver làm) OpenGL đượckhởi động khi hệ thống window cấp phát một cửa sổ cho việc thể hiện OpenGL(OpenGL rendering)
Các mode hoạt động
• Rendering: là mode bình thường, mặc định mà trong đĩ các fragment
được tạo ra bởi quá trình rasterization
• Selection: Người lập trình cĩ thể chọn lựa các primitive để vẽ vào một
vùng nào đĩ của cửa sổ
• Feedback: thơng tin về các primitive sắp được raster sẽ được gửi trả về
cho trình ứng dụng
Trong Selection mode và Feedback mode, khơng cĩ fragment nào được tạo ra,
do đĩ khơng cĩ xự sửa đổi nào xảy ra đối với frambuffer
Ba mode trên là loại trừ lẫn nhau
Các mode được chọn lựa thơng qua việc gọi hàm
.III.1.5 Yêu cầu hệ thống cho việc dùng OpenGL
Trang 34Hệ điều hành: Windows 9x, Windows 2k, Windows NT, XP,…
Khi lập trình (Microsoft VC++) cần có 1 số file: opengl32.dll, opengl32.lib,glu32.dll, glu32.lib, glaux.lib,glu.h, gl.h, glaux.h
.III.1.6 Một số thuật ngữ
Vertex: là một cấu trúc diễn tả cho khái niệm điểm (point) trong không gian 3chiều Có thể thuần túy là điểm, hoặc là đầu của một đoạn thẳng, hoặc là nơi giaonhau của 2 đường thẳng
Pixel: là một khái niệm diễn tả cho đơn vị điểm xuất hiện trên thiết bị đồ họa
(màn hình, giấy in)
Line: xác định bởi 2 Vertex
Triangle: Tập hợp 3 vertex
Primitive: Là 1 đối tượng không gian 3 chiều được định nghĩa bởi một nhóm
các vertex (có thể là điểm, đoạn thẳng, tam giác hoặc đa giác) Trong OpenGLES,primitive giới hạn ở điểm, đoạn thẳng và tam giác
Hình: 10 Ví dụ về các đối tượng hình học
Trang 35Trong OpenGL hỗ trợ 10 kiểu primitive khác nhau, để có thể xây dựng 1 giaodiện lập trình đồ họa nhẹ, thích hợp với các hệ thống nhúng.
GL_TRIANGLE_STRIP Một dải tam giác được liên kết với nhau
GL_TRIANGLE_FAN Các tam giác liên kết theo hình quạt
Framebuffer: Một cụm gồm mọi buffer của một cửa sổ hoặc ngữ cảnh Đôi
khi bao gồm tất cả bộ nhớ pixel của phần cứng đồ họa
Bitplane: Vùng nhớ chứa 1 bit dữ liệu về pixel (nếu có 8 bitplane lưu trữ các
giá trị về màu sắc thì ta có 256 màu có thể)
Fragment: Dữ liệu đồ họa sinh ra bởi quá trình rasterization các primitive.
Mỗi fragment liên hệ với 1 pixel và bao gồm thông tin về màu sắc, chiều sâu và đôikhi cả giá trị tọa độ texture, nhưng nó chưa được ghi vào các buffer mà còn trải quamột số quá trình khác
Texture: Là một mảng 1 hoặc 2 chiều lưu các giá trị màu (như bitmap).
Texel: Một phần tử của texture.
Raster: chỉ các tác vụ xử lý đối với các GDI primitive chẳng hạn chọn pen,
brush, shape
Rasterization : Sự chuyển đổi các vector graphic (cấu trúc được mô tả thông
qua các mô hình toán chẳng hạn như điểm, đoạn thẳng) thành một hình ảnh biểu hiệnbằng các pixel có thể lưu trữ và xử lý như là chuỗi các bit
Trang 36về một đối tượng hình học được xây dựng một cách trừu tượng thì dùng vertex, cònkhi nói về một image thì ta dùng pixel)
.IV Các phép biến đổi trong Opengl
.IV.1.1 Tổng quan
Vì OpenGL xây dựng vật thể trên mô hình không gian 3 chiều nên các phépbiến đổi sẽ được thực hiện thông qua việc thực hiện các phép toán trên ma trận Quátrình thực hiện biến đổi sẽ diễn ra như sau: Sau khi ta khai báo vật thể thông qua cácvertex, ta đã có được các điểm trong không gian 3 chiều với tọa độ dưới dạng vector
4 phần tử Để thực hiện di chuyển, quay, phối cảnh, ta cần áp vào các thông số nhưgóc quay, độ di dời, tương ứng với thay đổi muốn thực hiện OpenGL sẽ dùng cácthông số biến đổi mà ta nhập vào (được lưu trữ dưới dạng ma trận 4x4) và thực hiệncác phép toán biến đổi trên các vector nhập vào Kết quả là tọa độ các vertex màchúng ta đã nhập sẽ thay đổi tương ứng
Tại sao là ma trận 4x4 mà không là số khác? Đây là vấn đề toán học; ta cầnbiến đổi vector 4 phần tử nên cần ma trận 4x4 Và lý do dùng vector 4 phần tử là vìOpenGL cần đơn giản các thủ tục tính toán mà việc này chỉ có thể thực hiện vớivector 4 phần tử (hệ tọa độ đồng nhất)
Ghi chú: OpenGL có 3 ma trận 4x4 (tương ứng cho các phép biến đổiViewing-Modeling, Projection, Texture) có vai trò như các bộ đệm để khi chúng ta ápcác phép biến đổi vào, các ma trận này sẽ được biến đổi tương ứng Khi đó tọa độ cácvertex nhập vào sẽ được tính toán, biến đổi dựa vào các ma trận này Do đó, khi cần
vẽ mới (không bị ảnh hưởng bởi các phép biến đổi cũ), ta cần đưa các ma trận này trởvềma trận đơn vị
Để chọn ma trận nào sẽ được thay đổi (muốn thực hiện phép biến đổi nào), tadùng hàm
Void glMatrixMode(GLenum mode);
Trang 37Mode có thể là:
GL_MODELVIEW Các phép toán ma trận sau đó sẽ tác động
lên ma trận modelview GL_PROJECTION Các phép toán ma trận sau đó sẽ tác động
lên ma trận projection GL_TEXTURE Các phép toán ma trận sau đó sẽ tác động
lên ma trận texture
Sau khi gọi hàm này và đưa tham số tương ứng, ma trận được chọn sẽ trởthành ma trận biến đổi hiện hành và mọi hàm biến đổi tương ứng sẽ tác động lên matrận đó
Để đưa một ma trận biến đổi hiện hành về ma trận đơn vị, dùng hàm:
Do Viewing và Modeling có liên quan tương đối với nhau nên trong OpenGLchúng được gom vào một ma trận biến đổi (chỉ dành cho vật thể) Mặc định ban đầu
là điểm nhìn và vật thể ở chung một chỗ tại gốc hệ trục tọa độ và phương nhìn theohướng âm của trục z (hướng vào bean trong màn hình)
Trang 38(di chuyển), glRotate*() (quay), glScale*() (dùng để kéo dãn hoặc co nhỏ vật thể).Các hàm này tác động lên tọa độ vật thể.
Hình: 11 Mô tả cho vật thể trong không gian 3 chiều
.IV.1.2 Phép tịnh tiến - Translate
void glTranslate{fd} (TYPE x, TYPE y, TYPE z): dời vật thể đi một đoạn x,
y, và z theo phương các trục tọa độ tương ứng
Ví dụ: glRatated(45,0,0,1);
Trang 39Hình: 12 Phép tịnh tiến vật thể
.IV.1.3 Phép xoay – Rotate
void glRotate{fd}(TYPE angle, TYPE x, TYPE y, TYPE z): quay vật thể 1
góc angle độ theo chiều ngược chiều kim đồng hồ quanh trục có vector chỉ phươngxác định từ gốc trục toạ độ (0,0,0) và điểm (x,y,z)
Ví dụ: glRatated(45,0,0,1);
Trang 40.IV.1.4 Phép kéo dãn - Scale
void glScale{fd}(TYPEx, TYPE y, TYPEz): co dãn vật thể theo các phương
Ox, Oy, Oz một lượng tương ứng Nếu x hoặc y hoặc z âm thì vật thể sẽ bị lật lại đốixứng theo trục có độ giãn âm
Ví dụ: glScalef(2.0,-0.5,1.0);
Hình: 14 Phép kéo dãn vật thể
.IV.1.5 Thứ tự các phép biến đổi
Vì các phép biến đổi thực chất là nhân các ma trận với nhau nên thứ tự là quantrọng
GlLoadIdentity() //transform ma trận hiện hành về ma trận đơn vị