OpenGL – Open Graphic Library OpenGL là bộ thư viện đồ họa có khoảng 150 hàm giúp xây dựng các đối tượng và giao tác cần thiết trong các ứng dụng tương tác 3D. Tuy nhiên OpenGL không hỗ trợ + Các hàm nhập xuất hay thao tác trên window, + Các hàm cấp cao để xây dựng các mô hình đối tượng, thay vào đó, người dùng phải tự xây dựng từ các thành phần hình học cơ bản ( điểm, đoạn thẳng, đa giác).
Trang 1BÀI 3
LẬP TRÌNH ĐỒ HỌA 3D
VỚI OPENGL
Ths Nguyễn Xuân Hồng
Trang 2Vẽ mô hình 3D Inventor
Visual C++
OpenGL DirectX
Thư viện đồ họa
Robot Simulator
Software
Kích thước, hình ảnh, sơ đồ,…
Data files (q, v, a)
STL files
Bắt đầu
Export
Import Load
Solve
Connect
Add-in
Robot Simulator ProgrammingDimensions
1 2
3
4
4
4 5
6
6 A
LẬP TRÌNH ĐỒ HỌA 3D VỚI OPENGL
Trang 3HUST 9/20/2015 3
MỤC TIÊU
Có hiểu biết cơ bản về thư viện đồ họa OpenGL.
Khởi tạo được các ứng dụng MFC sử dụng OpenGL.
Nắm được một số khái niệm trong OpenGL.
Trang 4Các chương trình OpenGL
Các khái niệm cơ bản
trong OpenGL
NỘI DUNG
Trang 5Các chương trình OpenGL
Các khái niệm cơ bản
trong OpenGL
NỘI DUNG
Trang 6HUST 9/20/2015 6
Lập trình OpenGL
OpenGL – Open Graphic Library
OpenGL là bộ thư viện đồ họa có khoảng 150 hàm giúp xây dựng
các đối tượng và giao tác cần thiết trong các ứng dụng tương tác 3D.
Tuy nhiên OpenGL không hỗ trợ
+ Các hàm nhập xuất hay thao tác trên window, + Các hàm cấp cao để xây dựng các mô hình đối tượng, thay vào
đó, người dùng phải tự xây dựng từ các thành phần hình học cơ bản ( điểm, đoạn thẳng, đa giác).
Trang 7HUST 9/20/2015 7
Thư viện GLUT
GLUT (OpenGL Utility Toolkit) là một thư viện nhằm giúp chúng
ta có thể nhanh chóng tạo ra các cửa sổ cũng như quản lý các sự kiện từ bàn phím, chuột mà không phải quan tâm quá nhiều tới các hàm trực tiếp của OpenGL vì GLUT sẽ gọi các hàm này thay cho chúng ta.
GLUT không thể thay thế cho OpenGL mà chỉ là một thành phần bổ
sung để dễ dàng hơn trong việc lập trình OpenGL Việc thiết lập GLUT để lập trình OpenGL là hoàn toàn dễ dàng.
Trang 8Các chương trình OpenGL
Các khái niệm cơ bản
trong OpenGL
NỘI DUNG
Trang 9HUST 9/20/2015 9
Các chương trình OpenGL
Chương trình OpenGL đầu tiên
Chương trình OpenGL trong MFC
Trang 10HUST 9/20/2015 10
Chương trình OpenGL đầu tiên
Các bước thực hiện
Chạy chương trình Các thành phần của
chương trình
Trang 11HUST 9/20/2015 11
Các bước tạo một Project OpenGL đầu tiên
1 Mở Visual C++ (Visual Studio 2012)
Trang 12HUST 9/20/2015 12
Các bước tạo một Project OpenGL đầu tiên
2 Chọn menu File/New/Project…
Trang 13HUST 9/20/2015 13
Các bước tạo một Project OpenGL đầu tiên
3 Chọn kiểu Template là Win32, kiểu project là Win32
Project, Nhập tên project là Bai 3.1 OpenGLWin32
Trang 14HUST 9/20/2015 14
Các bước tạo một Project OpenGL đầu tiên
4 Chọn Application type là Window application, Chọn
Empty project, Finish
Trang 15HUST 9/20/2015 15
Thêm file mã nguồn vào project
5 Thêm file opengl.cpp vào trong project
Trang 16HUST 9/20/2015 16
Thêm file mã nguồn vào project
5 Thêm file opengl.cpp vào trong project
Trang 17HUST 9/20/2015 17
Thêm file mã nguồn vào project
5 Thêm file opengl.cpp vào trong project
Trang 18HUST 9/20/2015 18
Thêm thư viện liên kết vào project
6 Thêm hai file opengl32.lib và glu32.lib vào project
6.1 Thêm vào Additional Dependencies trong Setting của
Project
Trang 19HUST 9/20/2015 19
Thêm thư viện liên kết vào project
6 Thêm hai file opengl32.lib và glu32.lib vào project
6.2 Thêm trực tiếp file vào project
VS2012: C:\Program Files (x86)\Windows Kits\8.0\Lib\win8\um\x86VS2010: C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Lib
Trang 20HUST 9/20/2015 20
Thêm thư viện liên kết vào project
6 Thêm hai file opengl32.lib và glu32.lib vào project
6.3 Thêm trực tiếp file vào code
Trang 21HUST 9/20/2015 21
Chạy chương trình
7 Build chương trình (F7)
8 Chạy chương trình (F5, Ctrl+F5)
Trang 22LONG WINAPI MainWndProc ()
• Hàm xử lý các sự kiện xảy ra với cửa sổ
int WINAPI WinMain ()
• Hàm đầu vào chương trình Windowsvoid SetupPixelFormat()
• Khởi tạo định dạng ảnh
Trang 23• Cho các hàm thư viện của
Windows và thư viện đồ họa OpenGL
• Biến cho cửa sổ
• Biến cho vùng vẽ (DC)
• Biến vùng vẽ OpenGL
Trang 24HUST 9/20/2015 24
Hàm SetupPixelFormat()
• Khởi tạo định dạng điểm
ảnh của vùng vẽ
Trang 26HUST 9/20/2015 26
Hàm ResizeGraphics()
• Hàm thay đổi kích thước
vùng vẽ phù hợp với kích thước cửa sổ
• Lấy kích thước cửa sổ
• Thay đổi kích thước vùng
vẽ
Trang 28HUST 9/20/2015 28
Hàm MainWndProc()
• Hàm xử lý các sự
kiện xảy ra với cửa sổ
• Thay đổi kích thước
cửa sổ
• Đóng cửa sổ
• Hủy
• Xử lý mặc định
Trang 33HUST 9/20/2015 33
Lớp COpenGLInit
Là 1 lớp C++, gói gọn các hàm tương tác với OpenGL
Có các hàm tương ứng với các sự kiện trong MFC
Download từ forum
Các hàm chính
OnCreate – Hàm khởi tạo
OnSize – Hàm thay đổi kích thước
OnDestroy – Hàm hủy
OnDraw – Hàm vẽ
SetupPixelFormat – Khởi tạo định dạng điểm ảnh
Trang 34// Các thư viện cần liên kết của OpenGL
#pragma comment ( lib , "opengl32.lib" )
#pragma comment ( lib , "glu32.lib" )
#pragma warning ( disable : 4566 )
// Lớp khởi tạo môi trường đồ hoạ OpenGL cho MFC
// Gọi các hàm trong các hàm tương ứng của lớp View của ứng dụng
Trang 35// Gọi trong hàm OnSize(UINT nType, int cx, int cy)
void OnSize(UINT nType, int cx, int cy);
// Gọi trong hàm OnDestroy()
// cs.style |= WS_CLIPSIBLINGS | WS_CLIPCHILDREN;
// Thêm trong hàm OnTimer UINT_PTR nIDEvent) // Vào cuối hàm
int timerID; // ID của bộ đếm thời gian (timer)
int timerElapse; // Khoảng thời gian giữa các lần vẽ lại
};
Trang 37HUST 9/20/2015 37
Tệp OpenGLInit.cpp…
// Initialize OpenGL graphics
void COpenGLInit::OnCreate(HDC _hDC) {
// Resize graphics to fit window
void COpenGLInit::OnSize(UINT nType, int width, int height) {
// Get new window size
GLfloat aspect;
aspect = (GLfloat)width / height;
// Adjust graphics to window size
glViewport(0, 0, width, height);
Trang 38HUST 9/20/2015 38
Tệp OpenGLInit.cpp…
// Draw frame
void COpenGLInit::OnDraw() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// Set location in front of camera
glLoadIdentity();
static int angle = 0;
glRotatef( float (angle++), 0.0f, 0.0f, 1.0f);
::wglMakeCurrent(NULL, NULL);
if (hRC)
::wglDeleteContext(hRC);
}
Trang 39HUST 9/20/2015 39
Các bước tạo project OpenGL trong MFC
Khởi động Visual Studio C++ (Visual Studio 2012)
Vào File/ New Project/ MFC Application.
Đặt tên cho Project là Bai 3.2 OpenGLMFCApp
Trang 40HUST 9/20/2015 40
Chọn loại ứng dụng MFC
Chọn tùy chỉnh cho Project là Single Document và MFC
Standard Rồi chọn Finish
Trang 41HUST 9/20/2015 41
Mã nguồn chương trình MFC cơ bản
Trang 42HUST 9/20/2015 42
Thêm lớp COpenGLInit vào project
Copy các tệp OpenGLInit.h và OpenGLInit.cpp vào thư mục
OpenGL nằm trong thư mục của project
Trang 43HUST 9/20/2015 43
Thêm lớp COpenGLInit vào project
Tạo một Filter OpenGL trong project
Thêm các tệp OpenGLInit.h và OpenGLInit.cpp vào trong
filter OpenGL
Trang 44HUST 9/20/2015 44
Sử dụng lớp COpenGLInit
Thêm khai báo sử dụng lớp COpenGLInit và biến vào lớp
CBai32OpenGLMFCAppView
Trang 45HUST 9/20/2015 45
Chỉnh sửa hàm PreCreateWindow
Thêm style ClipSiblings và ClipChildren vào CreateStruct cs
Trang 46HUST 9/20/2015 46
Thêm hàm xử lý sự kiện OnCreate
Gọi hàm OnCreate của lớp COpenGLInit
Cài đặt một Timer
Trang 47HUST 9/20/2015 47
Thêm hàm xử lý sự kiện OnSize
Gọi hàm OnSize của lớp COpenGLInit để resize phần nội dung
vẽ
Trang 48HUST 9/20/2015 48
Thêm hàm xử lý sự kiện OnEraseBkgnd
Thay đổi giá trị trả về là TRUE
Trang 49HUST 9/20/2015 49
Chỉnh sửa hàm OnDraw
Gọi hàm OnDraw của lớp COpenGLInit để hiển thị nội dung
phần vẽ trong lớp OpenGLInit
Trang 50HUST 9/20/2015 50
Thêm hàm xử lý sự kiện OnTimer
Gọi hàm RedrawWindow để cập nhật phần vẽ vào phần nội dung
vẽ
Trang 51HUST 9/20/2015 51
Thêm hàm xử lý sự kiện OnDestroy
Dừng Timer hiện tại lại
Gọi hàm OnDestroy của lớp COpenGLInit
Trang 52HUST 9/20/2015 52
Chạy chương trình
Trang 53Các chương trình OpenGL
Các khái niệm cơ bản
trong OpenGL
NỘI DUNG
Trang 54HUST 9/20/2015 54
OpenGL: Các khái niệm cơ bản
Các đối tượng hình học cơ bản
Trang 55HUST 9/20/2015 55
Các đối tượng hình học cơ bản
bản là: điểm, đoạn thẳng và đa giác
tượng và một tập hợp các đỉnh
Dấu * được sử dụng vì có một số biến thể của lệnh glVertex ()
của lệnh, f chỉ ra tham số kiểu float, v cho biết tham
số thuộc loại véc-tơ (mảng)
Trang 56HUST 9/20/2015 56
Vẽ điểm trong OpenGL
glBegin() Kết thúc vẽ bằng glEnd() Muốn thay đổi kích thước điểm ảnh, dùng glPointSize()
Trang 57HUST 9/20/2015 57
Vẽ đoạn thẳng trong OpenGL
lệnh glBegin()
– GL_LINES: Vẽ một loạt các đoạn thẳng tách biệt
Trang 58HUST 9/20/2015 58
Vẽ đoạn thẳng trong OpenGL…
– GL_LINE_STRIP: Vẽ một đoạn thẳng từ đỉnh đầu tiên
cuối cùng Đoạn thẳng có thể giao nhau tùy tiện
Trang 59HUST 9/20/2015 59
Vẽ đoạn thẳng trong OpenGL…
– GL_LINE_LOOP: Tương tự như GL_LINE_STRIP, ngoại trừ
cạnh cuối được tự động thêm vào để đóng đa giác
Trang 61HUST 9/20/2015 61
Màu sắc trong OpenGL
• Khác với vẽ trên giấy, trên máy tính ta cần xóa và đặt màu
nền trước khi vẽ ra lệnh vẽ các đối tượng Trong OpenGL, lệnh xóa và đặt màu là glClearColor ()
• Tham số của lệnh là bộ 4 màu thành phần: đỏ, xanh lá cây,
xanh dương và độ mờ (Red,Green,Blue, Alpha blending – RGBA) Giá trị màu thay đổi từ 0.0 đến 1.0
• Để thiết lập một màu sắc, sử dụng lệnh glColor3f () Nó
có ba thông số nằm giữa 0.0 và 1.0
• Giá trị một số màu cơ bản
glColor3f(0.0, 0.0, 0.0); // black glColor3f(0.0, 0.0, 1.0); // blue
glColor3f(1.0, 0.0, 0.0); //red glColor3f(1.0, 1.0, 0.0); //yellow glColor3f(0.0, 1.0, 0.0); //green glColor3f(1.0, 0.0, 1.0); //magenta glColor3f(0.0, 1.0, 1.0); // cyan glColor3f(1.0, 1.0, 1.0); //white
Trang 63HUST 9/20/2015 63
Phép biến đổi quan sát (Viewing Transformation)
• Để thay đổi hình ảnh của một đối tượng, cần thay đổi vị trí của đối
tượng hoặc của người quan sát Trong đồ họa máy tính, một camera đặc trưng cho người quan sát
• Để reset lại góc quan sát của camera, dùng lệnh glLoadIdentity()
(Đặt ma trận chuyển đổi về ma trận đơn vị)
• Dùng lệnh gluLookAt() để đặt vị trí của camera (người quan sát) và
hướng nhìn
• Ví dụ: lệnh gluLookAt(
0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0) ;
đặt camera tại điểm (0.0, 0.0, 5.0),nhìn về điểm (0.0, 0.0, 0.0)
đặt véc-tơ hướng lên của camera là (0,1,0) (tức là nằm ngang)
Trang 64HUST 9/20/2015 64
Phép chiếu (projection)
của đối tượng Thể hiện của đối tượng được tính toán tùy thuộc vào vị trí camera và phương pháp chiếu hình
(orthographic) và phối cảnh (perspective)
glOrtho(), với phối cảnh dùng lệnh glFrustum()
Trang 65HUST 9/20/2015 65
Ánh sáng trong OpenGL
• Hiệu ứng ánh sáng là rất quan trọng trong đồ họa
3D vì nếu không có ánh sáng một đối tượng 3D sẽ trông như đối tượng 2D
• OpenGL cung cấp hai loại nguồn sáng: hướng và vị
trí
• Một nguồn sáng hướng được coi là nằm cách đối
tượng một khoảng cách vô hạn (như AS mặt trời)
Vì vậy, các tia ánh sáng được coi là song song khi tiếp cận các đối tượng
• Ngược lại, một nguồn sáng vị trí, gần hoặc ở ngay
trong các cảnh và có các tia sáng không song song (như AS đèn)
• Lệnh glLightfv() được sử dụng để đặt vị trí của ánh
sáng, cho cả AS hướng và vị trí Cũng được dùng khi chỉ định nguồn sáng có màu thuộc loại nền, khuếch tán, phản chiếu, hay phát xạ
Trang 66HUST 9/20/2015 66
Ánh sáng trong OpenGL…
• Trong OpenGL có thể tạo đồng thời tối đa tám nguồn ánh sáng có
tên lần lượt GL_LIGHT0, GL_LIGHT1,…
• • Để tạo ra một nguồn ánh sáng, phải chọn tên, vị trí nguồn sáng và
các thông số màu sắc và chất lượng
• Ví dụ
GLfloat light_diffuse [] = {1.0, 1.0, 1.0, 1.0};
GLfloat light_position [] = {1.0, 1.0, 1.0, 0.0};
glLightfv( GL_LIGHT0 , GL_DIFFUSE , light_diffuse );
glLightfv( GL_LIGHT0 , GL_POSITION , light_position );
glEnable( GL_LIGHTING );
glEnable( GL_LIGHT0 );
Trang 67HUST 9/20/2015 67