Bài giảng Đồ họa máy tính - Chương 7: Phép nhìn trong không gian 3 chiều

Ôn tập về camera

Xây dựng camera trong chương trình

Hình chiếu phối cảnh

Hình chiếu phối cảnh của điểm

Hình chiếu phối cảnh của đoạn thẳng

Độ sâu giả

Sử dụng tọa độ đồng nhất

Ý nghĩa hình học của phép biến đổi phối cảnh

Thể tích nhìn chuẩn

Cắt xén với thể tích nhìn

 

ppt34 trang | Chuyên mục: Đồ Họa Máy Tính | Chia sẻ: tuando | Lượt xem: 365 | Lượt tải: 0download
Tóm tắt nội dung Bài giảng Đồ họa máy tính - Chương 7: Phép nhìn trong không gian 3 chiều, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
ĐỒ HỌA MÁY TÍNH 
Trường Đại Học Bách Khoa TP Hồ Chí Minh 
Khoa Khoa học & Kỹ thuật Máy tính 
CHƯƠNG 7: 
PHÉP NHÌN TRONG KHÔNG GIAN 3 CHIỀU 
NỘI DUNG TRÌNH BÀY 
Ôn tập về camera 
Xây dựng camera trong chương trình 
Hình chiếu phối cảnh 
Hình chiếu phối cảnh của điểm 
Hình chiếu phối cảnh của đoạn thẳng 
Độ sâu giả 
Sử dụng tọa độ đồng nhất 
Ý nghĩa hình học của phép biến đổi phối cảnh 
Thể tích nhìn chuẩn 
Cắt xén với thể tích nhìn 
GIỚI THIỆU 
Xây dựng và điều khiển camera tạo hình chiếu phối cảnh 
Điều khiển vị trí và hướng của camera 
Điều khiển thể tích nhìn của camera 
Cắt xén với thể tích nhìn của camera 
ÔN TẬP VỀ CAMERA 
Thể tích nhìn : một phần của hình chóp có đỉnh là mắt nhìn . 
Các thành phần : mắt nhìn , góc nhìn ( tính bằng độ ), mặt phẳng gần , mặt phẳng xa , mặt phẳng nhìn ( thường là mặt phẳng gần ) 
ÔN TẬP VỀ CAMERA 
Thiết lập thể tích nhìn : hình dạng của thể tích nhìn chứa trong ma trận phép chiếu . 
	 glMatrixMode(GL_PROJECTION ); 
	 glLoadIdentity (); 
	 gluPerspective(viewAngle , aspecRatio , N, F); 
ÔN TẬP VỀ CAMERA 
Định vị trí và định hướng cho camera 
	 glMatrixMode(GL_MODELVIEW ); 
	 glLoadIdentity (); 
	 gluLookAt(eye.x,eye.y,eye.z,look.x,look.y,look.z , 
	 up.x,u p.y,up.z ); 
ÔN TẬP VỀ CAMERA 
Định vị trí và định hướng cho camera 
	 Khi điều chỉnh hướng của camera người ta thường dùng các thuật ngữ của ngành hàng không : pitch, roll, yaw 
a) pitch 
b) roll 
c) yaw 
n 
u 
v 
n 
u 
n 
u 
v 
u 
v 
v 
u 
a) 
b) 
c) 
ÔN TẬP VỀ CAMERA 
Chức năng của gluLookAt (): từ eye, look, up  u , v , n 
	n song song với eye – look 
	 u , v vuông góc với n 
	up hướng trên camera 
	 u chỉ phía bên camera 
