DoAnTN_OPENGL

71
 GVHD : Ths. Trnh ThVân Anh SVTH : Đỗ Duy  Lớ p : D07CNPM1 HC VI N CÔNG NGH BƢU CHÍNH VIN THÔNG KHOA CÔNG NGHTHÔNG TIN ĐỒ ÁN TT NGHIP ĐẠI HC Đề tài : NGHIÊN CỨ U OPENGL VÀ XÂY DỰ NG Ứ NG DNG MÔ PHNG Ging viên hƣớ ng dn : Ths. TRNH THVÂN ANH Sinh viên thự c hin : ĐỖ DUY Lớ p : D07CNPM1 Khóa : 2007  2012 H: CHÍNH QUY Hà Ni, tháng 12 /2011

Transcript of DoAnTN_OPENGL

Page 1: DoAnTN_OPENGL

5/17/2018 DoAnTN_OPENGL - slidepdf.com

http://slidepdf.com/reader/full/doantnopengl 1/71

 

 

GVHD : Ths. Trịnh Thị Vân Anh SVTH : Đỗ Duy – Lớ p : D07CNPM1

HỌC VIỆN CÔNG NGHỆ BƢU CHÍNH VIỄN THÔNG

KHOA CÔNG NGHỆ THÔNG TIN

ĐỒ ÁN

TỐT NGHIỆP ĐẠI HỌC

Đề tài : “NGHIÊN CỨ U OPENGL VÀ XÂY DỰ NGỨ NG DỤNG MÔ PHỎNG” 

Giảng viên hƣớ ng dẫn : Ths. TRỊNH THỊ VÂN ANH

Sinh viên thự c hiện : ĐỖ DUY

Lớ p : D07CNPM1

Khóa : 2007 – 2012

Hệ : CHÍNH QUY

Hà Nộ

i, tháng 12 /2011

Page 2: DoAnTN_OPENGL

5/17/2018 DoAnTN_OPENGL - slidepdf.com

http://slidepdf.com/reader/full/doantnopengl 2/71

 

 

GVHD : Ths. Trịnh Thị Vân Anh SVTH : Đỗ Duy – Lớ p : D07CNPM1

HỌC VIỆN CÔNG NGHỆ BƢU CHÍNH VIỄN THÔNG

KHOA CÔNG NGHỆ THÔNG TIN

ĐỒ ÁN

TỐT NGHIỆP ĐẠI HỌC

Đề tài : “NGHIÊN CỨ U OPENGL VÀ XÂYDỰ NG Ứ NG DỤNG MÔ PHỎNG” 

Giảng viên hƣớ ng dẫn : Ths. TRỊNH THỊ VÂN ANH

Sinh viên thự c hiện : ĐỖ DUY

Lớ p : D07CNPM1

Khóa : 2007 – 2012

Hệ : CHÍNH QUY

Hà Nội, tháng 12 /2011

Page 3: DoAnTN_OPENGL

5/17/2018 DoAnTN_OPENGL - slidepdf.com

http://slidepdf.com/reader/full/doantnopengl 3/71

 

 

GVHD : Ths. Trịnh Thị Vân Anh SVTH : Đỗ Duy – Lớ p : D07CNPM1

NHẬN XÉT CỦA GIÁO VIÊN HƢỚ NG DẪN

………………………………………………………………………………………………

……………………………………………………………………………………………………………………………………………………………………………………………… 

……………………………………………………………………………………………… 

……………………………………………………………………………………………… 

……………………………………………………………………………………………… 

……………………………………………………………………………………………… 

……………………………………………………………………………………………… 

……………………………………………………………………………………………… 

……………………………………………………………………………………………… 

……………………………………………………………………………………………… 

……………………………………………………………………………………………… 

……………………………………………………………………………………………… 

……………………………………………………………………………………………… 

……………………………………………………………………………………………… 

……………………………………………………………………………………………… 

……………………………………………………………………………………………… 

……………………………………………………………………………………………… ……………………………………………………………………………………………… 

……………………………………………………………………………………………… 

……………………………………………………………………………………………… 

……………………………………………………………………………………………… 

……………………………………………………………………………………………… 

……………………………………………………………………………………………… 

……………………………………………………………………………………………… 

……………………………………………………………………………………………… ……………………………………………………………………………………………… 

Điểm: …………………….…………………..…(bằng chữ: …..…………………..….) 

Đồng ý/Không đồng ý cho sinh viên bảo vệ trƣớ c hội đồng chấm đồ án tốt nghiệp? 

…………, ngày tháng năm 2011

GIẢNG VIÊN HƢỚ NG DẪN

(ký, họ tên) 

Page 4: DoAnTN_OPENGL

5/17/2018 DoAnTN_OPENGL - slidepdf.com

http://slidepdf.com/reader/full/doantnopengl 4/71

 

 

GVHD : Ths. Trịnh Thị Vân Anh SVTH : Đỗ Duy – Lớ p : D07CNPM1

NHẬN XÉT CỦA GIÁO VIÊN PHẢN BIỆN

……………………………………………………………………………………………… 

……………………………………………………………………………………………… 

……………………………………………………………………………………………… ……………………………………………………………………………………………… 

……………………………………………………………………………………………… 

……………………………………………………………………………………………… 

……………………………………………………………………………………………… 

……………………………………………………………………………………………… 

……………………………………………………………………………………………… 

……………………………………………………………………………………………… 

……………………………………………………………………………………………… ……………………………………………………………………………………………… 

……………………………………………………………………………………………… 

……………………………………………………………………………………………… 

……………………………………………………………………………………………… 

……………………………………………………………………………………………… 

……………………………………………………………………………………………… 

……………………………………………………………………………………………… 

……………………………………………………………………………………………… ……………………………………………………………………………………………… 

……………………………………………………………………………………………… 

……………………………………………………………………………………………… 

……………………………………………………………………………………………… 

……………………………………………………………………………………………… 

……………………………………………………………………………………………… 

……………………………………………………………………………………………… 

……………………………………………………………………………………………… Điểm: …………………….……….………… ..(bằng chữ: …..…………………….….) 

Đồng ý/Không đồng ý cho sinh viên bảo vệ trƣớ c hội đồng chấm đồ án tốt nghiệp? 

…………, ngày tháng năm 2011

GIẢNG VIÊN PHẢN BIỆN

(ký, họ tên) 

Page 5: DoAnTN_OPENGL

5/17/2018 DoAnTN_OPENGL - slidepdf.com

http://slidepdf.com/reader/full/doantnopengl 5/71

 

 

GVHD : Ths. Trịnh Thị Vân Anh SVTH : Đỗ Duy – Lớ p : D07CNPM1

MỤC LỤC

MỞ ĐẦU ....................................................................................................................... 10 PHẦN 1 : CƠ SỞ LÝ THUYẾT –  THƢ VIỆN ĐỒ HỌA OPENGL ............................. 1 CHƢƠNG 1: KHÁI NIỆM CHUNG .............................................................................. 1 

1.1.Giớ i thiệu OpenGL ................................................................................................ 1 1.2.Hệ tọa độ 2D .......................................................................................................... 2 1.3. Hệ tọa độ 3D và phƣơng pháp thể hiện hình 3D .................................................. 3 

CHƢƠNG 2 : VẼ HÌNH ................................................................................................. 4 2.1. Cấu trúc lệnh OpenGL và các kiểu dữ liệu trong OpenGL .................................. 4 2.2. Chƣơng trình OpenGL tối thiểu ........................................................................... 5 2.3. Vẽ hình ................................................................................................................. 7 

2.3.1. Vẽ điểm ......................................................................................................... 8 2.3.2. Vẽ đƣờ ng ..................................................................................................... 10 2.3.3. Vẽ đa giác lồi ............................................................................................... 12 2.3.5. Vẽ tam giác .................................................................................................. 14 2.3.6. Vẽ tứ giác..................................................................................................... 15 2.3.7. Vẽ đƣờ ng gấp khúc không khép kín ............................................................ 16

 2.3.8. Vẽ đƣờ ng gấp khúc khép kín ....................................................................... 17 2.3.9. Vẽ dải tam giác ............................................................................................ 17 2.3.10. Vẽ các tam giác liên kết theo hình quạt..................................................... 18 2.3.11. Vẽ 1 dải tứ giác liên kết vớ i nhau .............................................................. 19 

2.4. Màu sắc ............................................................................................................... 20 2.4.1. Chế độ màu RGBA ...................................................................................... 20 2.4.2. Thiết lập mô hình shading ........................................................................... 21 

CHƢƠNG 3 : CÁC PHÉP BIẾN ĐỔI 3D .................................................................... 26 3.1. Quá trình chuyển đổi tọa từ không gian 3D đến pixel trên màn hình ................ 26 3.2. Thao tác trên ModelView ................................................................................... 26 

3.2.1. Một số hàm biến đổi .................................................................................... 26 3.2.2. Thiết lập view .............................................................................................. 27 

3.3. Thao tác trên Projection ...................................................................................... 27 3.3.1. Phép chiếu phối cảnh (Prespective Projection) ........................................... 27 

Page 6: DoAnTN_OPENGL

5/17/2018 DoAnTN_OPENGL - slidepdf.com

http://slidepdf.com/reader/full/doantnopengl 6/71

 

 

GVHD : Ths. Trịnh Thị Vân Anh SVTH : Đỗ Duy – Lớ p : D07CNPM1

3.3.2. Phép chiếu trực giao .................................................................................... 28 3.4. Phép biến đổi cổng nhìn (viewport transformation) ........................................... 29 

CHƢƠNG 4 : ÁNH SÁNG ........................................................................................... 30 4.1. Các loại nguồn sáng ............................................................................................ 30 4.2. Thiết lập các mảng giá trị ánh sáng .................................................................... 30 4.3. Chuyển mảng cho OpenGL ................................................................................ 31 4.4. Kích hoạt nguồn sáng ......................................................................................... 31 4.5. Định nghĩa tính chất vật liệu .............................................................................. 32 

4.5.1. Màu và ánh sáng .......................................................................................... 32 4.5.2. Thiết lập các mảng giá trị vật liệu ............................................................... 32 4.5.3. Chuyển mảng vật liệu cho OpenGL ............................................................ 33 

CHƢƠNG 5 : TẠO CẢNH 3D ..................................................................................... 35 5.1. Sử dụng các phép biến hình OpenGL để tạo cảnh 3D ....................................... 35 

5.1.1. Gốc tọa độ cục bộ và đôc tọa độ thế giớ i .................................................... 35 5.1.2. Phép tịnh tiến ............................................................................................... 35 5.1.3. Phép quay .................................................................................................... 36 

5.2. Sử dụng các Stack ma trận ................................................................................. 36 5.3. Bộ đệm đôi.......................................................................................................... 39 

CHƢƠNG 6 : ẢNH VÀ CÁC HIỆU Ứ NG CHỈ ẢNH ................................................. 40 6.1. Thiết lập việc gán cấu trúc .................................................................................. 40 6.2. Định nghĩa các vertex và cấu trúc của chúng ..................................................... 41 

PHẦN 2 : XÂY DỰ NG Ứ NG DỤNG MÔ PHỎNG .................................................... 43 CHƢƠNG 1 : GIỚI THIỆU BÀI TOÁN ...................................................................... 43 

1.1. Giớ i thiệu ............................................................................................................ 43 1.2. Khái quát về ứng dụng ....................................................................................... 43 1.3. Phân tích ............................................................................................................. 43 

1.3.1. Các thành phần cơ bản trong trò chơi.......................................................... 43 1.3.2. Cấu trúc của trò chơi. .................................................................................. 44 

1.3.2.1. Vòng lặp trò chơi. ................................................................................. 44 1.3.2.2. Cấu trúc trò chơi. .................................................................................. 44 

CHƢƠNG 2 : THIẾT KẾ CHƢƠNG TRÌNH .............................................................. 46 2.1. Nội dung và các chức năng chính của trò chơi................................................... 46 

Page 7: DoAnTN_OPENGL

5/17/2018 DoAnTN_OPENGL - slidepdf.com

http://slidepdf.com/reader/full/doantnopengl 7/71

 

 

GVHD : Ths. Trịnh Thị Vân Anh SVTH : Đỗ Duy – Lớ p : D07CNPM1

2.1.1. Nội dung ...................................................................................................... 46 2.1.2. Các chức năng chính của trò chơi ............................................................... 46 

2.2. Đồ họa trong game ............................................................................................. 47 2.3. Va chạm và xử lý va chạm ................................................................................. 49 2.4. Âm thanh và hình ảnh sử dụng trong game ........................................................ 51 

2.4.1. Âm thanh ..................................................................................................... 51 2.4.2. Hình ảnh sử dụng trong game ..................................................................... 51 

2.5. Xây dựng các class ............................................................................................. 51 2.6. Quan hệ giữa các lớ p .......................................................................................... 54 

CHƢƠNG 3 : CÀI ĐẶT CHƢƠNG TRÌNH ................................................................ 55 3.1. Môi trƣờ ng lập trình ........................................................................................... 55 3.2. Cài đặt thƣ viện lập trình .................................................................................... 55 3.3. Xây dựng các tập tin âm thanh và hình ảnh ....................................................... 55 3.4. Mô tả giao diện trò chơi ..................................................................................... 55 

KẾT LUẬN ................................................................................................................... 60 DANH MỤC TÀI LIỆU THAM KHẢO ...................................................................... 61 

Page 8: DoAnTN_OPENGL

5/17/2018 DoAnTN_OPENGL - slidepdf.com

http://slidepdf.com/reader/full/doantnopengl 8/71

 

 

GVHD : Ths. Trịnh Thị Vân Anh SVTH : Đỗ Duy – Lớ p : D07CNPM1

DANH MỤC BẢNG

Bảng 1 : Các tiền tố OpenGL .......................................................................................... 4 Bảng 2 : Các hậu tố OpenGL. ......................................................................................... 5

 Bảng 3 : Các kiểu dữ liệu trong OpenGL. ....................................................................... 5 Bảng 4 : Giá trị các tham số  định nghĩa hình vẽ của glBegin(tham số ) .......................... 7 Bảng 5 : Chuyển đổi các tham số trong bảng màu ........................................................ 21 Bảng 6 : Quy tắc lấy màu vẽ cho hình........................................................................... 24 Bảng 7 : Đối số thứ hai của nguồn sáng. ....................................................................... 31 Bảng 8 : Đối số thứ hai để chuyển mảng vật liệu cho OpenGL .................................... 33 

DANH MỤC HÌNH

Hình 1. Hệ tọa độ 2D ....................................................................................................... 2 Hình 2. Hệ tọa độ 3D ....................................................................................................... 3 Hình 3. Ví dụ một chƣơng trình OpenGL. ...................................................................... 7 Hình 4. Các đối tƣợ ng hình học cơ bản. ......................................................................... 8 Hình 5. Vẽ điểm............................................................................................................... 9 Hình 6. Vẽ điểm vớ i glPointSize(). ............................................................................... 10 Hình 7. Vẽ đƣờ ng. ......................................................................................................... 10 Hình 8. Vẽ đƣờ ng vớ i glLineWidth(). ........................................................................... 11 Hình 9. Vẽ đƣờ ng vớ i glLineStipple(). ......................................................................... 12 Hình 10. Vẽ polygon. .................................................................................................... 13 Hình 11. Vẽ polygon vớ i chế độ GL_LINE .................................................................. 14 Hình 12. Vẽ polygon vớ i chế độ GL_POINT ............................................................... 14 Hình 13. Vẽ tam giác. .................................................................................................... 15 Hình 14. Vẽ tứ giác ........................................................................................................ 16 Hình 15. Vẽ đƣờ ng gấp khúc không khép kín. ............................................................. 16 Hình 16. Vẽ đƣờ ng gấp khúc khép kín. ......................................................................... 17 Hình 17. Vẽ dải tam giác liên kết. ................................................................................. 18 Hình 18. Vẽ dải tam giác liên kết theo hình quạt .......................................................... 19 Hình 19. Vẽ dải tứ giác liên kết ..................................................................................... 20 Hình 20. Chế độ màu RGB trên mỗi pixel .................................................................... 20 Hình 21. Vẽ hình vớ i chế độ SMOOTH ........................................................................ 22 Hình 22. Vẽ hình vớ i chế độ màu FLAT ....................................................................... 23 

Page 9: DoAnTN_OPENGL

5/17/2018 DoAnTN_OPENGL - slidepdf.com

http://slidepdf.com/reader/full/doantnopengl 9/71

 

 

GVHD : Ths. Trịnh Thị Vân Anh SVTH : Đỗ Duy – Lớ p : D07CNPM1

Hình 23. Lấy màu vẽ cho dải tứ giác liên kết. ............................................................... 25 Hình 24. Viewing volume đƣợc định nghĩa bở i glFlustum(). ....................................... 27 Hình 25. Viewing volume đƣợc định nghĩa bở i gluPerspective(). ................................ 28 Hình 26. Viewing volume đƣợc định nghĩa bở i glOrtho(). ........................................... 29 Hình 27. Một ví dụ Lighting. ......................................................................................... 34 Hình 28. Tạo cảnh 3D vớ i glTranslatef, glRotatef, glPushMatrix, glPopMatrix .......... 38 Hình 29. Biểu diễn vòng lặp trò chơi ............................................................................ 44 Hình 30. Giao diện của trò chơi ................................................................................... 45 Hình 31. Quan hệ giữa các lớ p ...................................................................................... 54 Hình 32. Load game ...................................................................................................... 56 Hình 33. Menu game ..................................................................................................... 56 Hình 34. Highscore ........................................................................................................ 57 Hình 35. Game infor ...................................................................................................... 57 Hình 36. Thông tin ngƣời chơi ...................................................................................... 58 Hình 37. Giao diện game ............................................................................................... 58 Hình 38. Game Over. ..................................................................................................... 59 

