ĐỒ HỌA BA CHIỀU

NGÔ QUỐC VIỆT 2009

 Giới thiệu.  Biểu diễn đối tượng đồ họa ba chiều  Một số công thức hình học  Các phép chiếu.  Mặt ba chiều có quy luật  Bài tập  Giải đáp thắc mắc

2

 OpenGL-GLUT (thư viện đồ họa 3D)  Graphics Gems I, II, III, IV (mã nguồn mở).

3

Biến đổi vô hệ toạ độ thế giới 3D

Modeling Transformation

Lighting

Chiếu sáng theo ánh sáng và độ phản chiếu

Biến đổi vô hệ toạ độ 3D camera

Viewing Transformation

Biến đổi vô hệ toạ độ màn hình into 2D

Projection Transformation

Clipping

Loại bỏ thực thể ngoài vùng nhìn của camera

Vẽ pixel (dán ảnh, khử mặt khuất, …

Scan Conversion

Image

4

 Mô hình đối tượng ba chiều

 Points  Wire frame  Mesh  Solid

 Đồ họa OpenGL với thư viện GLUT.

5

 Nguyên tắc bàn tay trái và bàn tay phải

 Right-hand được sử dụng trong OpenGL

6

 Góc xoay dương

7

 Thông qua ma trận chiếu 4x4. Gồm

MODELVIEW và PROJECTIONVIEW.

 Model View: Tác động trực tiếp lên đối tượng camera. Sử dụng trí

scene),

