ĐỒ 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