Page 10: DoAnTN_OPENGL

5/17/2018 DoAnTN_OPENGL - slidepdf.com

http://slidepdf.com/reader/full/doantnopengl 10/71

 

 

GVHD : Ths. Trịnh Thị Vân Anh SVTH : Đỗ Duy – Lớ p : D07CNPM1

MỞ  ĐẦU

Cùng vớ i sự phát triển của công nghệ thông tin, đồ họa máy tính cũng có những bƣớ c tiến nhất định, và ngày càng đƣợ c sử dụng rộng rãi trong các lĩnh vực của cuộc

sống nhƣ giải trí, quảng cáo, nghệ thuật… Mỗi l ĩ nh vực khi có sự góp mặt của đồ họađều trở lên sinh động và lôi cuốn hơn. Chính vì vậy việc nghiên cứu phát triển đồ họangày càng đƣợ c quan tâm và phát triển.

Do đó để hiểu đƣợ c phần nào về thế giới đồ họa đồ án này sẽ trình bày nhữngphần cơ bản của thƣ viện đồ họa OpenGL, một thƣ viện đồ họa mạnh mẽ dùng trongnhiều ứng dụng giải trí yêu cầu độ phức tạp cao. Tuy nhiên, do kiến thức chuyên môncòn chƣa đầy đủ nên đồ án sẽ có nhiều thiếu sót và mong đƣợ c sự đóng góp của thầycô, bạn bè để đồ án đƣợ c hoàn thiện hơn, 

Lờ i cuối, em xin bày tỏ lờ i cảm ơn tớ i tất cả thầy, cô đã chỉ dạy và bạn bè đã

giúp đỡ  trong thờ i gian theo học tại trƣờng. Đặc biệt em xin chân thành cảm ơn côgiáo Ths. Trịnh Thị Vân Anh đã nhiệt tình hƣớ ng dẫn để em hoàn thành đồ án này.

Sinh viên

Đỗ Duy.

Page 11: DoAnTN_OPENGL

5/17/2018 DoAnTN_OPENGL - slidepdf.com

http://slidepdf.com/reader/full/doantnopengl 11/71

 

Phần 1 : Cơ sở lý thuyết –  Thƣ viện đồ họa OPENGL Trang 1

GVHD : Ths. Trịnh Thị Vân Anh SVTH : Đỗ Duy – Lớ p : D07CNPM1

PHẦN 1 : CƠ SỞ LÝ THUYẾT –  THƢ VIỆN ĐỒ HỌA OPENGL

CHƢƠNG 1: KHÁI NIỆM CHUNG1.1.Giớ i thiệu OpenGL

OpenGL (Open Graphics Library) : một tiêu chuẩn kỹ thuật đồ họa có mụcđích tạo ra một giao diện lập trình ứng dụng (API) đồ họa ba chiều. OpenGL cũng cóthế dùng trong các ứng dụng đồ họa hai chiều. Giao diện lập trình này chứa khoảng250 hàm để vẽ các cảnh phức tạp từ những hàm đơn giản. Nó đƣợ c dùng rộng rãi trongcác trò chơi điện tử (Half  – Life, Warcraft 3...). Ngoài ra nó còn dùng trong các ứngdụng CAD, thực tế ảo, mô phỏng khoa học, mô phỏng thông tin, phát triển trò chơi.OpenGL còn có một đối thủ cạnh trạn là DirectX của Microsoft.

OpenGL đƣợ c thiết kế nhằm thỏa mãn mục đích chính sau: 

  Che dấu sự tuơng tác phức tạp với các bộ máy xúc tiến ba chiều bằngcách đƣa ra một giao diện lập trình thống nhất. 

  Che dấu các sự khác biệt giữa các phần cứng ba chiều bằng cách bắt buộc các phần cứng tƣơng thích OpenGL phải hỗ trợ tất cả các chứcnăng của giao diện OpenGL. Nếu cần, các chức năng chƣa đƣợc hỗ trợ đầy đủ bởi phần cứng có thể đƣợc hỗ trợ bằng phần mềm. 

Các thao tác OpenGL cơ bản là nhận các nguyên hàm hình học nhƣ điểm,đƣờng thẳng và đa giác rồi chuyển thành các điểm đồ họa ( pixel) trên màn hình. Điềunày đƣợc thực hiện bởi luồng ống dẫn đồ họa (graphics pipeline). Nó còn đƣợc gọi là

 bộ máy trạng thái OpenGL. Đa số các lệnh OpenGL đƣợc dùng để tạo ra các hình họccơ bản đã gặp ở trên hoặc là qui định cách chuyển đổi hình học trong bộ máy trạngthái OpenGL.

Trƣớc khi OpenGL 2.0 ra đời, mỗi giai đoạn trong luồng ống dẫn đồ họa thihành một nhiệm vụ nhất định, khó có thể thay đổi đƣợc. Từ phiên bản OpenGL 2.0,một số giai đoạn đó có thể sửa đổi bằng cách dùng ngôn ngữ chuyển màu GLSL. 

Những thứ OpenGL không hỗ trợ :

  Bản thân OpenGL không có sẵn các hàm nhập xuất hay thao tác trênwindow.

  OpenGL không có sẵn các hàm cấp cao để xây dựng các mô hình đốitƣợng, thay vào đó, ngƣờ i dùng phải tự xây dựng từ các thành phần hìnhhọc cơ bản ( điểm, đoạn thẳng, đa giác).

Rất may là một số  thƣ viện cung cấp sẵn một số hàm cấp cao đƣợ c xây dựngnên từ OpenGL. GLUT (OpenGL Utility Toolkit) là một trong số đó và đƣợ c sử dụngrộng rãi. Nó có nhiều hàm hỗ trợ   nhƣ quản lý window, display callback, nhập xuất(bàn phím, chuột…), vẽ một đối tƣợ ng 3D phức tạp (mặt cầu, khối hộp…). Trong tàiliệu này, chúng ta sẽ sử dụng chủ yếu là thƣ viện GLUT.

Những thứ OpenGL hỗ trợ  là các hàm đồ họa :

Page 12: DoAnTN_OPENGL

5/17/2018 DoAnTN_OPENGL - slidepdf.com

http://slidepdf.com/reader/full/doantnopengl 12/71

 

Phần 1 : Cơ sở lý thuyết –  Thƣ viện đồ họa OPENGL Trang 2

GVHD : Ths. Trịnh Thị Vân Anh SVTH : Đỗ Duy – Lớ p : D07CNPM1

  Xây dựng các đối tƣợ ng phức tạp từ các thành phần hình học cơ bản(điểm, đoạn, đa giác, ảnh, bitmap).

  Sắp xếp đối tƣợ ng trong 3D và chọn điểm thuận lợi để quan sát.

  Tính toán màu sắc của các đối tƣợ ng (màu sắc của đối tƣợng đƣợ c quyđịnh bởi điều kiện chiếu sáng, texture của đối tƣợng, mô hình đƣợ c xâydựng hoặc là kết hợ p của cả ba yếu tố đó).

  Biến đổi những mô tả toán học của đối tƣợ ng và thông tin màu sắc thànhcác pixel trên màn hình (quá trình này đƣợ c gọi là resterization).

1.2.Hệ tọa độ 2D

Định nghĩa bở i hai trục tọa độ Ox, Oy (hệ tọa độ phẳng). Một vertex trên hệ tọađộ có dạng P(Px, Py) và một hình phẳng thì đƣợc xác định bằng tập các vertex nối vớ inhau.

Hình 1. Hệ tọa độ 2D

  Các phép biến hình trong hệ tọa độ 2D :

  Phép tịnh tiến (tịnh tiến một hình theo trục Ox hoặc Oy bằng cách cộng

trừ các vertex vớ i một giá trị nào đó)   Phép co giãn : Để co giãn một hình ta sẽ nhân các vertex của nó vớ i một

hệ số co giãn nào đó 

  Phép quay : Thực hiện quay hình quanh gốc tọa độ một góc alpha nào đó 

Page 13: DoAnTN_OPENGL

5/17/2018 DoAnTN_OPENGL - slidepdf.com

http://slidepdf.com/reader/full/doantnopengl 13/71

 

Phần 1 : Cơ sở lý thuyết –  Thƣ viện đồ họa OPENGL Trang 3

GVHD : Ths. Trịnh Thị Vân Anh SVTH : Đỗ Duy – Lớ p : D07CNPM1

1.3. Hệ tọa độ 3D và phƣơng pháp thể hiện hình 3D

Đƣợc định nghĩa bở i ba trục tọa độ Ox, Oy, Oz. Đối vớ i hệ tọa độ 3D đòi hỏinhiều tính toán phức tạp hơn khi thực hiện các thao tác với các đối tƣợ ng. Một vertextrong hệ tọa độ 3D có dạng P(Px, Py, Pz). Để tạo một đối tƣợng 3D nhƣ mong muốnchúng ta cần phải xác định các vertex một cách chính xác.

Hình 2. Hệ tọa độ 3D

  Các phép biến hình trong hệ tọa độ 3D

  Phép tịnh tiến : Tịnh tiến đối tƣợ ng theo trục Ox, Oy, hay Oz.

  Phép co giãn : Biến đổi tỉ lệ đối tƣợ ng vớ i một hệ số tỉ lệ tƣơng ứng vớ iba trục Ox, Oy, Oz.

  Phép quay : Quay đối tƣợ ng quanh một trục tọa độ theo một góc alpha.

  Các phƣơng pháp thể hiện hình 3D

  Phƣơng pháp 1 : Phép chiếu song songVớ i phép chiếu song song, một đối tƣợng 3D đƣợ c thể hiện lên màn

hình bằng cách bỏ qua các tọa độ z. Kết quả là một hình 2D đơn giản. Nếucó một khối vuông thì ta chỉ thu đƣợ c một hình vuông.

  Phƣơng pháp 2 : Phép chiếu phối cảnh

Là hình chiếu đƣợ c xây dựng bằng phép chiếu xuyên tâm nó tạo chongƣờ i xem có cảm giác gần giống nhƣ nhìn trong thực tế.

Page 14: DoAnTN_OPENGL

5/17/2018 DoAnTN_OPENGL - slidepdf.com

http://slidepdf.com/reader/full/doantnopengl 14/71

 

Phần 1 : Cơ sở lý thuyết –  Thƣ viện đồ họa OPENGL Trang 4

GVHD : Ths. Trịnh Thị Vân Anh SVTH : Đỗ Duy – Lớ p : D07CNPM1

CHƢƠNG 2 : VẼ HÌNH2.1. Cấu trúc lệnh OpenGL và các kiểu dữ liệu trong OpenGL

2.1.1.Cấu trúc lệnh OpenGL

OpenGL sử dụng tiền tố gl và tiếp theo đó là những từ đƣợ c viết hoa ở chữ cáiđầu để tạo nên tên của một lệnh.

Ví dụ : glColor2f() - Trong đó

gl – Tiền tố 

Color –  hàm cơ bản chỉ màu sắc

2 – Số lƣợ ng (hai chiều). Tức có hai tham số trong glColor2f(x, y)

f  – Hậu tố chỉ kiểu dữ liệu(x, y có kiểu float)

Thƣ viện Bộ hạt nhân Utility Auxiliary WGL Win32 API

Tiền tố gl glu Aux wgl Không cótiền tố đặcbiệt

Bảng 1 : Các tiền tố OpenGL

Hậu tố Kiểu dữ liệu của đối số 

B GLbyte

B GLdouble hay Glclampd

F GLfloat hay Glclampf 

I GLint hay Glsizei

S GLshort

Ub GLubyte hay Glboolean

Ui GLuint, GLnum hay GlbitfieldUs GLushort

Bv GLbyte hay vector

Dv GLdouble hay Glclampd dạng vector

Fv GLfloat hay Glclampf dạng vector

Iv GLint hay Glsizei dạng vector

Sv GLshort dạng vector

ubv GLubyte hay Glboolean dạng vector

Page 15: DoAnTN_OPENGL

5/17/2018 DoAnTN_OPENGL - slidepdf.com

http://slidepdf.com/reader/full/doantnopengl 15/71

 

Phần 1 : Cơ sở lý thuyết –  Thƣ viện đồ họa OPENGL Trang 5

GVHD : Ths. Trịnh Thị Vân Anh SVTH : Đỗ Duy – Lớ p : D07CNPM1

uiv GLuint, Glenum hay Glbitfield dạngvector

usv GLushort dạng vector

Bảng 2 : Các hậu tố OpenGL.2.1.2. Các kiểu dữ liệu OpenGLOpenGL định nghĩa kiểu dữ liệu để dễ dàng thao tác trong chƣơng trình:

Kiểu dữ liệu trongOpenGL

Kiểu dữ liệu tƣơng ứngtrong C

Ý nghĩa 

GLbyte Signed char Số nguyên 8 bit

GLshort Short Số nguyên 16 bit

GLint, Glsizei Long Số nguyên 16 bitGLfloat, Glclampd Float Dấu chấm động 32 bit

GLdouble, Glclampf Double Dấu chấm động 64 bit

GLubyte, GLboolean Unsigned char Char không dấu 8 bit

GLushort Unsigned short Số nguyên không dấu 16bit

GLuint,GLenum,

GLbitfield

Unsigned long Số nguyên không dấu 32

bitGLvoid Void Hàm không đối số hoặc

không trả về giá trị 

HGLRC HGDIOBJ Handle của đối tƣợ ng GDI

Bảng 3 : Các kiểu dữ liệu trong OpenGL.

Ví dụ khai báo biến trong OpenGL :

GLint x;

GLfloat y;2.2. Chƣơng trình OpenGL tối thiểu

Đoạn mã sau sử dụng các hàm OpenGL để vẽ một tứ giác màu đỏ //Khai báo thư viện đồ họa glut.h

#include <gl/glut.h>

void ve_hinh_tu_giac(){

//Thiết lập màu nền là màu trắng

glClearColor(1.0f, 1.0f, 1.0f, 0.0f);

//Xóa bộ đệm màu

glClear(GL_COLOR_BUFFER_BIT);

Page 16: DoAnTN_OPENGL

5/17/2018 DoAnTN_OPENGL - slidepdf.com

http://slidepdf.com/reader/full/doantnopengl 16/71

 

Phần 1 : Cơ sở lý thuyết –  Thƣ viện đồ họa OPENGL Trang 6

GVHD : Ths. Trịnh Thị Vân Anh SVTH : Đỗ Duy – Lớ p : D07CNPM1

//Định nghĩa màu vẽ là màu đỏ 

glColor(1.0f, 0.0f, 0.0f);

// Định nghĩa hình vẽ là hình tứ giác

glBegin(GL_QUADS);

//Định nghĩa tọa độ các đỉnh tứ giác

glVertex2f(-0.7f, -0.1f);

glVertex2f(-0.1f, -0.1f);

glVertex2f(-0.1f, 0.5f);

glVertex2f(-0.7f, 0.5f);

//Kết thúc vẽ tứ giác

glEnd();

//Bảo đảm các lệnh trên được thực hiện

glFlush();

}

int main(int argc, char** argv) {

glutInit(&argc, argv);

//Tạo cửa sổ với tên ve_hinh_tu_giac

glutCreateWindow("Ve_hinh_tu_giac");

//Thực hiện hàm ve_hinh_tu_giac()

glutDisplayFunc(ve_hinh_tu_giac);

glutMainLoop();

return 0;

}

Kết quả xuất ra màn hình nhƣ sau : 

Page 17: DoAnTN_OPENGL

5/17/2018 DoAnTN_OPENGL - slidepdf.com

http://slidepdf.com/reader/full/doantnopengl 17/71

 

Phần 1 : Cơ sở lý thuyết –  Thƣ viện đồ họa OPENGL Trang 7

GVHD : Ths. Trịnh Thị Vân Anh SVTH : Đỗ Duy – Lớ p : D07CNPM1

Hình 3. Ví dụ một chƣơng trình OpenGL. 

2.3. Vẽ hình

OpenGL định nghĩa vẽ một hình nhƣ sau: glBegin(tham số);

……… 

glEnd();

Danh sách các tham số đƣợ c liệt kê trong bảng sau:

GL_POINTS Các điểm

GL_LINES Đoạn thẳng

GL_POLYGON Đa giác lồi

GL_TRIANGLES Tam giác

GL_QUADS Tứ giác

GL_LINES_STRIP Đƣờ ng gấp khúc không khép kín

GL_LINE_LOOP Đƣờ ng gấp khúc khép kín

GL_TRIANGLE_STRIP Một dải các tam giác liên kết vớ i nhau

GL_TRIANGLE_FAN Một dải các tam giác liên kết theo hìnhquạt

GL_QUAD_STRIP Một dải các tứ giác liên kết vớ i nhau

Bảng 4 : Giá trị các tham số  định nghĩa hình vẽ của glBegin(tham số )

Page 18: DoAnTN_OPENGL

5/17/2018 DoAnTN_OPENGL - slidepdf.com

http://slidepdf.com/reader/full/doantnopengl 18/71

 

Phần 1 : Cơ sở lý thuyết –  Thƣ viện đồ họa OPENGL Trang 8

