Bài giảng Đồ họa máy tính - Đồ họa ba chiều - Ngô Quốc Việt

pdf 36 trang Gia Huy 16/05/2022 3260
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Đồ họa máy tính - Đồ họa ba chiều - Ngô Quốc Việt", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pdfbai_giang_do_hoa_may_tinh_do_hoa_ba_chieu_ngo_quoc_viet.pdf

Nội dung text: Bài giảng Đồ họa máy tính - Đồ họa ba chiều - Ngô Quốc Việt

  1. ĐỒ HỌA BA CHIỀU NGÔ QUỐC VIỆT 2009
  2. 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
  3. OpenGL-GLUT (thư viện đồ họa 3D) Graphics Gems I, II, III, IV (mã nguồn mở). 3
  4. Modeling Transformation Biến đổi vô hệ toạ độ thế giới 3D Lighting Chiếu sáng theo ánh sáng và độ phản chiếu Viewing Transformation Biến đổi vô hệ toạ độ 3D camera Projection Transformation Biến đổi vô hệ toạ độ màn hình into 2D Clipping Loại bỏ thực thể ngoài vùng nhìn của camera Scan Conversion Vẽ pixel (dán ảnh, khử mặt khuất, Image 4
  5. Mô hình đối tượng ba chiều . Points . Wire frame . Mesh . Solid Đồ họa OpenGL với thư viện GLUT. 5
  6. Nguyên tắc bàn tay trái và bàn tay phải Right-hand được sử dụng trong OpenGL 6
  7. Góc xoay dương 7
  8. 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 (hay scene), vị trí camera. Sử dụng 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
  9. 3D Cartesian coordinate system. Gốc (0,0,0) tại tâm màn hình. Nguồn -Greg Sidelnikov 9
  10. 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
  11. 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
  12. Chiếu song song Chiếu phối cảnh (Perspective) 12
  13. Mặt xén gần Mặt xén xa Mặt phẳng chiếu Khối nhìn (view volume) 13
  14. 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
  15. 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: 2 0 0 t right left right left x t x right left 2 0 0 t top bottom top bottom y ; t y top bottom 2 0 0 tz farVal nearVal farVal nearVal tx farVal nearVal 0 0 0 1 15
  16. Hướng chiếu không trực giao với mặt phẳng chiếu  63.4  45 Cavalier Cabinet o o (DOP = 45 ) (DOP = 63.4 ) 16
  17. V x x (z z) px p vp V px V px Vpz 1 0 zvp V V pz pz V V 0 1 py z py V vp V pz pz 0 0 1 0 V p 0 0 0 1 HB Matrix 7-13 17
  18. Đố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
  19. • 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
  20. • Sử dụng nguyên tắc tam giác đồng dạng. Xét hình sau: View X plane P (x, y, z) (0,0,0) x’ = ? Z d • x’ bằng bao nhiêu ? 20
  21. • 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à: x' x y' y , d z d z d  x x d  y y x' , y' , z d z z d z z d • Có thể biểu diễn dạng ma trận? 21
  22. 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
  23. 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
  24. 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. Viewing Distance là khoảng cách Nguồn -Greg Sidelnikov giữa viewer và mặt gần. Chỉ nhìn thấy những gì trong view volumn. 24
  25. 1 0 0 0 0 1 0 0 Mperspective 0 0 1 0 0 0 1 d 0 x 1 0 0 0 x y 0 1 0 0 y z 0 0 1 0 z z d 0 0 1 d 0 1 x y Trong tọa độ 3-D: , , d z d z d 25
  26. 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
  27. Xác lập ma trận chiếu phối cảnh gluPerspective( GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar) 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
  28. Đồ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
  29. Đ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
  30. 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; //hai đỉnh của cạnh data edgeProperties; //tính chất của cạnh } Edge3D; typedef struct tagWirreFrame { //có thể chứa thêm các mặt. int numVertices, numVerEdges; //số đỉnh, số cạnh Point3D arrPoints[]; //mảng chứa tập đỉnh Edge3D arrEdges[]; //mảng chứa tập cạnh } 30
  31. 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
  32. 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
  33. 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
  34. 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
  35. Wireframe Points 35
  36. 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