1. Trang chủ
  2. » Tất cả

lap trinh do hoa 3d voi opengl

67 12 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Lập Trình Đồ Họa 3D Với OpenGL
Người hướng dẫn Ths. Nguyễn Xuân Hồng
Trường học Học viện Công nghệ Bưu chính Viễn Thông
Chuyên ngành Lập trình Đồ Họa
Thể loại Bài tập lớn
Năm xuất bản 2015
Thành phố Hà Nội
Định dạng
Số trang 67
Dung lượng 7,08 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

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 1

BÀI 3

LẬP TRÌNH ĐỒ HỌA 3D

VỚI OPENGL

Ths Nguyễn Xuân Hồng

Trang 2

Vẽ 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 3

HUST 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 4

Các chương trình OpenGL

Các khái niệm cơ bản

trong OpenGL

NỘI DUNG

Trang 5

Các chương trình OpenGL

Các khái niệm cơ bản

trong OpenGL

NỘI DUNG

Trang 6

HUST 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 7

HUST 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 8

Các chương trình OpenGL

Các khái niệm cơ bản

trong OpenGL

NỘI DUNG

Trang 9

HUST 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 10

HUST 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 11

HUST 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 12

HUST 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 13

HUST 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 14

HUST 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 15

HUST 9/20/2015 15

Thêm file mã nguồn vào project

5 Thêm file opengl.cpp vào trong project

Trang 16

HUST 9/20/2015 16

Thêm file mã nguồn vào project

5 Thêm file opengl.cpp vào trong project

Trang 17

HUST 9/20/2015 17

Thêm file mã nguồn vào project

5 Thêm file opengl.cpp vào trong project

Trang 18

HUST 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 19

HUST 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 20

HUST 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 21

HUST 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 22

LONG 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 24

HUST 9/20/2015 24

Hàm SetupPixelFormat()

• Khởi tạo định dạng điểm

ảnh của vùng vẽ

Trang 26

HUST 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 28

HUST 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 33

HUST 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 37

HUST 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 38

HUST 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 39

HUST 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 40

HUST 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 41

HUST 9/20/2015 41

Mã nguồn chương trình MFC cơ bản

Trang 42

HUST 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 43

HUST 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 44

HUST 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 45

HUST 9/20/2015 45

Chỉnh sửa hàm PreCreateWindow

 Thêm style ClipSiblings và ClipChildren vào CreateStruct cs

Trang 46

HUST 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 47

HUST 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 48

HUST 9/20/2015 48

Thêm hàm xử lý sự kiện OnEraseBkgnd

 Thay đổi giá trị trả về là TRUE

Trang 49

HUST 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 50

HUST 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 51

HUST 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 52

HUST 9/20/2015 52

Chạy chương trình

Trang 53

Các chương trình OpenGL

Các khái niệm cơ bản

trong OpenGL

NỘI DUNG

Trang 54

HUST 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 55

HUST 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 56

HUST 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 57

HUST 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 58

HUST 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 59

HUST 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 61

HUST 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 63

HUST 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 64

HUST 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 65

HUST 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 66

HUST 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 67

HUST 9/20/2015 67

Ngày đăng: 02/03/2023, 14:20

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w