GVHD : Ths. Trịnh Thị Vân Anh SVTH : Đỗ Duy – Lớ p : D07CNPM1

Hình 4. Các đối tƣợ ng hình học cơ bản.

Dựa vào các hàm vẽ hình cơ bản mà OpenGL cung cấp chúng ta có thể vẽ đƣợ chầu hết các hình phức tạp. Để vẽ đƣợ c hình chúng ta phải sử dụng các điểm vẽ, để chỉ định 1 điểm ta dùng lệnh sau:

glVertex{234}{sifd}[v](tọa độ điểm);

Trong đó :

-{234} : chỉ định số chiều của không gian.

-{sifd} : chỉ định kiểu dữ liệu của tọa độ(Glshort, Glint hoặc Glsizei, Glfloathoặc Glclampf, Gldouble hoặc Glclampd).

-[v] : nếu tọa độ đƣợ c truyền vào từ một mảng cho trƣớ c

Ví dụ :

glVertex2s(2, 3); //Tọa độ thuộc kiểu Glshort trong không gian 2 chiều

glVertex3d(0.0, 0.0, 1.2); //Tọa độ kiểu Gldouble trong không gian 3 chiều

2.3.1. Vẽ điểm

Vẽ cùng lúc 3 điểm trên hệ tọa độ 2DglBegin(GL_POINTS);

glColor3f(1.0, 0.0, 0.0);

glVertex2f(0.5, -0.5);

Page 19: DoAnTN_OPENGL

5/17/2018 DoAnTN_OPENGL - slidepdf.com

http://slidepdf.com/reader/full/doantnopengl 19/71

 

Phần 1 : Cơ sở lý thuyết –  Thƣ viện đồ họa OPENGL Trang 9

GVHD : Ths. Trịnh Thị Vân Anh SVTH : Đỗ Duy – Lớ p : D07CNPM1

glVertex2f(0.5, 0);

glVertex2f(0.5, 0.5);

glEnd();

Hình 5. Vẽ điểm

Điểm thể hiện nhƣ hình trên là quá nhỏ và rất khó quan sát do đó OpenGL cungcấp lệnh glPointSize(), cho phép vẽ điểm vớ i bất kỳ kích cỡ  nào. Trƣớ c hết chúng ta

phải thiết lập ma trận đơn vị glLoadIdentity() và định nghĩa cửa sổ hiện thị.

glPointSize(5.0); // 5 pixel dot

glLoadIdentity();//Thiet lap ma tran toa do la ma tran don vi

gluOrtho2D(0.0,(GLdouble)400,0.0,(GLdouble)400); //Kich co cua

so hien thi x,y thuộc (0,400)

glBegin(GL_POINTS);

glColor3f(1.0f, 0.0f, 0.0f);

glVertex2f(50.0, 50.0);

glVertex2f(50.0, 200.0);

glVertex2f(50.0, 300.0);

glEnd();

Page 20: DoAnTN_OPENGL

5/17/2018 DoAnTN_OPENGL - slidepdf.com

http://slidepdf.com/reader/full/doantnopengl 20/71

 

Phần 1 : Cơ sở lý thuyết –  Thƣ viện đồ họa OPENGL Trang 10

GVHD : Ths. Trịnh Thị Vân Anh SVTH : Đỗ Duy – Lớ p : D07CNPM1

Hình 6. Vẽ điểm vớ i glPointSize().

2.3.2. Vẽ đƣờ ng

Một đƣờng đƣợc xác định bằng điểm đầu và điểm cuốiglBegin(GL_LINES);

glVertex2f(0.0, 0.5);

glVertex2f(0.0, -0.5);

glEnd();

Hình 7. Vẽ đƣờ ng.

Để xác định kích thƣớc đƣờ ng chúng ta có thể sử dụng lệnhglLineWidth(Glfloat);

Page 21: DoAnTN_OPENGL

5/17/2018 DoAnTN_OPENGL - slidepdf.com

http://slidepdf.com/reader/full/doantnopengl 21/71

 

Phần 1 : Cơ sở lý thuyết –  Thƣ viện đồ họa OPENGL Trang 11

GVHD : Ths. Trịnh Thị Vân Anh SVTH : Đỗ Duy – Lớ p : D07CNPM1

// Độ rộng đường 4pixel và phải định nghĩa bên ngoài glBegin()

glLineWidth(4);

glBegin(GL_LINES);

glColor3f(1.0, 0.0, 0.0);

glVertex2f(50.0, 50.0);

glVertex2f(50.0, 200.0);

glEnd();

glLineWidth(20);

glBegin(GL_LINES);

glVertex2f(200.0, 50.0);

glVertex2f(200.0, 200.0);

glEnd();

Hình 8. Vẽ đƣờ ng vớ i glLineWidth(). 

Vẽ đường chấm bằng cách sử dụng lệnh glLineStipple(). Chúng ta cần định

nghĩa màu chấm bằng cách t ạo ra một giá trị nhị phân, với 1 tương ứng với chấm,

0 tương ứng với 0 chấm. Để vẽ đường chấm chúng ta cần kích hoạt nó bằng lệnh

glEnable(GL_LINE_STIPPLE);

//glLineStipple() cần định nghĩa bên ngoài glBegin() 

glLineWidth(5);

glEnable(GL_LINE_STIPPLE);

/*Hai đối số của hàm gồm 1 giá trị Glint biểu thị hệ số lặp

mẫu, và m

ột giá tr

ịGLushort ch

ứa m

ẫu ch

ấm. Ví d

ụvới h

ệsốlặp b

ằng2, mẫu chấm 01 thì đường chấm được vẽ là 0011*/

Page 22: DoAnTN_OPENGL

5/17/2018 DoAnTN_OPENGL - slidepdf.com

http://slidepdf.com/reader/full/doantnopengl 22/71

 

Phần 1 : Cơ sở lý thuyết –  Thƣ viện đồ họa OPENGL Trang 12

GVHD : Ths. Trịnh Thị Vân Anh SVTH : Đỗ Duy – Lớ p : D07CNPM1

glLineStipple(1,0x0F0F); //0F0F hệ nhị phân : 0000111100001111

glBegin(GL_LINES);

glColor3f(1.0, 0.0, 0.0);

glVertex2f(200.0, 50.0);

glVertex2f(200.0, 200.0);

glEnd();

glFlush();

Hình 9. Vẽ đƣờ ng vớ i glLineStipple().

2.3.3. Vẽ đa giác lồi

Đa giác là hình đƣợ c tạo bởi các đƣờ ng nối giữa một tập hợ p các vertex. Một đagiác có ít nhất 3 cạnh (tƣơng ứng ít nhất 3 vertex phân biệt). Đa giác đơn giản nhất làtam giác. OpenGL có thế vẽ đa giác nhƣ các điểm, các đƣờng ngoài, hay đối tƣợng đặcbiệt. Một đa giác có 2 mặt trƣớc và sau do đó có thế vẽ theo hai cách riêng và có thể quay một đa giác để xem mặt bên kia.

Hàm glPolygonMode() đƣợ c sử dụng trong vẽ đa giác:

glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);

Hai đối số của hàm này là các giá trị Glenum. Đối số đầu tiên có thể là hằngGL_FRONT, GL_BACK, hay GL_FRONT_AND_BACK, cho biết mặt đa giác muốnthiết lập là chế độ vẽ mặt trƣớ c hay sau hoặc cả 2. Đối số thứ 2 cho biết chế độ vẽ chomặt đa giác đã chọn. Các chế độ vẽ có thế là GL_POINT (Chỉ vẽ điểm tại các vertexcủa đa giác ), GL_LINE (Vẽ đa giác vớ i các cạnh đa giác khung lƣới), GL_FILL(đagiác đặc). Trong đó GL_FILL là chế độ mặc định

Page 23: DoAnTN_OPENGL

5/17/2018 DoAnTN_OPENGL - slidepdf.com

http://slidepdf.com/reader/full/doantnopengl 23/71

 

Phần 1 : Cơ sở lý thuyết –  Thƣ viện đồ họa OPENGL Trang 13

GVHD : Ths. Trịnh Thị Vân Anh SVTH : Đỗ Duy – Lớ p : D07CNPM1

Để cho OpenGL biết mặt nào của đa giác là trƣớ c, mặt nào là sau, ta dùng thứ tự khi định nghĩa các vertex tạo nên đa giác. Một đa giác đƣợc xem là đố i diện mặttrƣớ c, khi các vertex của nó đƣợc định nghĩa ngƣợ c chiều kim đồng hồ. Tuy nhiên cóthể thay đổi bằng cách gọi :

glFontFace(GL_CW);

Lờ i gọi này cho OpenGL biết đa giác đối diện mặt trƣớ c chọn định nghĩa theochiều nào. Đối số đơn của hằng là GL_CW khi chọn chiều kim đồng hồ, và CL_CCWkhi chọn chiều ngƣợ c chiều kim đồng hồ (mặc định).

Đoạn mã thực hiện vẽ 1 đa giác: glBegin(GL_POLYGON);

glColor3f(1.0, 0.0, 0.0);

glVertex2f(-0.5f,0.5f);

glVertex2f(-0.5f,-0.5f);glVertex2f(0.5f,-0.5f);

glVertex2f(0.5f,0.5f);

glEnd(); 

Hình 10. Vẽ polygon.

Nếu dùng lệnh : glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); 

Page 24: DoAnTN_OPENGL

5/17/2018 DoAnTN_OPENGL - slidepdf.com

http://slidepdf.com/reader/full/doantnopengl 24/71

 

Phần 1 : Cơ sở lý thuyết –  Thƣ viện đồ họa OPENGL Trang 14

GVHD : Ths. Trịnh Thị Vân Anh SVTH : Đỗ Duy – Lớ p : D07CNPM1

Hình 11. Vẽ polygon vớ i chế độ GL_LINE

Nếu dùng lệnh : glPolygonMode(GL_FRONT_AND_BACK,GL_PINT);

Hình 12. Vẽ polygon vớ i chế độ GL_POINT

2.3.5. Vẽ tam giácglPolygonMode(GL_FRONT_AND_BACK,GL_LINE);

glBegin(GL_TRIANGLES);

glColor3f(1.0, 0.0, 0.0);

glVertex2f(-0.6, 0.5);

glVertex2f(-0.6, -0.5);

glVertex2f(0.6, 0); 

Page 25: DoAnTN_OPENGL

5/17/2018 DoAnTN_OPENGL - slidepdf.com

http://slidepdf.com/reader/full/doantnopengl 25/71

 

Phần 1 : Cơ sở lý thuyết –  Thƣ viện đồ họa OPENGL Trang 15

GVHD : Ths. Trịnh Thị Vân Anh SVTH : Đỗ Duy – Lớ p : D07CNPM1

glEnd();

Hình 13. Vẽ tam giác. 

2.3.6. Vẽ tứ giácglPolygonMode(GL_FRONT_AND_BACK,GL_LINE);

glBegin(GL_QUADS);

glColor3f(1.0, 0.0, 0.0);

glVertex2f(-0.6, 0.5);

glVertex2f(-0.6, -0.5);

glVertex2f(0.6, 0);

glVertex2f(0.6, 0.5);

glEnd(); 

Page 26: DoAnTN_OPENGL

5/17/2018 DoAnTN_OPENGL - slidepdf.com

http://slidepdf.com/reader/full/doantnopengl 26/71

 

Phần 1 : Cơ sở lý thuyết –  Thƣ viện đồ họa OPENGL Trang 16

GVHD : Ths. Trịnh Thị Vân Anh SVTH : Đỗ Duy – Lớ p : D07CNPM1

Hình 14. Vẽ tứ giác

2.3.7. Vẽ đƣờ ng gấp khúc không khép kínglBegin(GL_LINE_STRIP);

glColor3f(1.0, 0.0, 0.0);

glVertex2f(-0.6, 0.5);

glVertex2f(-0.6, -0.5);

glVertex2f(0.6, 0);

glVertex2f(0.6, 0.5);

glEnd();

Hình 15. Vẽ đƣờ ng gấp khúc không khép kín.

Page 27: DoAnTN_OPENGL

5/17/2018 DoAnTN_OPENGL - slidepdf.com

http://slidepdf.com/reader/full/doantnopengl 27/71

 

Phần 1 : Cơ sở lý thuyết –  Thƣ viện đồ họa OPENGL Trang 17

GVHD : Ths. Trịnh Thị Vân Anh SVTH : Đỗ Duy – Lớ p : D07CNPM1

2.3.8. Vẽ đƣờ ng gấp khúc khép kínglBegin(GL_LINE_LOOP);

glColor3f(1.0, 0.0, 0.0);

glVertex2f(-0.6, 0.5);

glVertex2f(-0.6, -0.5);

glVertex2f(0.2, 0);

glVertex2f(0.6, 0.5);

glVertex2f(0.6, -0.5);

glVertex2f(0, -0.8);

glEnd(); 

Hình 16. Vẽ đƣờ ng gấp khúc khép kín.

2.3.9. Vẽ dải tam giácglPolygonMode(GL_FRONT_AND_BACK,GL_LINE);

glBegin(GL_TRIANGLE_STRIP);

glColor3f(1.0, 0.0, 0.0);glVertex2f(-0.5, 0.5);

glVertex2f(-0.5, -0.5);

glVertex2f(0, 0.5);

glVertex2f(0.6, -0.5);

glVertex2f(0.6, 0.7);

glVertex2f(0.8, -0.6);

glEnd();

Page 28: DoAnTN_OPENGL

5/17/2018 DoAnTN_OPENGL - slidepdf.com

http://slidepdf.com/reader/full/doantnopengl 28/71

 

Phần 1 : Cơ sở lý thuyết –  Thƣ viện đồ họa OPENGL Trang 18

GVHD : Ths. Trịnh Thị Vân Anh SVTH : Đỗ Duy – Lớ p : D07CNPM1

Hình 17. Vẽ dải tam giác liên kết.

2.3.10. Vẽ các tam giác liên kết theo hình quạtglPolygonMode(GL_FRONT_AND_BACK,GL_LINE);

glBegin(GL_TRIANGLE_FAN);

glColor3f(1.0, 0.0, 0.0);

glVertex2f(-0.5, -0.5);

glVertex2f(-0.5, 0.5);

glVertex2f(0, 0.5);

glVertex2f(0.4, 0.4);

glVertex2f(0.6, 0);

glVertex2f(0.5, -0.6);

glEnd();

Page 29: DoAnTN_OPENGL

5/17/2018 DoAnTN_OPENGL - slidepdf.com

http://slidepdf.com/reader/full/doantnopengl 29/71

 

Phần 1 : Cơ sở lý thuyết –  Thƣ viện đồ họa OPENGL Trang 19

GVHD : Ths. Trịnh Thị Vân Anh SVTH : Đỗ Duy – Lớ p : D07CNPM1

Hình 18. Vẽ dải tam giác liên kết theo hình quạt 

2.3.11. Vẽ 1 dải tứ giác liên kết vớ i nhauglPolygonMode(GL_FRONT_AND_BACK,GL_LINE);

glBegin(GL_QUAD_STRIP);

glColor3f(1.0, 0.0, 0.0);

glVertex2f(-0.5, -0.5);

glVertex2f(-0.4, 0.4);

glVertex2f(0, -0.5);glVertex2f(0, 0.5);

glVertex2f(0.3, 0);

glVertex2f(0.3, 0.6);

glVertex2f(0.4, 0);

glVertex2f(0.6, 0.5);

glEnd(); 

Page 30: DoAnTN_OPENGL

5/17/2018 DoAnTN_OPENGL - slidepdf.com

http://slidepdf.com/reader/full/doantnopengl 30/71

 

Phần 1 : Cơ sở lý thuyết –  Thƣ viện đồ họa OPENGL Trang 20

GVHD : Ths. Trịnh Thị Vân Anh SVTH : Đỗ Duy – Lớ p : D07CNPM1

Hình 19. Vẽ dải tứ giác liên kết

2.4. Màu sắc

2.4.1. Chế độ màu RGBA

OpenGL hỗ trợ  2 chế  độ màu : RGBA và Color  –  Index. Trong chế  độ màuRGBA, RGB lần lƣợ t thể hiện màu Red, Green, Blue. Còn thành phần A(alpha) không

thực sự ảnh hƣở ng trực tiếp lên màu pixel, ngƣờ i ta có thể dùng thành phần A để xácđịnh độ trong suốt hay thông số cần quan tâm nào đó. 

Hình 20. Chế độ màu RGB trên mỗi pixel

Page 31: DoAnTN_OPENGL

5/17/2018 DoAnTN_OPENGL - slidepdf.com

http://slidepdf.com/reader/full/doantnopengl 31/71

 

Phần 1 : Cơ sở lý thuyết –  Thƣ viện đồ họa OPENGL Trang 21

GVHD : Ths. Trịnh Thị Vân Anh SVTH : Đỗ Duy – Lớ p : D07CNPM1

Để thiết lập màu vẽ hiện hành trong chế độ RGBA, chúng ta có thể sử dụng cáchàm sau:

void glColor3{b s I f d ub us ui} (TYPEr, TYPEg, TYPEb);

void glColor3{b s I f d ub us ui} (TYPEr, TYPEg, TYPEb, TYPEa);void glColor3{b s I f d ub us ui}v (const TYPE*v);

void glColor3{b s I f d ub us ui}v(const TYPE*v);