up 
up 
v 
n 
u 
eye 
eye 
look 
look 
n = eye – look. 
u = up  n , 
v = n  u 
ÔN TẬP VỀ CAMERA 
Ma trận mô hình-phép nhìn là tích của V và M 
y 
z 
x 
V 
eye 
u 
n 
v 
( d x , d y , d z ) = (- eye  u , - eye  v , - eye  n ) 
XÂY DỰNG CAMERA TRONG CT 
class Camera 
{ 
 private: 
 Point3 eye; 
 Vector3 u, v, n; 
 double viewAngle , aspect, nearDist , farDist ; 
 void setModelViewMatrix (); 
 public: 
 Camera(); 
 void set(Point3 Eye, Point3 look, Vector3 up); 
 void roll(float angle); 
 void pitch(loat angle); 
 void yaw(float angle); 
 void slide(float delU , float delV , float delN ); 
 void setShape(float vAng,float asp,float nearD,float farD ); 
}; 
XÂY DỰNG CAMERA TRONG CT 
void Camera :: setModelViewMatrix (){ 
 float m[16]; 
 Vector3 eVec(eye.x , eye.y , eye.z ); 
 m[0] = u.x ; m[4] = u.y ; m[8] = u.z ; m[12] = - eVec.dot(u ); 
 m[1] = v.x ; m[5] = v.y ; m[9] = v.z ; m[13] = - eVec.dot(v ); 
 m[2] = n.x ; m[6] = n.y ; m[10] = n.z ; m[14] = - eVec.dot(n ); 
 m[3] = 0 ; m[7] = 0 ; m[11] = 0 ; m[15] = 1.0; 
 glMatrixMode(GL_MODELVIEW ); 
 glLoadMatrixf(m); 
} 
void Camera :: set(Point3 Eye, Point3 look, Vector3 up){ 
 eye.set(Eye ); 
 n.set(eye.x – look.x , eye.y – look.y , eye.z – look.z ); 
 u.set(up.cross(n )); 
 n.normalize (); 
 u.normalize (); 
 v.set(n.cross(u )); 
 setModelViewMatrix(); 
} 
XÂY DỰNG CAMERA TRONG CT 
Trượt : di chuyển camera dọc theo các trục u, v và n mà không quay nó . 
void Camera :: slide(float delU , float delV , float delN ){ 
	 eye.x += delU * u.x + delV * v.x + delN * n.x ; 
	 eye.y += delU * u.y + delV * v.y + delN * n.y ; 
	 eye.z += delU * u.z + delV * v.z + delN * n.z ; 
	 setModelViewMatrix (); 
} 
XÂY DỰNG CAMERA TRONG CT 
Quay camera: quay xung quay các trục u, v và n của nó 
pitch (quay xung quanh u), roll (quay xung quanh n), 
yaw (quay xung quanh v). 
u 
v 
u’ 
v’ 
 
u’ = cos(  ) u + sin(  ) v ,	 
v’ = -sin(  ) u + cos(  ) v , 
void Camera :: roll (float angle){ 
float cs = cos(3.14159265/180 * angle); 
float sn = sin(3.14159265/180 * angle); 
Vector3	t = u; 
u.set(cs * t.x – sn * v.x , cs * t.y – sn * v.y , cs * t.z – sn * v.z ); 
v.set(sn * t.x + cs * v.x , sn * t.y + cs * v.y , sn * t.z + cs * v.z ); 
setModelViewMatrix(); } 
VÍ DỤ 
#include 
#include 
#include 
#include “camera.h” 
Camera cam; 
void myKeyboard(unsigned char key, int x, int y){ 
 switch(key ){ 
 case ‘F’: cam.slide(0, 0, 0.2); break; 
 case ‘F’ – 64: cam.slide(0, 0, -0.2); break; 
 case ‘P’: cam.pitch(-1.0); break; 
 case ‘P’ – 64: cam.pitch(1.0); break; 
 } 
 glutPostRedisplay (); } 
void myInit (){ 
	glClearColor(1.0,1.0,1.0,0.0); 
	glColor3f(0.0f, 0.0f, 0.0f); 
	glPointSize(2.0); 
	 glMatrixMode(GL_PROJECTION ); 
	 glLoadIdentity (); 
	gluOrtho2D(0.0, 400.0, 0.0, 400.0); } 
VÍ DỤ 
void myDisplay (){ 
	 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
 glutWireTeapot(1.0); 
	 glFlush (); 
 glutSwapBuffers (); } 