(hay vị glMatrixView(GL_MODELVIEW).

 Projection View: mô tả kiểu camera. Phép biến đổi tác động lên camera (lens, field of view). glMatrixView(GL_PROJECTION).

8

 3D Cartesian coordinate system.  Gốc (0,0,0) tại tâm màn hình.

Nguồn -Greg Sidelnikov

9

 Toạ độ đối tượng là toạ độ thô chuyển cho OpenGL với

các hàm glVertex*().

 Toạ độ đối tượng được chuyển thành toạ độ mắt nhìn

với phép biến đổi qua ma trận ModelView .

 Toạ độ mắt nhìn đượ chuyển thành toạ độ Clip qua ma

trận Projection.

 Toạ độ clip X, Y, Z được chuyển thành Clip Coordinate W

để tạo ra Normalized Device Coordinates

 Normalized Device Coordinates được tỉ lệ và tịnh tiến

qua các tham số viewport để tạo ra toạ độ Window

10

 Ma trận ModelView chứa cả hai phép biến đổi cho mô hình và mắt nhìn. Mắt nhìn tại gốc, với hướng nhìn dọc theo trục Z âm.

 Toạ độ xén do biến đổi toạ độ mắt nhìn qua ma trận Projection. Miền giá trị toạ độ của 3 trục từ -Wc đến Wc.

 Phối cảnh thực hiện trên Clip Coordinates tạo ra Normalized Device Coordinates, với miền giá trị -1 to 1 cho cả 3 trục

Ngô Quốc Việt-2010 11

Chiếu song song

Chiếu phối cảnh (Perspective)

12

Mặt xén gần

Mặt xén xa

Mặt phẳng chiếu

Khối nhìn (view volume)

13

 Hướng chiếu vuông góc với mặt phẳng chiếu  Hướng chiếu đồng nhất ở mọi điểm

Chiếu xuống mặt XY

Tương tự cho chiếu xuống mặt XA,YZ.

Top

Side

14

glOrtho(GLdouble left, Gldouble right, GLdouble bottom, GLdouble top, GLdouble nearVal, GLdouble farVal);

 Nhân ma trận hiện hành với ma trận trực giao:

15

 Hướng chiếu không trực giao với mặt phẳng chiếu

Cavalier (DOP  = 45

Cabinet (DOP  = 63.4

o ) o )

16

Vp

HB Matrix 7-13

17

 Đối tượng càng gần người xem  càng lớn.  Đường song song hội tụ tại một điểm • Điểm hội tụ tại tâm màn hình • Xác định bởi view frustum.

18

• Khi làm việc với đồ họa 3-D graphics, hãy xem màn

hình như cửa sổ hai chiều trong thế giới 3-D:

Thỏ cao bao nhiêu

19

• Sử dụng nguyên tắc tam giác đồng dạng. Xét hình

sau:

X

P (x, y, z)

View plane

x’ = ?

(0,0,0)

Z

d

• x’ bằng bao nhiêu ?

20

• Kết quả của phép chiếu điểm [x, y, z, 1]T lên mặt

phẳng chiếu là:

• Có thể biểu diễn dạng ma trận?

21

 Xét một công thức chiếu phối cảnh của điểm 3D

 Do góc trái trên màn hình là (0,0). Điểm (0,0,-16)

sẽ được chiếu ở tâm màn hình.

 Giá trị HALFWIDTH và HALFHEIGHT là nửa độ

rộng và cao màn hình.

22

 Giá trị ViewingDistance liên quan đến viewer.  ViewingDistance càng lớn  khối nhìn càng

nhỏ  đối tượng càng nhỏ.

 Có mâu thuẫn gì với công thức ?

23

 Viewing Volume cò được gọi là Clipping volume hoặc Frustum.

 Mặt phẳng gần và mặt xén xa  Mọi thứ sau mặt xén xa thì

invisible

 Frustum là không gian giữa hai

mặp phẳng.

Nguồn -Greg Sidelnikov

 Viewing Distance là khoảng cách

giữa viewer và mặt gần.

 Chỉ nhìn thấy những gì trong

view volumn.

24

Trong tọa độ 3-D:

25

 Chỉ ra vùng nhìn màn hình theo đơn vị pixel  Xác lập GL được nối với cửa sổ với kích thước  glViewport xác định biến đổi từ toạ độ normalized device sang toạ độ cửa sổ, với (xnd, ynd) là toạ độ chiếu trên của điểm 3D, (x, y) là góc trái viewport.

 Normalized coordinates có miền xác định[-1..1]

26

 Xác lập ma trận chiếu phối cảnh

gluPerspective( GLdouble fovy, GLdouble aspect, zFar)

zNear, GLdouble

GLdouble

 fovy: liếc theo góc thẳng đứng; aspect: tỉ lệ giữa

ngang và dọc; zNear, zFar: khoảng xén

 Ma trận chiếu xác định như sau

27

 Đồng nhất với mắt nhìn. Luôn nằm ở tâm của

“view” ảo. Camera có hệ toạ độ riêng

Nguồn -Greg Sidelnikov

28

 Điểm: Tập các điểm ba chiều nhằm biểu diễn đối

tượng.

typedef struct tagPoint3D {

double x, y, z;

} Point3D;

 Wireframe: tập các điểm ba chiều và cạnh nối giữa

các điểm nhằm biểu diễn đối tượng.

29

 Sử dụng mảng, DSLK hoặc tập hợp để lưu trữ các

điểm và cạnh của đối tượng . typedef struct tagEdge3D {

int idEdge; Point3D end1, end2; data edgeProperties;

//hai đỉnh của cạnh //tính chất của cạnh

} Edge3D; typedef struct tagWirreFrame {

int numVertices, numVerEdges; Point3D arrPoints[]; Edge3D arrEdges[];

//có thể chứa thêm các mặt. //số đỉnh, số cạnh //mảng chứa tập đỉnh //mảng chứa tập cạnh

}

30

 One Possible Data Structure:

Point3D = record x, y, z : real; end ; Figure = array (1..8, 1..8) of Point3D; Map = array (1..8, 1..8) of boolean; Map(i, j) = true if i, j connected else Map(i, J) = false Example Map(1, 4) = true but Map(1, 8) = false

for I in 1..8 loop for J in 1..8 loop if Map (I,J) then Draw line between point I and point J

31

 glMatrixMode(GL_MODELVIEW);  glLoadIdentity();  gluLookAt(

eyeX, eyeY, eyeZ,

lookX, lookY, lookZ, upX, upY, upZ);

 eye[XYZ]: vị trí camera trong toạ độ thực.  look[XYZ]: điểm nhìn của camera.  up[XYZ]: vector xác định trục đứng của camera.

 Tạo ma trận nhằm biến đổi điểm trong thế giới thực vào hệ

toạ độ camera.  Camera at origin.  Nhìn theo hướng -Z (âm Z).  Vector hướng lên dọc theo trụcY.

32

void SetUpViewing() {

// The viewport isn’t a matrix, it’s just state... glViewport( 0, 0, window_width, window_height );

// Set up camera->screen transformation first glMatrixMode( GL_PROJECTION ); glLoadIdentity(); gluPerspective( 60, 1, 1, 1000 ); // fov, aspect, near, far

// Set up the model->camera transformation glMatrixMode( GL_MODELVIEW ); gluLookAt( 3, 3, 2, // eye point

0, 0, 0, // look at point 0, 0, 1 ); // up vector

glRotatef( theta, 0, 0, 1 ); // rotate the model glScalef( zoom, zoom, zoom ); // scale the model

}

33

 Mô hình kinh điển trong đồ họa 3 chiều (tương tự như ảnh Lena trong xử lý ảnh). Do Martin Newell xây dựng 1975.

Dữ liệu là tập các tọa độ 3 chiều. Các mặt Bezier.

34

Points

Wireframe

35

1. Thực hành: cài đặt hiển thị điểm, line, polyline với OpenGL. Sử dụng GLUT với Console Application hoặc Windows Application.

36