Trong đó, nếu các tham số là số thực thì bảng màu tƣơng ứng sẽ nằm trongđoạn [0, 1], ngƣợ c lại sẽ đƣợ c chuyển đổi nhƣ ở bảng sau :

Suffix Data Type MinimumValue

MinValueMaps to

MaximumValue

MaxValueMaps to

b 1-byte integer -128 -1.0 127 1.0s 2-byte integer -32768 -1.0 32767 1.0

i 4-byte integer -2147483648 -1.0 2147483648 1.0

ub unsigned 1-byteinteger

0 0.0 255 1.0

us usigned 2 – byteinteger

0 0.0 65535 1.0

ui usigned 4 – byteinteger

0 0.0 4294967295 1.0

Bảng 5 : Chuyển đổi các tham số trong bảng màu

2.4.2. Thiết lập mô hình shading

Một đoạn thẳng có thể đƣợ c tô bởi 1 màu đồng nhất (chế độ flat) hay bở i nhiểumàu sắc khác nhau (chế độ smooth). Để thiết lập chế độ shading phù hợ p, chúng ta cóthể sử dụng hàm :

void glShadeModel (GLenum mode);

Trong đó mode là chế độ mong muốn, nó có thể nhận một trong hai giá trị GL_SMOOT hoặc GL_FLAT.

  Chế độ SMOOTH

Xét đoạn mã sau để thấy rõ hơn màu vẽ mà đƣợ c tô bở i chế độ SMOOTHglClearColor (1.0, 1.0, 1.0, 0.0);

glClear (GL_COLOR_BUFFER_BIT);

glShadeModel (GL_SMOOTH);

glBegin (GL_TRIANGLES);

//Đỉnh thứ nhất màu đỏ 

glColor3f (1.0, 0.0, 0.0);

Page 32: DoAnTN_OPENGL

5/17/2018 DoAnTN_OPENGL - slidepdf.com

http://slidepdf.com/reader/full/doantnopengl 32/71

 

Phần 1 : Cơ sở lý thuyết –  Thƣ viện đồ họa OPENGL Trang 22

GVHD : Ths. Trịnh Thị Vân Anh SVTH : Đỗ Duy – Lớ p : D07CNPM1

glVertex2f (5.0, 5.0);

//Đỉnh thứ 2 màu xanh lá cây

glColor3f (0.0, 1.0, 0.0);

glVertex2f (25.0, 5.0);

//Đinh thứ 3 màu xanh da trời

glColor3f (0.0, 0.0, 1.0);

glVertex2f (5.0, 25.0);

glEnd();

Hình 21. Vẽ hình vớ i chế độ SMOOTH

  Chế độ FLAT

Chế độ FLAT tô hình đang xét bằng một màu đồng nhất. Khi đó OpenGL sẽ lấymàu của một đỉnh làm màu tô cho toàn bộ hình. Vẫn đoạn mã trên nhƣng vớ i chế độ FLAT ta sẽ thấy kết quả nhƣ sau :

glClearColor (1.0, 1.0, 1.0, 0.0);

glClear (GL_COLOR_BUFFER_BIT);

glShadeModel (GL_FLAT);

glBegin (GL_TRIANGLES);

//Đỉnh thứ nhất màu đỏ 

glColor3f (1.0, 0.0, 0.0);

glVertex2f (5.0, 5.0);//Đỉnh thứ 2 màu xanh lá cây

Page 33: DoAnTN_OPENGL

5/17/2018 DoAnTN_OPENGL - slidepdf.com

http://slidepdf.com/reader/full/doantnopengl 33/71

 

Phần 1 : Cơ sở lý thuyết –  Thƣ viện đồ họa OPENGL Trang 23

GVHD : Ths. Trịnh Thị Vân Anh SVTH : Đỗ Duy – Lớ p : D07CNPM1

glColor3f (0.0, 1.0, 0.0);

glVertex2f (25.0, 5.0);

//Đinh thứ 3 màu xanh da trời

glColor3f (0.0, 0.0, 1.0);

glVertex2f (5.0, 25.0);

glEnd();

Hình 22. Vẽ hình vớ i chế độ màu FLAT

Cách lấy màu của đỉnh nhƣ sau : 

  Đối vớ i một đoạn thẳng, điểm đƣợ c lấy màu là điểm cuối của đoạn thẳng

  Đối với đa giác, điểm đƣợ c chọn lấy màu theo quy tắc nhƣ sau:

Loại đa giác  Đỉnh đƣợ c chọn để lấy màu cho đa giácthứ i

Đa giác đơn 1

Dải tam giác liên kết i+2

Dải tam giác liên kết theo hình quạt I+2

Tam giác độc lập 3i

Page 34: DoAnTN_OPENGL

5/17/2018 DoAnTN_OPENGL - slidepdf.com

http://slidepdf.com/reader/full/doantnopengl 34/71

 

Phần 1 : Cơ sở lý thuyết –  Thƣ viện đồ họa OPENGL Trang 24

GVHD : Ths. Trịnh Thị Vân Anh SVTH : Đỗ Duy – Lớ p : D07CNPM1

Dải tứ giác liên kết 2i+2

Tứ giác độc lập 4i

Bảng 6 : Quy tắc lấy màu vẽ cho hình

Màu vẽ của hình tam giác (một tam giác độc lập) trên chính là màu vẽ “BLUE”đƣợc định nghĩa ở  đỉnh thứ 3.

Một ví dụ khác cho dải tứ giác liên kếtglClearColor (1.0, 1.0, 1.0, 0.0);

glClear (GL_COLOR_BUFFER_BIT);

glShadeModel(GL_FLAT);

glBegin(GL_QUAD_STRIP);

glColor3f(1.0, 0.0, 0.0); // Vertex 1 : Đỏ 

glVertex2f(-0.5, -0.5);glVertex2f(-0.4, 0.4);

glColor3f(0.0, 1.0, 0.0); // Vertex 3 : Xanh lá

glVertex2f(0, -0.5);

glVertex2f(0, 0.5);

glColor3f(0.0, 0.0, 1.0); // Vertex 5 : Xanh da trời

glVertex2f(0.3, 0);

glVertex2f(0.3, 0.6);

glColor3f(1.0, 1.0, 0.0); // Vertex 7 : Vàng

glVertex2f(0.4, 0);glVertex2f(0.6, 0.5);

glEnd();

Page 35: DoAnTN_OPENGL

5/17/2018 DoAnTN_OPENGL - slidepdf.com

http://slidepdf.com/reader/full/doantnopengl 35/71

 

Phần 1 : Cơ sở lý thuyết –  Thƣ viện đồ họa OPENGL Trang 25

GVHD : Ths. Trịnh Thị Vân Anh SVTH : Đỗ Duy – Lớ p : D07CNPM1

Hình 23. Lấy màu vẽ cho dải tứ giác liên kết.

Page 36: DoAnTN_OPENGL

5/17/2018 DoAnTN_OPENGL - slidepdf.com

http://slidepdf.com/reader/full/doantnopengl 36/71

 

Phần 1 : Cơ sở lý thuyết –  Thƣ viện đồ họa OPENGL Trang 26

GVHD : Ths. Trịnh Thị Vân Anh SVTH : Đỗ Duy – Lớ p : D07CNPM1

CHƢƠNG 3 : CÁC PHÉP BIẾN ĐỔI 3D3.1. Quá trình chuyển đổi tọa từ  không gian 3D đến pixel trên màn hình

Mục đích của đồ họa máy tính đó là tạo ra hình ảnh hai chiều (2D) trên màn

hình máy tính của các vật thể trong không gian ba chiều (3D). Quá trình chuyển đổitọa độ từ không gian 3D thành các điểm (pixel) xuất hiện trên màn hình đƣợ c mô tả nhƣ sau:

Bƣớ c 1 : Áp dụng các phép biến đổi đƣợ c biểu diễn bở i các phép nhân ma trậnbao gồm phép biến đổi mô hình (Modeling), phép biến đổi điểm nhìn (Viewing) vàphép chiếu (Projection). Nhìn chung ta kết hợ p một số phép biến đổi khi đó đối tƣợ ngcần vẽ  trong không gian 3D đƣợ c cắt theo một không gian thực đƣợ c gọi là viewingvolume. Viewing volume xác định cách thức mà vật thể đƣợ c chiếu lên màn hình làphép chiếu phối cảnh (perspective projection) hay phép chiếu trực giao (orthographic

projection) và phần nào của đối tƣợng đƣợ c hiển thị.Bƣớ c 2 : Viewing volume đƣợ c chiếu lên một mặt phẳng chiếu hình chữ nhật

đƣợ c gọi là khung nhìn (rectangular window).

Bƣớ c 3: Ánh xạ hình ảnh trong khung nhìn thành các điểm ảnh trên một cửa sổ của màn hình máy tính mà ta gọi đó là cổng nhìn (viewport).

3.2. Thao tác trên ModelView

Trƣớ c khi thực hiện thao tác trên ModelView, chúng ta cần gọi hàm :

glMatrixMode(GL_MODELVIEW);

Để lựa chọn ma trân cần thao tác. Để sử dụng ma trận vào việc biến hình, trƣớ ctiên cần khở i tạo nó bằng ma trận đơn vị. Chúng ta cần gọi hàm :

glLoaddentity();

3.2.1. Một số hàm biến đổi

OpenGL hỗ trợ sẵn các hàm biết đổi cơ bản nhƣ sau:

  Tịnh tiến :

glTranslate{fd}(TYPEx, TYPEy, TYPEz);

Ý nghĩa : tịnh tiến mô hình theo vector tịnh tiến (x,y,z).

  Phép quay :glRotate{fd} (TYPE angle, TYPEx, TYPEy, TYPEz);

Ý nghĩa : Quay mô hình một góc angle ngƣợ c chiều kim đồng hồ xung quanhtia nối từ gốc tọa độ đến điểm (x, y, z).

  Phép tỉ lệ :

glScale{fd}(TYPEx, TYPEy TYPEz);

Ý nghĩa : Biến đổi tỉ lệ mô hình vớ i hệ số tỉ lệ tƣơng ứng vớ i ba trục ox, oy, ozlần lƣợ t là x, y, z.

Page 37: DoAnTN_OPENGL

5/17/2018 DoAnTN_OPENGL - slidepdf.com

http://slidepdf.com/reader/full/doantnopengl 37/71

 

Phần 1 : Cơ sở lý thuyết –  Thƣ viện đồ họa OPENGL Trang 27

GVHD : Ths. Trịnh Thị Vân Anh SVTH : Đỗ Duy – Lớ p : D07CNPM1

3.2.2. Thiết lập view

Giống nhƣ chụp hình, thiết lập view là thiết lập vị trí cũng nhƣ góc, hƣớ ng củacamera. Thƣ viện GLUT có một hàm giúp thiết lập view một cách nhanh chóng :

gluLookAt(Gldouble eyex, Gldouble eyey, Gldouble eyez, Gldouble centerx, Gldoublecentery, Gldouble centerz, Gldouble upx, Gldouble upy, Gldouble upz).

Trong đó :

  (eyex, eyey, eyez) là vị trí đặt của view.  (centerx, centery, centerz) là điểm nằm trên đƣờ ng thẳng xuất phát từ tâm view

hƣớ ng ra ngoài.  (upx, upy, upz) là vector chỉ hƣớ ng lên trên của view.

3.3. Thao tác trên Projection

Trƣớ c khi thực hiện thao tác chiếu, chúng ta cần gọi hai hàm:

glMatrixMode (GL_PROJECTION);

glLoadIdentity();

3.3.1. Phép chiếu phối cảnh (Prespective Projection)

Đặc điểm của phép chiếu này là đối tƣợ ng càng lùi xa càng nhỏ. Để thiết lậpphép chiếu này, OpenGL có hàm:

glFrustum(Gldouble left, Gldouble right, Gldouble bottom, Gldouble top, Gldoublenear, Gldouble far)

Viewing volume đƣợc định nghĩa là 1 hình chóp cụt, đỉnh của hình chóp tạigốc tọa đô. Đáy lớ n của viewing volume nằm trên mặt phẳng z = -far và đáy nhỏ củaviewing volume (khung nhìn) nằm trên mặt phẳng z = -near là mặt phẳng mà vật thể sẽ đƣợ c chiếu lên đó. Các giá trị near và far là các số dƣơng.

Hình 24. Viewing volume đƣợc định nghĩa bở i glFlustum().

Ngoài ra chúng ta có thể sử dụng hàm :

Page 38: DoAnTN_OPENGL

5/17/2018 DoAnTN_OPENGL - slidepdf.com

http://slidepdf.com/reader/full/doantnopengl 38/71

 

Phần 1 : Cơ sở lý thuyết –  Thƣ viện đồ họa OPENGL Trang 28

GVHD : Ths. Trịnh Thị Vân Anh SVTH : Đỗ Duy – Lớ p : D07CNPM1

gluPerspective(Gldouble fovy, Gldouble aspect, Gldouble near, Gldouble far).

Tác dụng của lệnh giống nhƣ hàm glFrustum() nhƣng các tham số mang một ýnghĩa khác. Tham số fovy xác định góc tại đỉnh của hình chóp dọc theo mặt phẳng yz,tham số aspect chính là tỉ số giữa bề rộng và chiều cao đáy nhỏ của hình nón cụt, haitham số near và far giống nhƣ hàm glFrustum().

Hình 25. Viewing volume đƣợc định nghĩa bở i gluPerspective().

3.3.2. Phép chiếu trự c giao

Vớ i phép chiếu trực giao, viewing volume đƣợc định nghĩa là một hình hộp chữ nhật. Vật thể nằm trong viewing volume đƣợ c chiếu trực giao lên khung nhìn do đó

trong phép chiếu trực giao khoảng cách từ camera đến vật thể không ảnh hƣởng đến độ lớ n của ảnh. Phép chiếu trực giao thƣờng đƣợ c dùng nhiều trong các ứng dụngCAD/CAM nhƣ các trình ứng dụng tạo các bản vẽ kỹ thuật lĩnh vực thiết kế.

Để thực hiện phép chiếu trực giao chúng ta có thể sử dụng hàm :

glOrtho(Gldouble left, Gldouble right, Gldouble bottom, Gldouble top, Gldouble near,Gldouble far);

Đối tƣợ ng nằm trong viewing volume đƣợ c chiếu trực giao lên đáy của hìnhhộp chữ nhật nằm trên mặt phẳng z = -near, phƣơng của phép chiếu song song vớ i trụcoz. Ảnh thu đƣợ c không bị co lại và không có chiều sâu.

Page 39: DoAnTN_OPENGL

5/17/2018 DoAnTN_OPENGL - slidepdf.com

http://slidepdf.com/reader/full/doantnopengl 39/71

 

Phần 1 : Cơ sở lý thuyết –  Thƣ viện đồ họa OPENGL Trang 29

GVHD : Ths. Trịnh Thị Vân Anh SVTH : Đỗ Duy – Lớ p : D07CNPM1

Hình 26. Viewing volume đƣợc định nghĩa bở i glOrtho().

Sử dụng hàm :

gluOrtho2D(Gldouble left, Gldouble right, Gldouble bottom, Gldouble top);

Lệnh có ý nghĩa giống nhƣ lệnh glOrtho() ngoại trừ khoảng giá z mặc định củavật thể nằm trong viewing volume mặc định là [-1, 1].

3.4. Phép biến đổi cổng nhìn (viewport transformation)Cổng nhìn là một miền hình chữ nhật nằm phía trong một cửa sổ (window)

đang mở trên màn hình cho phép hiển thị hình ảnh. Hình ảnh của vật thể sau khi đƣợ cchiếu lên khung nhìn sẽ đƣợ c ánh xạ lên cổng nhìn. Ta có thể định nghĩa nhiều cổngnhìn để hiển thị nhiều khung cảnh khác nhau trên cửa sổ. Định nghĩa cổng nhìn tadùng hàm sau :

glWiewport(Glint x, Glint y, Glsizei width, Glsizei height);

Trong đó (x, y) xác định tọa độ góc trái phía dƣớ i của cổng nhìn, tọa độ này là

tọa độ trong cửa sổ đang mở. Góc trái phía dƣớ i của cửa sổ có tọa độ (0, 0). Hai thamsố width và height là chiều rộng và cao của khung nhìn. Ở chế độ mặc định giá trị tham số của khung nhìn là (0, 0, winWidth, winHeight) trong đó winWidth vàwinHeight là kích thƣớ c của cửa sổ hiển thị khung nhìn.

Page 40: DoAnTN_OPENGL

5/17/2018 DoAnTN_OPENGL - slidepdf.com

http://slidepdf.com/reader/full/doantnopengl 40/71

 

Phần 1 : Cơ sở lý thuyết –  Thƣ viện đồ họa OPENGL Trang 30

GVHD : Ths. Trịnh Thị Vân Anh SVTH : Đỗ Duy – Lớ p : D07CNPM1

CHƢƠNG 4 : ÁNH SÁNG 4.1. Các loại nguồn sáng

Ánh sáng cung cấp màu sắc và tạo ánh sáng cho đối tƣợ ng 3D làm hình ảnh

nhận đƣợ c trở lên thực hơn. OpenGL có 4 loại nguồn sáng : môi trƣờ ng, khuếch tán,phản chiếu, và nguồn sáng.

  Ánh sáng môi trƣờng là ánh sáng đến từ mọi hƣớ ng cùng lúc  Ánh sáng khuếch tán là ánh sáng đến từ một hƣớ ng chiếu vào bề mặt đối tƣợ ng,