int main(int argc , char* argv []) { 
	 ... khởi tạo cửa sổ 	 
	 glutKeyboardFunc(myKeyboard ); 
 glutDisplayFunc(myDisplay ); 
	glClearColor(1.0f, 1.0f, 1.0f, 1.0f); 
 glColor3f(0.0f, 0.0f, 0.0f); 
 glViewport(0, 0, 640, 480); 
 cam.set(4, 4, 4, 0, 0, 0, 0, 1, 0); 
 cam.setShape(30.0f, 64.0f/48.0f, 0.5f, 50.0f); 
 glutMainLoop (); 
 return 0; 
} 
HÌNH CHIẾU PHỐI CẢNH 
Đường ống đồ họa : 
điểm sau khi thực hiện phép biến đổi mô hình – phép nhìn sẽ có tọa độ nằm trong hệ tọa độ camera. 
thực hiện phép chiếu phối cảnh 
thực hiện việc cắt xén với cửa sổ trên mặt phẳng nhìn 
HÌNH CHIẾU PHỐI CẢNH CỦA ĐIỂM 
( P x , P y , P z ) (x *, y*) 
HÌNH CHIẾU PHỐI CẢNH CỦA ĐT 
Phép chiếu những đường thẳng song song 
 - đt đi qua A = (A x , A y , A z ) có hướng c = ( c x , c y , c z )  pt tham số P(t ) = A + c t. 
 - hình chiếu đt là : 
 - khi đt song song với mặt phẳng nhìn ( c z = 0), thì hình chiếu của đt là : 
 - khi đt không song song với mặt phẳng nhìn , thì hình chiếu của một điểm nằm ở vô cùng là ( điểm biến mất ) 
HÌNH CHIẾU PHỐI CẢNH CỦA ĐT 
Phép chiếu những đường thẳng song song 
HÌNH CHIẾU PHỐI CẢNH CỦA ĐT 
Đường thẳng chạy ra phía sau mắt nhìn 
Bất hợp lý khi quan sát các đt dài song song 
ĐỘ SÂU GIẢ 
Phép chiếu phối cảnh làm mất thông tin độ sâu 
Tốn tg khi tính độ sâu theo công thức 
Vì P z càng âm thì điểm càng ở xa  dùng P z tính độ sâu 
ĐỘ SÂU GIẢ 
a và b được chọn sao cho độ sâu giả nằm trong [-1, 1] 
chọn z* = -1 khi P z = - N 
chọn z* = 1 khi P z = - F 
SỬ DỤNG TỌA ĐỘ ĐỒNG NHẤT 
Biểu diễn tọa độ đồng nhất của P = ( P x , P y , P z ) là P = ( P x , P y , P z , 1) của vector v = ( v x , v y , v z ) là v = ( v x , v y , v z , 0) 
Mở rộng cách biểu diễn đồng nhất P = ( wP x , wP y , wP z , w), cách điểm nằm trên cùng tia , điểm ở vô cùng có w=0. 
(3, 6, 2, 3)  tọa độ thông thường là (1, 2, 2/3) 
Cách chuyển đổi : 
thông thường  đồng nhất ( thêm 1) 
đồng nhất  thông thường ( chia cho thành phần tọa độ thứ 4 và bỏ đi thành phần tọa độ thứ 4) 
SỬ DỤNG TỌA ĐỘ ĐỒNG NHẤT 
Nhân với phép biến đổi affine 
Nhân với ma trận chiếu ( phép biến đổi phối cảnh ) 
SỬ DỤNG TỌA ĐỘ ĐỒNG NHẤT 
Phép chia phối cảnh 
Phép biến đổi phối cảnh 
Phép chiếu trực giao 
( phép chiếu phối cảnh ) = ( phép biến đổi phối cảnh ) + ( phép chiếu trực giao ) 
Ý NGHĨA HÌNH HỌC CỦA PHÉP BĐPC 
Biến đổi P  P’ ( cùng trong 3D) 
Bảo toàn tính thẳng , tính phẳng và tính nằm trong 
Làm cong không gian 3D 
Biến đổi thể tích nhìn thành một hình hộp 
Ý NGHĨA HÌNH HỌC CỦA PHÉP BĐPC 
Z = -1 
Z = 1 
y = top 
y = bottom 
x = left 
x = right 
THỂ TÍCH NHÌN CHUẨN 
Sau khi thực hiện PBĐPC, chúng ta tịnh tiến , co dãn thể tích nhìn để được thể tích nhìn chuẩn . Ma trận là 
Thể tích nhìn chuẩn không phụ thuộc và camera, dễ dàng cho cắt xén . 
THỂ TÍCH NHÌN CHUẨN 
Hàm glFrustum(left , right, bott,top,N,F ) tạo ra ma trận R 
Hàm gluPerspective(viewAngle , aspect,N,F ) cũng tạo ra ma trận R bằng cách tính các giá trị : 
bott = -top , right = top  aspect và left = -right 
CẮT XÉN VỚI THỂ TÍCH NHÌN 
Điểm được biểu diễn dưới dạng tọa độ đồng nhất 
Sau khi thực hiện quá trình cắt xén xong , một số đỉnh có thể bị mất , một số đỉnh mới có thể được thêm vào 
CẮT XÉN VỚI THỂ TÍCH NHÌN 
Xác định tính trong ngoài của điểm so với mặt phẳng 
BC0 w + x x = -1 BC1 w – x x = 1 
BC2 w + y y = -1 BC3 w – y y = 1 
BC4 w + z z = -1 BC5 w – z z = 1 
Chấp nhận đơn giản : 12 giá trị BC đều dương 
Loại bỏ đơn giản : cả hai đầu mút đều nằm ngoài một mp 
Tìm giao điểm 
	 edge( t ) = ( a x + ( c x – a x ) t , a y + ( c y – a y ) t , a z + ( c z – a z ) t , a w + ( c w – a w ) t ) với x = 1 