làm cho bề mặt đối tƣợ ng trở nên sáng chói hơn, sau đó ánh sáng bị khuếch tánđi mọi hƣớ ng.

  Ánh sáng phản chiếu là ánh sáng đốm phản chói, thƣờ ng là màu trắng, trên cácbề mặt có tính phản chiếu cao.

  Cuối cùng, nguồn phát là nguồn ánh sáng phát ra từ đối tƣợng nhƣ bóng đèn

chẳng hạn.OpenGL cho phép 8 nguồn sáng khác nhau trong một chƣơng trình, mỗi nguồn

sáng có nhiều thuộc tính để kiểm soát các ánh sáng tác động đến một cảnh.Chúng tacần xác định các thành phần phần trăm đỏ,xanh dƣơng, xanh lục trong các thuộc tínhánh sáng môi trƣờ ng, khuếch tán, và phản chiếu. Đồng thời xác định các tọa độ x,y,z,và w của nguồn sáng. Công việc này đƣợ c thực hiện bằng các mảng chứa các giá trị yêu cầu.

4.2. Thiết lập các mảng giá trị ánh sáng

Các mảng sau chứa các giá trị dƣơng định nghĩa một nguồn sáng :

Glfloat ambientLight0[] = {0.3f, 0.3f, 0.3f, 0.3f};

Glfloat diffuseLight0[] = {0.5f, 0.5f, 0.5f, 1.0f};

Glfloat specularLight0[] = {0.0f, 0.0f, 0.0f, 1.0f};

Glfloat positionLight0[] = {0.0f, 0.0f, 1.0f, 0.0f};

Trong mảng ambientLight0[], lƣợng màu đƣợ c thiết lập cho ánh sáng môitrƣờ ng gồm 30% đỏ, 30% xanh dƣơng, 30% xanh lục.(Giá trị 1.0 là các thành phần

alpha có thể bỏ qua). Mảng diffuseLight0[] chứa lƣợ ng màu cho ánh sáng khuếch tán,gồm 50% đỏ, 50% xanh dƣơng, 50% xanh lục. Do cá thành phần màu trong các mảngtrên bằng nhau, chúng định nghĩa ánh sáng môi trƣờ ng và ánh sáng khuếch tán là ánhsáng trắng với các độ sáng riêng. Thay đổi tỉ lệ phần trăm các thành phần màu sẽ manglại ánh sáng màu. Mảng speculararLight[] chứa các giá trị của ánh sáng trắng tối nhất(hay không có ánh sáng nào). Mảng positionLight0[] chứa vị trí nguồn sáng, xác địnhbở i các tọa độ x, y, z, w. Trong đó w chỉ chƣa giá trị 0 và 1. Nếu w = 0, ta có nguồnsáng theo hƣớ ng, là nguồn sáng ở khoảng cách vô hạn so vớ i các cảnh, tức là các tiasáng đến đối tƣợ ng là song song vớ i nhau. Mặt trờ i là ví dụ cho nguồn sáng vô hƣớ ng.

Nếu w=1 , ta có nguồn sáng theo vị trí, là nguồn sáng có vị trí gần cảnh, nên các tia

Page 41: DoAnTN_OPENGL

5/17/2018 DoAnTN_OPENGL - slidepdf.com

http://slidepdf.com/reader/full/doantnopengl 41/71

 

Phần 1 : Cơ sở lý thuyết –  Thƣ viện đồ họa OPENGL Trang 31

GVHD : Ths. Trịnh Thị Vân Anh SVTH : Đỗ Duy – Lớ p : D07CNPM1

sáng chiếu vào đối tƣợng theo các góc khác nhau. Đèn là một ví dụ cho nguồn sángtheo vị trí.

4.3. Chuyển mảng cho OpenGL

Các giá trị định nghĩa nguồn sáng đƣợ c chuyển cho OpenGL bằng cách gọi hàmglLight() nhƣ sau: 

glLightfv(GL_LIGHT0, GL_AMBIENT, ambientLight0);

glLightfv(GL_LIGHT0, GL_DIFUSE, diffuseLight0);

glLightfv(GL_LIGHT0, GL_SPECULAR, specularLight0);

glLightfv(GL_LIGHT0, GL_POSITION, positionLight0);

Ba đối số của glLightfv() gồm nguồn sáng để định nghĩa, hằng số thể hiện tínhchất ánh sáng mà ta muốn thay đổi, và địa chỉ mảng chứa các giá trị dùng thay đổi tínhchất ánh sáng. Đối vớ i các thuộc tính ánh sáng môi trƣờ ng, khuếch tán, và phản chiếu,mảng chứa các giá trị RGBA. Đối với địa chỉ nguồn sáng mảng chứa các tọa độ x, y, z,w của nguồn sáng.

Một chƣơng trình OpenGL có thể có 8 nguồn sáng, đối số đầu tiên là hằng số từ GL_LIGHT0 đến GL_LIGHT7. Đối số thứ hai là các hằng số nhƣ bảng sau:

Hằng số  Ý nghĩa 

GL_AMBIENT Xác định ánh sáng môi trƣờ ng

GL_CONSTANT_ATTENUATION Xác định lƣợ ng giảm ánh sáng theo 1 hệ 

số GL_DIFFUSE Xác định ánh sáng khuếch tán

GL_LINEAR_ATTENUATION Xác định lƣợ ng giảm ánh sáng trên cơ sở  khoảng cách từ nguồn sáng đến đối tƣợ ng

GL_POSITION Xác định vị trí nguồn sáng

GL_QUADRATIC_ATTENUATION Xác định lƣợ ng giảm ánh sáng theo bình phƣơng khoảng cách từ nguồn sáng đếnđối tƣợ ng

GL_SPECULAR Xác định anh sáng khoảng chiếu

GL_SPOT_CUTOFF Xác định góc trải của đèn chiếu

GL_SPOT_DIRECTION Xác định hƣớng đèn chiếu

GL_SPOT_ẼPONENT Xác định cƣờng độ đèn chiếu, có tính đếngóc của ánh sáng

Bảng 7 : Đối số thứ hai của nguồn sáng.

4.4. Kích hoạt nguồn sángKhi đã có định nghĩa nguồn sáng, ta phải kích hoạt chúng bằng glEnable():

Page 42: DoAnTN_OPENGL

5/17/2018 DoAnTN_OPENGL - slidepdf.com

http://slidepdf.com/reader/full/doantnopengl 42/71

 

Phần 1 : Cơ sở lý thuyết –  Thƣ viện đồ họa OPENGL Trang 32

GVHD : Ths. Trịnh Thị Vân Anh SVTH : Đỗ Duy – Lớ p : D07CNPM1

glEnable(GL_LIGHTING);

glEnable(GL_LIGHT0);

Lờ i gọi đầu kích hoạt sự chiếu sáng. Lờ i gọi thứ hai bật nguồn sáng 0.

Vị trí nguồn sáng bị ảnh hƣở ng bở i phép biến hình đối tƣợng nhƣ mọi đối tƣợ ngkhác. Việc biến hình xảy ra khi hàm glLight() đƣợ c gọi để xác định vị trí hay hƣớ ngcủa nguồn sáng. Do đó phải gọi glMatrixModel(GL_MODELVIEW) vàglLoadldentity() trƣớ c khi gọi glLight(). Nếu muốn biến đổi vị  trí và hƣớ ng nguồnsáng theo các đối tƣợ ng khác trong cảnh, phải thực hiện các phép tịnh tiến, co giãn, vàquay trƣớ c khi gọi glLight().

4.5. Định nghĩa tính chất vật liệu

Tính chất vật liệu ảnh hƣở ng lớn đến cảnh. Ví dụ hình khối màu trằng trong ánhsáng đỏ sẽ có màu đỏ chứ không phải màu trắng. Trong khi một khối đỏ trong ánh

sáng xanh lục sẽ có mà đèn. Ngoài ra các vật liệu có độ sáng khác nhau sẽ phản xạ ánhsáng khác nhau.

4.5.1. Màu và ánh sáng

Màu của đối tƣợ ng trong cảnh phụ thuộc vào màu của ánh sáng mà nó phản xạ.Ví dụ, nếu đối tƣợ ng phản xạ ánh sáng màu xanh lục, thì nó sẽ có màu xanh lục trongánh sáng trắng. Do các thành phần màu đỏ và xanh dƣơng của ánh sáng bị hấp thụ chỉ còn lại thành phần xanh lục đến đƣợ c mắt ngƣờ i

Thông thƣờ ng cả ánh sáng môi trƣờ ng và ánh sáng khuếch tán phản xạ từ đối

tƣợ ng theo cùng một cách. Tức là nếu đối tƣợ ng phản xạ ánh sáng xanh lục, thì nóphản xạ màu xanh lục đối với ánh sáng môi trƣờ ng lẫn ánh sáng khuếch tán. Trong khiánh sáng phản chiếu hầu nhƣ luôn luôn cùng màu vớ i ánh sáng chiếu chiếu vào đốitƣợ ng. Ví dụ xét một khối vuông đƣợ c thể hiện trong ánh sáng vàng (màu hợ p nhất củamàu đỏ và xanh dƣơng) Nếu muốn khối vuông có màu đỏ, vật liệu của nó phải phản xạ màu đỏ của ánh sáng môi trƣờ ng và ánh sáng khuếch tán. Để làm khối vuông trở nênsáng hơn, thì phải thiết lập cho nó tính phản xạ màu vàng đối vớ i ánh sáng phản chiếu.

OpenGL cho phép định nghĩa các tính chất của đối tƣợng để xác định loại ánhsáng mà đối tƣợ ng phản xạ, và nhƣ vậy gián tiếp xác định màu cuối cùng của đối

tƣợ ng.4.5.2. Thiết lập các mảng giá trị vật liệu

Bƣớc đầu tiên để định nghĩa các tính chất của vật liệu là thiết lập các giá trị phản xạ ánh sáng môi trƣờ ng khuếch tán và ánh sáng phản chiếu

Glfloat materialAmbient[] = {0.0, 0.7, 0.0, 1.0};

Glfloat materialSpecular[] = {1.0, 1.0, 1.0, 1.0};

Mỗi mảng này chứa các giá trị RGBA cho 1 kiểu phản xạ ánh sáng riêng biệt,đó là các giá trị RGBA tƣơng ứng vớ i màu sắc ánh sáng dội ra từ vật liệu đối tƣợ ng.

Mảng materialAm bient[] định nghĩa vật liệu phản xạ 70% màu xanh lục trong ánhsáng môi trƣờ ng khuếch tán mà nó nhận đƣợc, nhƣng không phản xạ màu đỏ và xanh

Page 43: DoAnTN_OPENGL

5/17/2018 DoAnTN_OPENGL - slidepdf.com

http://slidepdf.com/reader/full/doantnopengl 43/71

 

Phần 1 : Cơ sở lý thuyết –  Thƣ viện đồ họa OPENGL Trang 33

GVHD : Ths. Trịnh Thị Vân Anh SVTH : Đỗ Duy – Lớ p : D07CNPM1

dƣơng. Mảng materialSpecular[] định nghĩa vật liệu phản xạ ánh sáng trắng, gồm100% các thành phần đỏ, xanh dƣơng, xnah lục.

4.5.3. Chuyển mảng vật liệu cho OpenGL

Để chuyển mảng vật liệu cho OpenGL, ta dùng các con trỏ đến đối tƣợ ng mảnglàm đối số trong lờ i gọi glMaterialv():

GlMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFSE, materialAmbient);

GlMaterialfv(GL_FRONT, GL_SPECULAR, materialSpecular);

Các đối số đầu tiên là GL_FRONT, GL_BACK, hay GL_FONT_AND_BACK,tƣơng ứng vói sự lụa chọn mặt trƣớ c, mặt sau, hay cả mặt trƣớ c lẫn sau của đa giác tạonên đối tƣợng. Đối với đối tƣợng đặc nhƣ hình khối, GL_FRONT thƣờng đƣợ c chọnvì mặt sau sẽ không bao giờ  thấy đƣợc. Nhƣng nếu hình khối mất một mặt thìGL_FRONT_AND_BACK đƣợ c chọn, vì ở một cảnh nào đó có thể nhìn thấy cả hai

mặt sau và trƣớ c của đa giác. Đối thứ hai có thể là một trong các hắng số trong bảngsau:

Hằng số Ý nghĩa 

GL_AMBIENT Ánh sáng môi trƣờ ng bị ánh xạ 

GL_AMBIENT_AND_DIFFUSE Ánh sáng môi trƣờ ng và khuếch tán bị ánh xạ 

GL_COLOR_INDEXES Xác định chỉ số màu cho ánh sáng

GL_DIFFUSE Ánh sáng khuếch tán bị phản xạ 

GL_EMISSION

GL_SHINNESS

Xác định nguồn sáng phát

Xác định độ bóng vật liệu

GL_SPECULAR Ánh sáng phản chiếu bị phản xạ 

Bảng 8 : Đối số thứ hai để chuyển mảng vật liệu cho OpenGL

Trong các hằng ở bảng trên, có hằng GL_COLOR_INDEXES xác định các chỉ 

số màu cho ánh sáng. Nhƣng ở  đây, ta chỉ sử dụng OpenGL ở chế độ RGBA.Nếu đối tƣợ ng phản xạ ánh sáng phản chiếu, ta phải xác định độ bóng vật liệu,

hằng số quyết định độ phản xạ ánh sáng phản chiều. Lờ i gọi hàm glMaterialfv() lúc đónhƣ sau: 

glMaterialfv(GL_FRONT, GL_SHININESS, 60);

Các đối số hàm glMaterialfv() gồm một hằng xác định bề mặt đa giác cần địnhnghĩa vật liệu, hằng GL_SHININESS ( chỉ dùng trong trƣờ ng hợ p này), và một giá trị trong khoảng từ 0 –  128 định nghĩa độ bóng.

Cần phân biệt rõ sự khác nhau giữa nguồn sáng phát và ánh sáng do phản xạ,khi cần định nghĩa các nguồn sáng ta quyết định lƣợng các ánh sáng môi trƣờ ng,

Page 44: DoAnTN_OPENGL

5/17/2018 DoAnTN_OPENGL - slidepdf.com

http://slidepdf.com/reader/full/doantnopengl 44/71

 

Phần 1 : Cơ sở lý thuyết –  Thƣ viện đồ họa OPENGL Trang 34

GVHD : Ths. Trịnh Thị Vân Anh SVTH : Đỗ Duy – Lớ p : D07CNPM1

khuếch tán và phản chiếu trong cảnh. Khi định nghĩa tính chất vật liệu, ta quyết địnhlƣợng ánh sáng do đối tƣợ ng phản xạ các ánh sáng môi trƣờ ng, khuếch tán và phảnchiếu.

Một đoạn mã ví dụ :GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };

GLfloat mat_shininess[] = { 50.0 };

GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };

glClearColor (0.0, 0.0, 0.0, 0.0);

glShadeModel (GL_SMOOTH);

glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);

glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);glLightfv(GL_LIGHT0, GL_POSITION, light_position);

glEnable(GL_LIGHTING);

glEnable(GL_LIGHT0);

glEnable(GL_DEPTH_TEST);

glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glutSolidSphere (1.0, 20, 16);

glFlush ();

Hình 27. Một ví dụ Lighting.

Page 45: DoAnTN_OPENGL

5/17/2018 DoAnTN_OPENGL - slidepdf.com

http://slidepdf.com/reader/full/doantnopengl 45/71

 

Phần 1 : Cơ sở lý thuyết –  Thƣ viện đồ họa OPENGL Trang 35

GVHD : Ths. Trịnh Thị Vân Anh SVTH : Đỗ Duy – Lớ p : D07CNPM1

CHƢƠNG 5 : TẠO CẢNH 3D5.1. Sử dụng các phép biến hình OpenGL để tạo cảnh 3D

5.1.1. Gốc tọa độ cục bộ và đôc tọa độ thế giớ i

Có hai phƣơng pháp tƣởng tƣợ ng về cách mà phép biến hình đối tƣợ ngOpenGL tác động lên cảnh 3D nhƣ thế nào : theo gốc tọa độ cục bộ và gốc tọa độ thế giớ i hay theo hệ tọa độ cố định

Khi tổ hợp các đối tƣợ ng nhỏ vào đối tƣợ ng lớ n thì các phép biến hình theo cácgốc tọa độ cục bộ và thế giớ i sẽ đơn giản hơn. Gốc tọa độ thế giớ i luôn là gốc tọa độ ba chiều. Đó là điều hoàn toàn hợ p lý vì hệ đề các 3D là thế giớ i chứa các cảnh đƣợ cvẽ. Nhƣ vậy khi định nghĩa các vị trí trong hệ tọa độ đề các 3D, các tọa độ đƣợ c dùnglà các tọa độ thế giới, có liên quan đến gốc tọa độ thế.

Trong khi đó gốc tọa độ cục bộ đƣợc đặt tại tâm đối tƣợ ng và di chuyển cùngđối tƣợ ng. Vớ i hệ thống này có thể  tƣởng tƣợ ng việc xây dựng các đối tƣợ ng 3D làthay vì di chuyển toàn bộ thế giới trƣớc khi đặt các phần của đối tƣợ ng vào vị trí, thì tachỉ đặt chúng vào vị trí trong thế giới tĩnh 

Giả sử khở i tạo ma trân modelview theo ma trận đơn vị nhƣ sau: 