CẮT XÉN VỚI THỂ TÍCH NHÌN 
int clipEdge(Point4& A, Point4& C) 
{ 
	double	tIn = 0.0, tOut = 1.0, tHit; 
	double	aBC[6], cBC[6]; 
	int	 aOutcode = 0, cOutcode = 0; 
	 ... tìm các giá trị BC cho A và C... 
	 ... tạo mã cho A và C... 
	if ((aOutcode & cOutcode) != 0)	 //loại bỏ đơn giản 
	return 0; 
	if ((aOutcode | cOutcode) = 0)	 //chấp nhận đơn giản 
	return 1; 
CẮT XÉN VỚI THỂ TÍCH NHÌN 
for(int i = 0; i < 6; i++) 
	{ 
	 if(cBC[i ] < 0) // đi ra : C nằm ngoài 
	{ 
	 tHit = aBC[i]/(aBC[i ] – cBC[i ]); 
	 tOut = MIN(tOut , tHit ); 
	} 
	else if ( aBC[i ] < 0) // đi vào : A nằm ngoài 
	{ 
	 tHit = aBC[i]/(aBC[i ] – cBC[i ]); 
	 tIn = MAX(tIn , tHit ); 
	} 
	 if(tIn > tOut ) return 0; // CI rỗng ; kết thúc sớm 
	} 
CẮT XÉN VỚI THỂ TÍCH NHÌN 
 // Cập nhật các điểm đầu mút nếu cần thiết 
 Point4	 tmp ; 
 if(aOutcode != 0) { // A nằm ngoài : tIn thay đổi 
	 tmp.x = A.x + tIn * ( C.x – A.x ); 
	 tmp.y = A.y + tIn * ( C.y – A.y ); 
	 tmp.z = A.z + tIn * ( C.z – A.z ); 
	 tmp.w = A.w + tIn * ( C.w – A.w ); 
	} 
	 if(cOutcode != 0) { // C nằm ngoài : tOut thay đổi 
	 C.x = A.x + tOut * (C.x – A.x); 
	C.y = A.y + tOut * (C.y – A.y); 
	C.z = A.z + tOut * (C.z – A.z); 
	C.w = A.w + tOut * (C.w – A.w); 
	 } 
	A = tmp ; // cập nhật A 
	return 1; } 

File đính kèm:

  • pptbai_giang_do_hoa_may_tinh_chuong_7_phep_nhin_trong_khong_gia.ppt
Tài liệu liên quan