glMatrixModel(GL_MODELVIEW);

glLoadIdentity();

Tại đây nếu ta gọi glutSoildCube(), OpenGL sẽ vẽ một khối vuông 3D có tâmtrùng vớ i tâm đề các 3D. Nếu ta gọi hai hay ba hay nhiều hơn nữa các lệnh

glutSoildCube thì tâm của chúng vẫn trùng với tâm đề các 3D. Để có thể thấy các khốivuông thì các đối tƣợ ng này cần phải đƣợc đặt ở các vị trí khác nhau để tạo nên hìnhcó ý nghĩa. Một cách để thực hiện điều này là phép tịnh tiến, tức di chuyển đối tƣợ ngvớ i gốc tọa độ cục bộ của nó đến vị trí mớ i.

5.1.2. Phép tịnh tiến

Sử dụng lênh glTranslatef để gọi phép tịnh tiến vào ma trận modelview nhƣ sau 

glTranslatef(x, y, z);

Ví dụ gọi glTranslatef(1.0f, 0.0f , 0.0f ) sau đó gọi glutSoildCube để vẽ khốivuông thứ hai thì khối vuông đó dẽ xuất hiện ở vị trí cách khối vuông thứ nhất 1 đơnvị về phía bên phải, do ma trận modelview chứa phép tịnh tiến 1 đơn vị trên trục X.Điều này giống nhƣ di chuyển gốc tọa độ cục bộ của khối vuông 1 đơn vị về phía bênphải.

Nếu tiếp tục thực hiện phép tịnh tiến nhƣ thế để vẽ khối vuông thứ hai thì khốivuông này sẽ cách gốc tọa độ thế giới 2 đơn vị. Tƣơng tự nếu ta tịnh tiến theo trục yhay z.

Page 46: DoAnTN_OPENGL

5/17/2018 DoAnTN_OPENGL - slidepdf.com

http://slidepdf.com/reader/full/doantnopengl 46/71

 

Phần 1 : Cơ sở lý thuyết –  Thƣ viện đồ họa OPENGL Trang 36

GVHD : Ths. Trịnh Thị Vân Anh SVTH : Đỗ Duy – Lớ p : D07CNPM1

5.1.3. Phép quay

Phép quay thay đổi hƣớ ng các trục cục bộ của đối tƣợ ng.

5.2. Sử dụng các Stack ma trận

Khi đã thiết lập một ma trận modelview làm ma trận nền, dùng nó để thực hiệncác phép biến hình, rồi trả lại ma trận nền, theo trạng thái ban đầu của nó. Ví dụ tamuốn thiết lập điểm nhìn lúc bắt đầu chƣơng trình, sau đó không quan tâm đến nó nữa.

 Nhƣng mọi phép biến hình đƣợ c thực hiện sau khi thiết lập điểm nhìn sẽ thay đổi matrận modelview, mà ma trận này chứa phép biến đổi điểm nhìn. Có nghĩa là phải khở itạo lại điểm nhìn ở lần thay đổi cảnh kế tiếp.

 Nhƣng OpenGL có cách để  lƣu trữ và hoàn trả nội dung 1 ma trận, đó là cácstack ma trận. Stack ma trân thì tƣơng tự nhƣ stack mà máy tính sử dụng, nhƣng chứacác giá trị cho các ma trận liên quan, thay vì các kiểu dữ liệu dùng cho stack máy tính.

Mỗi ma trận biến hình có stack ma trận riêng. Để lƣu nội dung ma trận hiện hành, chỉ đơn giản thực hiện lờ i gọi hàm sau :

glPushMatrix();

Sau khi đẩy ma trận hiện hành vào phía trên stack ma trận, ta có thể thực hiệnmọi phép biến hình mà không lo ma trận gốc bị biến đổi. Khi muốn trở lại ma trận gốc,lờ i gọi sau sẽ đƣợ c thực hiện :

glPopMatrix();

Cả hai hàm trên đều không có đối số. Chúng luôn luôn tác động đến ma trận

hiện đƣợ c chọn. Ví dụ các dòng sau lƣu nội dung ma trận modelview:glMatrixMode(GL_MODELVIEW);

glPushMatrix();

Còn các dòn sau lƣu nội dung ma trận chiếu:

glMatrixModel(GL_PROJECTION);

glPushMatrix();

Sử dụng các thao tác stack ma trận trên , ta dễ dàng thiết lập một ma trậnmodelview cơ sở  để định nghĩa một điểm nhìn, và trả nó về khi cần thiết. Khi bắt đầu

chƣơng trình: glMatrixMode(GL_PROJECTION);

glLoadIdentity();

glFrustum(-1, 1, -1, 2, 9);

glViewport(0, 0, cx, cy);

glMatrixMode(GL_MODELVIEW);

glLoadIdentity();

glTranslatef(0, 0, -5);

Page 47: DoAnTN_OPENGL

5/17/2018 DoAnTN_OPENGL - slidepdf.com

http://slidepdf.com/reader/full/doantnopengl 47/71

 

Phần 1 : Cơ sở lý thuyết –  Thƣ viện đồ họa OPENGL Trang 37

GVHD : Ths. Trịnh Thị Vân Anh SVTH : Đỗ Duy – Lớ p : D07CNPM1

Bốn dòng đầu tiên thiết lập một không gian quan sát và viewport. Trong khi badòng sau định nghĩa điểm nhìn bằng cách di chuyển “mắt” 5 đơn vị theo chiều âm trụcZ. (Thực ra là di chuyển ra xa mắt gốc tọa độ cục bộ của bất kỳ đối tƣợng nào đƣợ cvẽ).

Để vẽ cảnh mà không làm thay đổi nội dung ma trận modelview (là ma trậnchứa phép biến hình thiết lập điểm nhìn) thì tâ phải lƣu nó trƣớ c khi thực hiện bất kỳ phép biến đổi nào:

glMatrixMode(GL_MODELVIEW);

glPushMatrix();

glTranslatef(1,0,0);

glRotatef(90.0, 0, 1, 0);

glutSoildCube(0.5);

glTranslatef(0.0,0.0,1.0);

glutSoildCube(0.5);

glPopMatrix();

Đoạn mã trên lƣu ma trận modelview, thực hiện các phép biến hình cần thiết để vẽ đối tƣợng, sau đó trả lại ma trận modelview, xóa mọi phép biến hình đã thực hiệnlờ i gọi glPushMatrix(). Ở lần thực hiện biến hình tiếp theo, phép biến hình sẽ khôngảnh hƣở ng bở i các phép biến hình trƣớc. Nhƣ vậy có thể thấy stack ma trận có giá trị lớ n khi tạo ảo giác chuyển động OpenGL, vì khi đó các phép biến hình tƣơng tự nhau

sẽ đƣợ c lặp đi lặp lại vớ i các giá trị khác nhau.Mỗi loại ma trận có stack ma trận riêng. Chẳng hạn ma trận modelview có stack

riêng và ma trận chiếu có stack riêng. Khi gọi glPushMatrix(), thực chất là bản sao củama trận hiện tại đƣợc đẩy vào đỉnh stack ma trận của riêng nó, và ta có hai ma trận đơnvị trên đỉnh stack. Khi gọi glPopMatrix(), OpenGL loại bỏ bản sao, lúc này có thể đãbị thay đổi, và để lại ma trận gốc trên đỉnh stack.

Ví dụ :glViewport(0,0,(GLsizei)400,(GLsizei)400) ;

glMatrixMode(GL_PROJECTION) ;

glLoadIdentity() ;

gluPerspective(60.0,(GLfloat)400/(GLfloat)400,1.0,30

.0) ;

glMatrixMode(GL_MODELVIEW) ;

glLoadIdentity() ;

glTranslatef(0.0,0.0,-6.6) ;

glClearColor(1.0, 1.0, 1.0, 1.0);

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) ;

glPushMatrix() ;

glRotatef(20.0,1.0,1.0,0.0) ;

Page 48: DoAnTN_OPENGL

5/17/2018 DoAnTN_OPENGL - slidepdf.com

http://slidepdf.com/reader/full/doantnopengl 48/71

 

Phần 1 : Cơ sở lý thuyết –  Thƣ viện đồ họa OPENGL Trang 38

GVHD : Ths. Trịnh Thị Vân Anh SVTH : Đỗ Duy – Lớ p : D07CNPM1

glColor3f(0.0,0.0,0.0) ;

glPushMatrix() ;

glTranslatef(-2.0, 0.0, 0.0) ;

glutWireCube(0.5) ;

glPopMatrix() ;

glPushMatrix() ;

glTranslatef(0.0, 0.0, 4.0) ;

glutWireCube(0.5) ;

glPopMatrix() ;

glPushMatrix() ;

glTranslatef(2.0, 0.0, 0.0) ;

glutWireCube(0.5) ;

glPopMatrix() ;

glPushMatrix() ;

glTranslatef(0.0, 0.0, 4) ;

glutWireCube(0.5) ;

glPopMatrix() ;

glPopMatrix() ;

glutSwapBuffers() ;

Hình 28. Tạo cảnh 3D vớ i glTranslatef, glRotatef, glPushMatrix, glPopMatrix 

Page 49: DoAnTN_OPENGL

5/17/2018 DoAnTN_OPENGL - slidepdf.com

http://slidepdf.com/reader/full/doantnopengl 49/71

 

Phần 1 : Cơ sở lý thuyết –  Thƣ viện đồ họa OPENGL Trang 39

GVHD : Ths. Trịnh Thị Vân Anh SVTH : Đỗ Duy – Lớ p : D07CNPM1

5.3. Bộ đệm đôi 

Các cảnh 3D sẽ trở nên sống động khi bộ đệm đôi đƣợc dùng. Và trong trƣờ nghợp này, stack ma trân đặc biệt hữu dụng.Việc thiết kế  ảo giác chuyển động nhịpnhàng luôn là sự thách thức đối với ngƣờ i lập trình. Trƣớ c tiên, chƣơng trình cần phảicó khả năng vẽ 30 hình/ 1s, để tạo sự chuyển động uyển chuyển. Điều này đòi hỏi phầncứng có tốc độ cao và chƣơng trình đƣợ c thiết kế tốt.

Vớ i bộ đệm đôi, hai vùng nhớ  đƣợ c sử dụng để tạo ảo giác chuyển động. Mộtvùng chứa ảnh trên màn hình. Trong thờ i gian vùng bộ đệm này đang đƣợ c thể hiện,không lệnh vẽ nào đƣợ c sửa đổi nó. Vùng thứ hai đƣợ c sử dụng để chƣơng trình vẽ vào, nhƣng không đƣợ c thể hiện trên màn hình. Nên ngƣờ i dùng không thấy các thaotác vẽ. Sau khi việc vẽ hoàn tất, chƣơng trình chỉ đơn giản hóa đổi các bộ đệm

Các bộ đệm đôi trong OpenGL đƣợ c gọi là bộ đệm trƣớ c (bộ đệm không thấy

đƣợ c). Khi thiết lập bộ đệm đôi OpenGL, mọi lệnh vẽ luôn luôn đến bộ đệm sau khihiện hành, nhƣ vậy ngƣờ i dùng sẽ không thấy thao tác vẽ. Khi chƣơng trình vẽ xongảnh, nó hoán đổi bộ đệm trƣớc và sau để làm xuất hiện ảnh mới trên màn hình. Sau đóchƣơng trình tạo khung tiếp theo trong bộ đêm sau mớ i, rồi lại hoán đổi các bộ đệm.Quá trình này tiếp diễn trong suốt toàn bộ thờ i gian ảo giác chuyển động đƣợ c thựchiện, và việc hoán đổi giữa các bộ đệm đƣợ c thực hiện nhiều lần trong giây.

Trong thƣ viện GLUT có cung cấp lệnh glutSwapBuffer để thực hiện việc hoánđổi bộ đệm.

Page 50: DoAnTN_OPENGL

5/17/2018 DoAnTN_OPENGL - slidepdf.com

http://slidepdf.com/reader/full/doantnopengl 50/71

 

Phần 1 : Cơ sở lý thuyết –  Thƣ viện đồ họa OPENGL Trang 40

GVHD : Ths. Trịnh Thị Vân Anh SVTH : Đỗ Duy – Lớ p : D07CNPM1

CHƢƠNG 6 : ẢNH VÀ CÁC HIỆU Ứ NG CHỈ ẢNHOpenGL hỗ trợ hai loại đối tƣợng đồ họa. Loại đầu tiên là bitmap, là một mask

đơn sắc dùng để tạo cá thể đơn giản nhƣ các ký tự trong một font. Loại thứ hai là ảnh,

 bitmap đầy màu sắc, và có thể chứa đựng một hình tƣợ ng hay một bức tranh nhiều chitiết.

6.1. Thiết lập việc gán cấu trúc

Chúng ta cần gọi hàm glTexParameteri() để thiết lập các thông số khác nhaunhƣ : 

glTexParameteri(GL_TEXTURE_2D, GL_TEXTTURE_WRAP_S,GL_CLAMP);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,GL_CLAMP);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_NEAREST);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_NEAREST);

Hàm glTexParameteri() có 4 phiên bản. Các đối số của hàm gồm hằngxác địnhkiểu cấu trúc, thông số cần thiết lập, và giá trị thiết lập cho thông số. Đối số đầu tiên làGL_TEXTURE_1D cho cấu trúc một chiều, hay GL_TEXTURE_2D cho cấu trúc haichiều. GL_TEXTURE_2D, là ảnh hình chữ nhật, thƣờng đƣợ c sử dụng.

Đối số thứ hai cho OpenGL biết cách quản lý texture mapping dƣới các điềukiện nào đó. Ví dụ vớ i GL_TEXTURE_WRAP_S và GL_TEXTURE_WRAP_T,OpenGL dùng ảnh đơn hoặc đa cấu trúc, tƣơng ứng vớ i cấu trúc theo phƣơng nganghay thẳng đứng. Các thông số này phải thiết lập vớ i GL_CLAMP ( cho ảnh đơn ) hayvớ i GL_REPEAT ( cho mẫu lặp lại ). Khi dùng ảnh đơn cho đa giác, phải sử dụngGL_CLAMP. GL_TEXTURE_MAG_FILTER, GL_TEXTURE_MIN_FILTER xácđịnh cách phóng to hay thu nhỏ cáu trúc khi diện tích nơi đến lớn hơn hoặc nhỏ hơncấu trúc. Việc sử dụng GL_NEAREST vớ i các thông số này cho phép texture mappingnhanh và nhận đƣợ c kết quả sắc nét nhất. GL_NEAR thì chậm hơn do phải tính toán

màu sắc cho 1 pixel trên cơ sở trung bình của bốn pixel.Sau khi thiết lập các thông số cấu trúc, phải thiết lập môi trƣờ ng cấu trúc, tức là

xác định hàm cấu trúc nào mà OpenGL dùng tính toán các giá trị màu cho bề mặt cấutrúc. Việc này đƣợ c thực hiện vớ i lờ i gọi hàm glTexEnvi():

glTexEnvi(GL_TEXTURE_ENVI, GL_TEXTURE_ENVI_MODE,GLDECAL);

Hai đối số  đầu của hàm lần lƣợ t là GL_TEXTURE_ENVI vàGL_TEXTURE_ENVI_MODE, hay GL_MODULATE. Thông thƣờ ng GL_DECAL

đƣợ c sử dụng. Khi đó hàm thay thế các pixel nơi đến bằng cấu trúc. Hai hằng còn lạikết hợp nơi đến và các giá trị cấu trúc theo các cách khác nhau.

Page 51: DoAnTN_OPENGL

5/17/2018 DoAnTN_OPENGL - slidepdf.com

http://slidepdf.com/reader/full/doantnopengl 51/71

 

Phần 1 : Cơ sở lý thuyết –  Thƣ viện đồ họa OPENGL Trang 41

GVHD : Ths. Trịnh Thị Vân Anh SVTH : Đỗ Duy – Lớ p : D07CNPM1

Bƣớ c cuối cùng là khởi động texture mapping:

glEnable(GL_TEXTURE_2D);

Nếu cấu trúc 1 chiều thì sẽ là GL_TEXTURE_1D.

6.2. Định nghĩa các vertex và cấu trúc của chúng

Để thiết lập texture mapping có rất nhiều việc phải làm, nhƣng hầu hết đã đƣợ choàn tất ở trên. Các việc cong lại là trao cấu trúc cho OpenGL, định nghĩa các vertexđa giác và nêu quan hệ giữa chúng vớ i các tọa độ cấu trúc. Đoạn mã sau thể hiện điềuđó : 

glTexImage2D(GL_TEXTURE_2D,

0,

3,Width,

Height,

0,

GL_COLOR_INDEX,

GL_UNIGNED_BYTE,

pTextureBits);

glBegin(GL_POLYGON);

glTexCoord(0.0, 1.0);glVertex3f(-1.0, 1.0, 0.0);

glTexCoord(0.0, 0.0);

glVertex3f(-1.0, -1.0, 0.0);

glTexCoord(1.0, ..0);

glVertex3f(1.0, -1.0, 0.0);

glTexCoord(1.0, 1.0);

glVertex3f(1.0, 1.0, 0.0);

glEnd();

glFlush();

Trong đoạn mã trên, lờ i gọi glTexImage2D cho OpenGL biết nơi chứa cấu trúccần sử dụng. Đối số đầu tiên phải là GL_TEXTURE_2D. Đối số thứ hai là cho biết chỉ có 1 mức phân giải - ảnh đơn cấu trúc, trừ khi dùng vớ i ảnh đa cấu trúc, còn lại giá trị 0 dùng cho đối số này. Đối số thứ ba cho biết thành phần màu trong cấu trúc. Trongtrƣờ ng hợ p dùng ảnh RGB, giá trị này là 3. Đối số thứ  tƣ và năm là chiều rộng vàchiều cao cấu trúc. Đối số thứ sáu xác định chiều rộng đƣờ ng viền cấu trúc, là 0 hay 1,

thƣờ ng là 0. Sau khi trao cấu trúc cho OpenGL, ta phải định nghĩa các vertex của đagiác cùng lúc cho biết quan hệ giữa chúng vớ i các tọa độ cấu trúc bằng lờ i gọi hàm

Page 52: DoAnTN_OPENGL

5/17/2018 DoAnTN_OPENGL - slidepdf.com

http://slidepdf.com/reader/full/doantnopengl 52/71

 

Phần 1 : Cơ sở lý thuyết –  Thƣ viện đồ họa OPENGL Trang 42

GVHD : Ths. Trịnh Thị Vân Anh SVTH : Đỗ Duy – Lớ p : D07CNPM1

glTexCoord2f(). Hai đối số này là các tọa độ S và T của cấu trúc ( S và T tƣơng tự nhƣ X và Y).

Page 53: DoAnTN_OPENGL

5/17/2018 DoAnTN_OPENGL - slidepdf.com

http://slidepdf.com/reader/full/doantnopengl 53/71

 

Phần 2 : Xây dựng ứng dụng mô phỏng Trang 43

GVHD : Ths. Trịnh Thị Vân Anh SVTH : Đỗ Duy – Lớ p : D07CNPM1

PHẦN 2 : XÂY DỰ NG Ứ NG DỤNG MÔ PHỎNG

CHƢƠNG 1 : GIỚ I THIỆU BÀI TOÁN1.1. Giớ i thiệu

Hiện nay giao thông đang là vấn đề nhức nhối của xã hội. Lƣợng ngƣờ i thamgia giao thông quá lớn trong khi cơ sở hạ tầng không đáp ứng đƣợc. Hơn nữa ý thứccủa nhiều ngƣờ i tham gia giao thông còn hạn chế, trong đó có những nguyên nhân chủ quan và khách quan, chủ quan có thể do hiểu luật nhƣng không chịu chấp hành,nguyên nhân khách quan có thể do không nhớ luật và cách thực hiện luật khi gặp cácbiển hiệu giao thông.

Phần xây dựng ứng dụng của đồ án sẽ xây dựng một game 3D về đua xe ô tôtheo luật nhằm góp phần giúp cho ngƣời chơi có thể hiểu hơn về luật giao thông,những gì mà họ cần phải làm theo trên đƣờng đi. 

1.2. Khái quát về ứ ng dụng

Đây là một game tính điểm.

 Ngƣời chơi sẽ điều khiển một chiếc xe ô tô đi trên đƣờng đua cùng vớ i các xekhác, trên đƣờng đi sẽ có các biển báo hiệu giao thông nhƣ : 

  Các biển báo cấm

…..   Các biển báo chỉ dẫn

…..

Để tăng phần hấp dẫn và mang tính giải trí trên đƣờ ng đi sẽ có những đối tƣợ ngcó thể ăn đƣợc khi cho xe đi qua và đƣợ c cộng điểm, và cả những chƣớ ng ngại vật cản

trở  trên đƣờ ng.Trò chơi chú trọng tính an toàn và tính chấp hành các biển hiệu giao thông của

các xe đua tham gia trên đƣờ ng, nên những xe chấp hành đúng luật sẽ đƣợc thƣở ngnhiều điểm cho mình.

1.3. Phân tích

1.3.1. Các thành phần cơ bản trong trò chơi 

  Vòng lặp trò chơi : Quản lý vòng đờ i, trạng thái của trò chơi.   Logic : Phần xử lý của trò chơi, xử lý thuật toán, trí thông minh nhân tạo, tƣơng

tác với ngƣời chơi. 

Page 54: DoAnTN_OPENGL

5/17/2018 DoAnTN_OPENGL - slidepdf.com

http://slidepdf.com/reader/full/doantnopengl 54/71

 

Phần 2 : Xây dựng ứng dụng mô phỏng Trang 44

GVHD : Ths. Trịnh Thị Vân Anh SVTH : Đỗ Duy – Lớ p : D07CNPM1

  Đồ họa : Phần thể hiện của trò chơi, hình ảnh của trò chơi đƣợ c quyết định quađồ họa.

  Âm thanh của trò chơi : Là phần không thể thiếu, nó giúp trò chơi trở nên sinhđộng hơn. 

1.3.2. Cấu trúc của trò chơi. 

1.3.2.1. Vòng lặp trò chơi. 

Vòng lặp trò chơi chính là trung tâm của trò chơi. Trò chơi khác hẳn so vớ i các ứngdụng hƣớ ng sự kiện khác, ngay cả khi không có sự kiện xuất nhập, trò chơi vẫn hoạtđộng và đáp ứng liên tục để tạo ra các hiệu ứng hoạt động của các nhân vật, đối tƣợ ngtrong trò chơi. 

Công việc chính của vòng lặp trò chơi: 

  Cập nhật, tính toán trạng thái hiện tại (Xử lý các sự kiện đầu vào (nhƣ

các sự kiện bàn phím, chuột tác động lên đối tƣợ ng))  Vẽ các nhân vật, đối tƣợ ng, giao diện màn hình.

Hình 29. Biểu diễn vòng lặp trò chơi 

Ví dụ : Trong trò chơi này, trạng thái kết thúc khi xe của ngƣời chơi về tới đíchvà nếu chƣa đạt trạng thái này nó sẽ tiếp tục nhận các sự kiện và sử lý chúng rồi vẽ lạitrạng thái, vị trí của chiếc xe.

1.3.2.2. Cấu trúc trò chơi. 

Một trò chơi có thể bao gồm nhiều giao diện khác nhau.

Page 55: DoAnTN_OPENGL

5/17/2018 DoAnTN_OPENGL - slidepdf.com

http://slidepdf.com/reader/full/doantnopengl 55/71

 

Phần 2 : Xây dựng ứng dụng mô phỏng Trang 45

GVHD : Ths. Trịnh Thị Vân Anh SVTH : Đỗ Duy – Lớ p : D07CNPM1

Ví dụ: Màn hình load game, bảng chọn chính, mục giớ i thiệu trò chơi, mụchƣớ ng dẫn, mục điểm cao…Để tích hợp điều này vào vòng lặp chính, chúng ta sẽ cầncó một biến trạng thái lƣu lại giao diện trò chơi, rồi theo đó xử lý chúng.

Dựa vào biến trạng thái chúng ta có thể lƣu lại giao diện hiện tại và xử lý trạngthái tƣơng ứng, tƣơng tự nhƣ hàm cập nhật hoặc hàm vẽ. Hoặc chúng ta cũng có thể dựa vào biến trạng thái để loại bỏ một giao diện nhƣ giao diện Load game chẳng hạn,vì khi đã vào game thì chúng ta sẽ không cần nhớ  đến nó nữa.

Trong trò chơi này, sẽ có các giao diện sau:

  Giao diện load game : Thực hiện load game trong một khoảng thời gian trƣớ ckhi vào game

  Giao diện cho menu chính : Hiển thị các mục để ngƣời chơi có thể truy xuất cácmục khác trong trò chơi. 

  Giao diện nhập thông tin ngƣời chơi : Nhập và lƣu trữ thông tin của ngƣời chơi. Để dùng cho việc lƣu và tính điểm.  Game : Giao diện chính, nơi mà ngƣời chơi chơi và ghi điểm. Sau khi ngƣờ i

chơi chọn Newgame thì giao diện này sẽ xuất hiện  Highscore : Ghi lại điểm của các ngƣời chơi và hiển thị theo thứ tự giảm dần

của điểm  Infor : Giớ i thiệu trò chơi, hƣớ ng dẫn cách chơi và tính điểm.  GameOver : Kết thúc trò chơi khi ngƣời chơi không thể về đích trong top 3.

Hiện thông báo gameover ngay trên nền game.

Chúng ta có thể biêu diễn đơn giản các các giao diện trò chơi nhƣ sau: 

Hình 30. Giao diện của trò chơi 

Page 56: DoAnTN_OPENGL

5/17/2018 DoAnTN_OPENGL - slidepdf.com

http://slidepdf.com/reader/full/doantnopengl 56/71

 

Phần 2 : Xây dựng ứng dụng mô phỏng Trang 46

GVHD : Ths. Trịnh Thị Vân Anh SVTH : Đỗ Duy – Lớ p : D07CNPM1

CHƢƠNG 2 : THIẾT KẾ CHƢƠNG TRÌNH 

2.1. Nội dung và các chức năng chính của trò chơi 

2.1.1. Nội dungTrò chơi mô phỏng một chiếc xe ô tô đi trên đƣờ ng vớ i những biển hiệu giao

thông cần tuân thủ. Trên đƣờng đi đối tƣợ ng ô tô không những phải chú ý đến các biểnhiệu giao thông mà còn phải chú ý đến những đồ vật có thể ăn đƣợ c ở  trên đƣờng đi vànhững chƣớ ng ngại vật sẽ cản trở  trên đƣờ ng.

2.1.2. Các chức năng chính của trò chơi 

  Newgame :Để có thể bắt đầu chơi ngƣời chơi cần chọn vào chức năng newgame để chƣơng

trình khở i tạo một game mới để ngƣờ i chơi chính thức bắt đầu chơi, ngƣời chơi có thể chọn “Enter” để chọn newgame và bắt đầu trò chơi.   Thông tin ngƣời chơi: 

Sau khi chon Newgame 1 giao diện mớ i hiện ra bắt ngƣời chơi phải nhập tên của mìnhvào và nhấn “ Enter ” để có thể bắt đầu chơi.   Pause :

Khi ngƣời chơi vào trò chơi vì một lý do nào đó muốn dừng trò chơi lại ( pausegame ) ngƣời chơi sẽ bấm phim “space –   phím cách”. 

  Full Screen :

Màn hình sẽ đƣợ c mở rộng - full screen giúp ngƣời chơi có màn hình quan sáttốt hơn, ngƣời chơi bấm phím “F12” để mở rộng màn hình, và ngƣợ c lại khi muốn thunhỏ nó lại.

  Dịch chuyển đối tƣợng xe do mình điều khiểnChức năng cho phép ngƣời chơi dịch chuyển xe theo ý muốn:

  Sang trái :  Sang phải :  Giảm tốc : 

Tăng tốc : Nhƣ dƣớ i :

  Âm thanh khi chơi game  Âm thanh nền game và theo sự kiện.  Hiển thị minimap :

Page 57: DoAnTN_OPENGL

5/17/2018 DoAnTN_OPENGL - slidepdf.com

http://slidepdf.com/reader/full/doantnopengl 57/71

 

Phần 2 : Xây dựng ứng dụng mô phỏng Trang 47

GVHD : Ths. Trịnh Thị Vân Anh SVTH : Đỗ Duy – Lớ p : D07CNPM1

Khi ngƣời chơi muốn biết mình đang ở  đâu, vị trí so với các xe khác nhƣ thế nào thì minimap thực sự là một công cụ hữu ích, ngƣời chơi có thế bấm phím “M” đêbật tắt minimap.

  Tính điểm :  Vớ i chức năng tính điểm vớ i mỗi đồ vật mà ngƣời mà xe ăn đƣợ c sẽ đƣợ c

cộng 5 điểm sau khi ăn đồ vật này sẽ biến mất (Đối tƣợng đồ vật này quay),ngƣợ c lại sẽ bị trừ 5 điểm khi va phải các chƣớ ng ngại vật và chúng khôngbiến mất sau va chạm ( Đối tƣợng này đứng yên).

  Đặc biệt do là một game chú trọng đến tính chấp hành luật giao thông lêntrong quá trình tham gia trò chơi ngƣời chơi sẽ nhận đƣợ c phần điểm lớ n khichấp hành đúng luật :

  30 điểm cho mỗi lần chấp hành đúng. Thế nào là chấp hànhđúng. Ví dụ

khi gặp bi

ển

Thì ngƣời chơi ko đƣợ c bấm còi trên đoạn đƣờ ng bắt đầu từ khicó biển báo này đến khi gặp 1 biển báo khác.  Trừ 30 điểm cho hành vi không chấp hành nghiêm.

  Cũng mang tính đua tranh trên đƣờng ngƣời chơi không những phải chấphành luật, ăn thật nhiều đồ vật mà còn phải đảm bảo tốc độ để xe của mình

có thể về đích ở vị trí cao nhất.  500 điểm khi về nhất.  400 điểm khi về nhì.  300 điểm khi về ba.  200 điểm cho các thứ tự còn lại.

  Độ khó của trò chơi : 

Khi ngƣời chơi đã lọt đƣợ c vào top 3 trong lần đua đầu tiên thì sẽ chuyển sang 1 đƣờng đua mớ i với các chƣớ ng ngại mớ i, và quy tắc tínhđiểm cũng tƣơng tự nhƣ trên nhƣng các chƣớ ng ngại xuất hiện nhiều hơn. 

  Kết thúc :  Khi ngƣời chơi không thể về đích trong top 3, hiển thị giao diện GameOver   Ngƣợ c lại ngƣời chơi sẽ đƣợ c chuyển sang mức độ tiếp theo.

2.2. Đồ họa trong game

Các đối tƣợng trong game đƣợ c vẽ bằng thƣ viện đồ họa OpenGL.Sau đây làcác đối tƣợng đồ họa chính, vì là vẽ trong không gian 3D.

  Vẽ một nền game : Tại đây chúng ta sẽ vẽ đƣờ ng, lề đƣờ ng.

Sử dụng một bản text lƣu ma trận các giá trị 0, 1, 2, 4, 5. Ví dụ cụ thể nhƣ sau : 

Page 58: DoAnTN_OPENGL

5/17/2018 DoAnTN_OPENGL - slidepdf.com

http://slidepdf.com/reader/full/doantnopengl 58/71

 

Phần 2 : Xây dựng ứng dụng mô phỏng Trang 48

GVHD : Ths. Trịnh Thị Vân Anh SVTH : Đỗ Duy – Lớ p : D07CNPM1

Vớ i các giá trị 0 nằm đƣợ c bao quanh bở i các giá trị 1,2 chúng ta sẽ vẽ nền đƣờ ng và xe của ngƣời chơi chỉ có thể di chuyển trên các giá trị này. Cònnhững giá trị 0 bên ngoài có thể đƣợ c sử dụng làm khoảng không gian để vẽ cácđối tƣợng khác cho game sinh động hơn, chúng đƣợc ngăn cách bở i các giá trị 1để bảo đảm xe không thê đi vào. 

  Vớ i các giá trị 1 chúng ta sẽ vẽ lề đƣờ ng.  Vớ i các giá trị 2 chúng ta sẽ vẽ 1 biển hiệu, các biển hiệu này nằm trên

khoảng không gian vẽ lề đƣờ ng.  Vớ i các giá trị 3 chúng ta sẽ vẽ một đối tƣợ ng có thể ăn đƣợc để  tăng

điểm đối tƣợ ng này nằm trên mặt đƣờ ng.  Vớ i các giá trị 4 chúng ta sẽ vẽ các đối tƣợ ng vật cản cũng nằm trên mặt

đƣờ ng.  Vớ i các giá trị 5 chúng ra sẽ vẽ đích về.

  Vẽ carTrên nền đƣờ ng các xe sẽ đƣợ c vẽ bằng tập các vertex và ban đầu xe đƣợ c

khở i tạo tại hàng các giá trị 0 cuối cùng.  Vẽ các đối tƣợ ng vật cản ăn đƣợc và không ăn đƣợ c.  Minimap

Một map nhỏ ánh xạ theo tỉ lệ vớ i ma trận map ở  trên thu nhỏ ở  góc dƣớ imàn hình nó hiển thị map cho xe và vị trí của các xe khác. Minimap đƣợ c vẽ trênmàn hình 2D Oxy.

Page 59: DoAnTN_OPENGL

5/17/2018 DoAnTN_OPENGL - slidepdf.com

http://slidepdf.com/reader/full/doantnopengl 59/71

 

Phần 2 : Xây dựng ứng dụng mô phỏng Trang 49

GVHD : Ths. Trịnh Thị Vân Anh SVTH : Đỗ Duy – Lớ p : D07CNPM1

2.3. Va chạm và xử lý va chạm

Va chạm xảy ra khi xe của ngƣời chơi va vào các đối tƣợ ng cản trở  trên đƣờ ngđi nhƣ các chƣớ ng ngại vật, lề đƣờ ng, va chạm vớ i các xe khác hoặc xuyên va chạmvớ i những chƣớ ng ngại có thể ăn đƣợc để tăng điểm.

  Nhƣ trên đã định nghĩa một ma trận đồ họa, thực chất mỗi giá trị 0,1 tƣơng ứngvớ i các miền giá trị để xác định danh giớ i giữa mặt đƣờ ng và lề đƣờ ng. Khoảngcác giá trị 0 sẽ tƣơng ứng vớ i giớ i hạn các tọa độ nhất định, ví dụ nhƣ giớ i hạncủa một đoạn thẳng AB, nó đƣợ c giớ i hạn bởi 2 điểm A(xa, ya), B(xb,yb).Tƣơng tự nhƣ vậy ở  đây các giá trị 0 cũng có bề rộng đƣợ c giớ i hạn bở imiền mà các giá trị 1 đã phân ra: 

Ở đây x11 và x12 chính là khoảng giá trị theo trục x sẽ giớ i hạn mặtđƣờ ng và mặt đƣờ ng chỉ có thể vẽ đƣợ c khi nó nằm trong khoảng x11  – x12.Do đó xe của chúng ta cũng vậy, khi mà nó đƣợ c vẽ trên nền đƣờ ng tức nó cũngsẽ bị giớ i hạn bở i x11 –  x12 do đó khi mà muốn dịch chuyển ngang theo trục xthì sẽ bị giớ i hạn bở i x11 –  x12, đó chính là cách xử lý để xe không thể ra đƣợ ckhỏi mặt đƣờ ng.

Page 60: DoAnTN_OPENGL

5/17/2018 DoAnTN_OPENGL - slidepdf.com

http://slidepdf.com/reader/full/doantnopengl 60/71

 

Phần 2 : Xây dựng ứng dụng mô phỏng Trang 50

GVHD : Ths. Trịnh Thị Vân Anh SVTH : Đỗ Duy – Lớ p : D07CNPM1

Nếu chúng ta có môt map nhƣ thế này thì sao:

Nền đƣờ ng chính là các giá trị 0 mà xe có thể đi, tuy nhiên giớ i hạn theox11 – x12 sẽ bị phá bỏ khi đến z21 – z22 vì lúc này xe có thể đi trên đƣờ ng giớ ihạn bở i z12 – z13 và không còn phụ thuộc vào giớ i hạn x nữa, nhƣng cách xử lý rất đơn giản, khi đó chúng ta sẽ xoay toàn bộ hình 90o theo trục y để chuyểntrục z về trục x và ngƣợ c lại, hoặc chuyển sự giớ i hạn về trục z khi miền giá trị 

giớ i hạn x không còn nữa.Mỗi giá trị 0, hay 1 đƣợc xác định bằng một diện tích nhất định,ví dụ giátrị 0 đầu tiên từ  dƣới lên, bên trái đƣợc xác định bằng 4 tọa độ không gian01(x1,y1,z1), 02(x2,y1,z1), 03(x2, y3, z3), 04(x1, y3, z3).

Đây chính là cơ sở  để có thể tính toán chính xác tọa độ nhờ cách quyđịnh phạm vi các giá trị chúng ta có thể xử lý đƣợ c các va chạm.

  Vớ i các va chạm chƣớ ng ngại vật nhờ  có quy định giá trị tƣơng ứng vớ i nó là 4và các giá trị ăn đƣợ c là 3, chúng ta sẽ cho phép xe đi qua các miền đƣợ c xácđinh bở i các giá trị 3 và không cho qua các miền giá trị xác định bở i giá trị 4nhƣ kiểu một miền giá trị giớ i hạn.

Page 61: DoAnTN_OPENGL

5/17/2018 DoAnTN_OPENGL - slidepdf.com

http://slidepdf.com/reader/full/doantnopengl 61/71

 

Phần 2 : Xây dựng ứng dụng mô phỏng Trang 51

GVHD : Ths. Trịnh Thị Vân Anh SVTH : Đỗ Duy – Lớ p : D07CNPM1

2.4. Âm thanh và hình ảnh sử dụng trong game

2.4.1. Âm thanh

Các tập tin âm thanh đƣợ c sử dụng trong game là các file âm thanh dạng

“.wav”. Tập tin wave là một dạng tập tin dùng để lƣu trữ dữ liệu âm thanh thô (dạngsóng) và nó là một trong những định dạng phổ biến nhất của hệ điều hành windows.Các tập tin wave thuộc chuẩn RIF (Resource Interchange File Fomat – dạng tập tin tàinguyên có thể trao đổi). Có hai kiểu cấu trúc tệp tin wave là cấu trúc dạng nén và dạngchuẩn, chúng ta xét dạng chuẩn của nó:

Cấu trúc của tập tin wave chuẩn : 3 khối

  Khối mô tả RIFF : xác định dạng RIFF và có kích thƣớc 12 byte. Trong đó 4 byte đầu tiên chứa chuỗi “RIFF”, 4 byte cuối chứa chuỗi “WAVE”. 

  Khối thuộc tính “fmt” : xác định các thuộc tính của dữ liệu am thanh và có kíchthƣớc 24 byte, trong đó 4 byte đầu tiên chứa chuỗi “fmt”. 

  Khối dữ liệu “data” : 4 byte đầu chứa chuỗi “data”. 

Các loại âm thanh dùng trong game:

  Âm thanh nền game : Gồm các âm thanh nền cho phần load game, menu game,trong game, gameover.

  Âm thanh sự kiện : Ví dụ  nhƣ khi ngƣời chơi điều khiển xe tăng ga thì âmthanh của động cơ xe sẽ to lên, âm thanh này có nguồn phát đi cùng vớ i vị trí của xe… 

  Âm thanh còi xe : Khi ngƣời chơi bấm còi xe chẳng hạn.  Âm thanh va chạm hay ăn các đối tƣợng trên đƣờ ng.

2.4.2. Hình ảnh sử dụng trong game

Các hình ảnh sử dụng trong game là tệp tin “.bmp” 

Cấu trúc file .bmp :

Header (54 byte) + Bảng màu (nếu có ) + Data (màu từng điểm ảnh).

Header gồm 2 phần :

  BitmapHeader : chứa ký tự “BM”, kích thƣớ c file..  BitmapInfor : Chứa các thông tin file nhƣ chiều rộng, cao, số  bit cho 1 pixel… 

Trong game các hình ảnh này sẽ đƣợ c sử dụng để vẽ các giao diện load game,menugame…trong game thì đƣợ c dùng nhiều trong vẽ xe, vẽ nền đƣờ ng, vẽ các biển

 báo… 

2.5. Xây dự ng các class

  Class Check_Wave:  check_wave() : Kiểm tra đầu vào file âm thanh, có phải là file có định

dạng RIFF và là kiểu file WAVE hay không.

  Class Load_Sounds:

Page 62: DoAnTN_OPENGL

5/17/2018 DoAnTN_OPENGL - slidepdf.com

http://slidepdf.com/reader/full/doantnopengl 62/71

 

Phần 2 : Xây dựng ứng dụng mô phỏng Trang 52

GVHD : Ths. Trịnh Thị Vân Anh SVTH : Đỗ Duy – Lớ p : D07CNPM1

  load_sound() : Load sound âm thanh.  set_position() : Thiết lập vị trí nguồn phát âm.  set_velocity() : Thiết lập tốc độ nguồn phát âm.  set_listener_position() : Thiết lập vị trí listener.  set_listener_velocity() : Thiết lập tốc độ listener.  set_listener_orientation() : Thiết lập định hƣớ ng listener.  play_sound() : Play sound.  pause_sound() : Pause sound.  stop_sound() : Stop sound.  kill_sound() : Xóa bộ nhớ  mà khi phát âm thanh nó đã chiếm, giải phóng

tài nguyên.  Class Check_Bmp:

  check_bmp() : Kiểm tra hình ảnh đƣa vào có phải là file .bmp haykhông.

  Class Load_Image:  loadbmp() : Load image.

  Class Game_Loading :  loading_loadtexture() : Load image và convert texture.  draw_loading() : Vẽ màn hình load game.

  Class Display_Font : Định nghĩa cách in ký tự trên màn hình OpenGL dùng choviệc ngƣời dùng đánh tên vào trƣớ c khi bắt đầu chơi, hiển thị thông tin của

game.  set_font() : Định nghĩa font chữ sẽ thể hiện trên màn hình game infor…   set_color_font() : Thiết lập màu chữ hiển thị font.  output_font(): Hiển thị các ký tự lên màn hình.

  Class Game_HighScore:  highscore_loadtexture : Ảnh nền highscore.  highscore() : Hiển thị thông tin về điểm cho ngƣời chơi.

  Class Game_Infor : Giớ i thiệu game và hƣớ ng dẫn chơi.  infor_loadtexture() : Load ảnh nền.  draw_infor() : Hiển thị các thông tin lên màn hình.

  Class Used_Infor : Cho phép ngƣời chơi nhập tên của mình, lƣu tên của ngƣờ ichơi trƣớ c khi bắt đầu chơi.

  define_char() : Định nghĩa các ký tự  bàn phím để có thể đánh vào tênngƣời chơi.

  input_used() : Nhập tên ngƣời chơi.  Class Game_Menu: Xây dựng giao diện menu game.

  menu_loadtexture() : Load ảnh nền. 

draw_menu() : Vẽ màn hình menu.  Class Game_Draw : Định nghĩa các hàm vẽ chính trong game.

Page 63: DoAnTN_OPENGL

5/17/2018 DoAnTN_OPENGL - slidepdf.com

http://slidepdf.com/reader/full/doantnopengl 63/71

 

Phần 2 : Xây dựng ứng dụng mô phỏng Trang 53

GVHD : Ths. Trịnh Thị Vân Anh SVTH : Đỗ Duy – Lớ p : D07CNPM1

  draw_loadtexture();  draw_map() : Vẽ nền game : mặt đƣờ ng, lề…   draw_box_1(): Vẽ các đối tƣợ ng vật cản.  draw_box_2() : Vẽ các đối tƣợng ăn đƣợc để tính điểm.  draw_car() : Vẽ xe.  draw_speech() : Hiển thị và cập nhật tốc độ.  draw_point() : Hiển thị điểm và cập nhật.  draw_minimap() : Hiển thị minimap.  draw_gameover():

  Class Game_Traffic : Thực hiện tính toán, cập nhật các thông số dữ liệu  point() : Tính điểm.  collision() : Xử lý, tính toán khi có va chạm.

  update_car() : Cập nhật tọa độ xe.  update_map() : Cập nhật minimap.

  Class Car : Thiết lập màu sắc, speech, tọa độ xe.  setColor().  getColor().  setspeech().  getspeech().  setoxyz().  getoxyz().

Page 64: DoAnTN_OPENGL

5/17/2018 DoAnTN_OPENGL - slidepdf.com

http://slidepdf.com/reader/full/doantnopengl 64/71

 

Phần 2 : Xây dựng ứng dụng mô phỏng Trang 54

GVHD : Ths. Trịnh Thị Vân Anh SVTH : Đỗ Duy – Lớ p : D07CNPM1

2.6. Quan hệ giữ a các lớ p

Hình 31. Quan hệ giữa các lớ p

Page 65: DoAnTN_OPENGL

5/17/2018 DoAnTN_OPENGL - slidepdf.com

http://slidepdf.com/reader/full/doantnopengl 65/71

 

Phần 2 : Xây dựng ứng dụng mô phỏng Trang 55

GVHD : Ths. Trịnh Thị Vân Anh SVTH : Đỗ Duy – Lớ p : D07CNPM1

CHƢƠNG 3 : CÀI ĐẶT CHƢƠNG TRÌNH 3.1. Môi trƣờ ng lập trình

Sử dụng Visual Studio 2010 làm môi trƣờ ng lập trình.

Ngôn ngữ sử dụng C++.3.2. Cài đặt thƣ viện lập trình

Chứa các thƣ viện cần thiết cho việc lập trình và tính toán

  Trong đó chú ý đến thƣ viện đồ họa OpenGL :

<gl/glut.h>

<gl/glaux.h>

  Thƣ viện glaux.h sẽ đƣợ c dùng cho việc đọc file .bmp

Chú ý : Để sử dụng đƣợc thƣ viện này cần chỉ đƣờ ng dẫn đến glaux.lib:

#pragma comment (lib, “glaux.lib”);

  Thƣ viện âm thanh OpenAL:<al.h><alc.h><al/alut.h>

Chú ý : Để sử dụng đƣợc thƣ viện âm thanh cần chỉ đƣờ ng dẫn đến OpenAl32.lib vàalut.lib:

#pragma comment(lib, “OpenAl32.lib”); 

#pragma comment(lib, “alut.lib”); 3.3. Xây dự ng các tập tin âm thanh và hình ảnh

Các file âm thanh .wav chứa trong thƣ mục “sound” 

Các file image .bmp chứa trong thƣ mục “image” 

3.4. Giao diện trò chơi 

  Giao diện load game

Page 66: DoAnTN_OPENGL

5/17/2018 DoAnTN_OPENGL - slidepdf.com

http://slidepdf.com/reader/full/doantnopengl 66/71

 

Phần 2 : Xây dựng ứng dụng mô phỏng Trang 56

GVHD : Ths. Trịnh Thị Vân Anh SVTH : Đỗ Duy – Lớ p : D07CNPM1

Hình 32. Load game

  Giao diện menu game

Hình 33. Menu game

Page 67: DoAnTN_OPENGL

5/17/2018 DoAnTN_OPENGL - slidepdf.com

http://slidepdf.com/reader/full/doantnopengl 67/71

 

Phần 2 : Xây dựng ứng dụng mô phỏng Trang 57

GVHD : Ths. Trịnh Thị Vân Anh SVTH : Đỗ Duy – Lớ p : D07CNPM1

Mô phỏng các giao diện khác:

  Giao diện highscore

Hình 34. Highscore

  Giao diện game infor:

Hình 35. Game infor

  Giao diện nhập thông tin ngƣời chơi 

Page 68: DoAnTN_OPENGL

5/17/2018 DoAnTN_OPENGL - slidepdf.com

http://slidepdf.com/reader/full/doantnopengl 68/71

 

Phần 2 : Xây dựng ứng dụng mô phỏng Trang 58

GVHD : Ths. Trịnh Thị Vân Anh SVTH : Đỗ Duy – Lớ p : D07CNPM1

Hình 36. Thông tin ngƣời chơi 

  Giao diện game

Hình 37. Giao diện game

 Giao diện gameover

Page 69: DoAnTN_OPENGL

5/17/2018 DoAnTN_OPENGL - slidepdf.com

http://slidepdf.com/reader/full/doantnopengl 69/71

 

Phần 2 : Xây dựng ứng dụng mô phỏng Trang 59

GVHD : Ths. Trịnh Thị Vân Anh SVTH : Đỗ Duy – Lớ p : D07CNPM1

Hình 38. Game Over.

Page 70: DoAnTN_OPENGL

5/17/2018 DoAnTN_OPENGL - slidepdf.com

http://slidepdf.com/reader/full/doantnopengl 70/71

 

Phần 2 : Xây dựng ứng dụng mô phỏng Trang 60

GVHD : Ths. Trịnh Thị Vân Anh SVTH : Đỗ Duy – Lớ p : D07CNPM1

KẾT LUẬN

Với thƣ viện đồ họa OpenGL chúng ta có thể vẽ các hình nhƣ điểm, đa giác,

tam giác…. Thêm nữa có thể phối hợ p các hình này để vẽ các kiểu hình phức tạp hơn.Không những thế OpenGL còn cung cấp đầy đủ các yếu tố nhƣ màu sắc, ánh sáng…từ đó chúng ta có thể thao tác và làm việc hiệu quả vớ i các ứng dụng đồ họa để đem lạinhững hình ảnh sinh động, đa màu sắc trong thế giớ i ba chiều. Sự hỗ trợ mạnh mẽ nàykhiến OpenGL trở thành một sự lựa chọn tốt cho những sản phẩm cần đến sự góp mặtcủa đồ họa. Đề tài cũng đã phân tích đƣợ c những hỗ trợ  cơ bản mà OpenGL cung cấp.Hƣớ ng phát triển tƣơng lai cho phần ứng dụng là có thể chạy ứng dụng trên web, đồ họa đẹp hơn, sinh động hơn... Tuy nhiên do thời gian và năng lực có hạn nên cũngkhông tránh khỏi những thiếu sót em mong thầy cô và các bạn có những đóng góp để 

đồ án đƣợ c hoàn thiện hơn. 

Page 71: DoAnTN_OPENGL

5/17/2018 DoAnTN_OPENGL - slidepdf.com

http://slidepdf.com/reader/full/doantnopengl 71/71

 

Phần 2 : Xây dựng ứng dụng mô phỏng Trang 61

GVHD : Ths. Trịnh Thị Vân Anh SVTH : Đỗ Duy – Lớ p : D07CNPM1

DANH MỤC TÀI LIỆU THAM KHẢO

Tiếng Việt:

1. Lê Phong, Hƣớ ng dẫn lập trình OpenGL căn bản.2. Tìm hiểu thƣ viện đồ họa OpenGL.

Tiếng Anh:

1. Dave Shreiner The Khronos OpenGL ARB Working Group, OpenGL ProgrammingGuide Seventh Edition, The Offical Guide to Learning OpenGL, Versions 3.0 and3.1.

2. Mark J.Kilgard, The OpenGL Utility Toolkit(GLUT) Programming Interface.

3. Grain Hiebert, Keith Charley, Peter Harrison, Jean-Marc Jot, Daniel Peacock, Jean-Michel Trivi, and Carlo Vogelsang, OpenAl Programmer’s Guide, OpenALVersions 1.0 and 1.1.

Website tham khảo:

1. OpenGL : http://vi.wikipedia.org/wiki/OpenGL2. Game C++ for Newbie : https://sites.google.com/site/sbskit/gamefornewbie/ 3. OpenAL Tutorial :

http://www.edenwaith.com/products/pige/tutorials/openal.php#code

4. OpenGL tutorial : http://www.videotutorialsrock.com/