Bài giảng Đồ họa máy tính - Lập trình 3D với OpenGL - Ngô Quốc Việt

pdf 55 trang Gia Huy 16/05/2022 3300
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Đồ họa máy tính - Lập trình 3D với OpenGL - 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_lap_trinh_3d_voi_opengl_ngo_quoc_v.pdf

Nội dung text: Bài giảng Đồ họa máy tính - Lập trình 3D với OpenGL - Ngô Quốc Việt

  1. LẬP TRÌNH 3D VỚI OPENGL Ngô QuốcViệt - 2010
  2. 1. Giới thiệu OpenGL 2. Drawing 3. Hiển thị v{ biến đổi 4. Ánh s|ng Ngô Quốc Việt-2010 2
  3. 1. Dave Shreiner, Jackie Neider, Mason Woo, Tom Davis - OpenGL Programming Guide- Addison Wesley – 1994 up to now). 2. Ngô Quốc Việt-2010 3
  4. Giúp sinh viên tiếp cận với lập trình đồ hoạ 3D. C|c bước cơ bản nhất để tạo ứng dụng 3D trên Windows. Hướng dẫn c|c kh|i niệm chính của lập trình 3D với OpenGL/GLUT. Ngô Quốc Việt-2010 4
  5. OpenGL = Open Graphics Library Do Silicon Graphics (SGI) ph|t triển v{o 1992. Ph|t triển th{nh chuẩn từ IrisGL (1990-cũng do SGI). Độc lập HĐH. L{ dạng State Machine (mọi biến l{ trạng th|i). Chỉ xử lý 3D Graphics. Không đòi hỏi platform (Windowing, Fonts, Input, GUI) Ngô Quốc Việt-2010 5
  6. Giao diện phần mềm cho phần cứng đồ hoạ (~150 commands). L{ API đồ hoạ 3 chiều . High-quality color images composed of geometric and image primitives Với OpenGL, developer phải tự tạo model thông qua c|c đối tượng hình học cơ bản. Quản lý bởi Khronos Group. Ngô Quốc Việt-2010 6
  7. OpenGL. Phiên bản mới OpenGL 4.0. Scene Graphs, BSP: Open SceneGraph, Java3D, VRML, PLIB DirectX (Direct3D) Có thể kết hợp một v{i phần của DirectX với OpenGL (vd: OpenGL v{ DirectInput trong Quake III) C|c thư viện hỗ trợ: GL(graphics library), GLU (graphics library utilities). GLUT: dễ, đơn giản khi l{m việc với OpenGL. Ngô Quốc Việt-2010 7
  8. Sử dụng vector 4 th{nh phần để biểu diễn điểm. Được xem l{ hệ toạ độ thuần nhất. Gi| trị w thường bằng 1. Ngô Quốc Việt-2010 8
  9. Miền gi| trị m{u (R, G, B, A) trong khoảng [0,1]. Toạ độ (X,Y, Z) theo right-hand rule. Đơn vị hệ toạ độ: do x|c lập tuỳ theo dữ liệu v{ ứng dụng Thường sử dụng World Coordinate System (miền gi| trị -1 đến 1) để mô hình đối tượng. World Coordinate System có được do chuyển biến đổi từ toạ độ đối tượng qua ma trận ModelView. Toạ độ mắt được x}y dựng từ phép biến đổi qua ma trận ModelView Ngô Quốc Việt-2010 9
  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 10
  11. Ngô Quốc Việt-2010 12
  12. Dùng cho biến đổi vị trí camera (biến đổi vị trí quan s|t) Dùng cho biến đổi v{ hướng của mô hình (vật thể cần vẽ). Ngô Quốc Việt-2010 13
  13. X|c định lens cho camera. X|c định vùng nhìn (field of view) v{ c|c tham số kh|c Có thể thực hiện d~y c|c biến đổi qua kh|i niệm matrix stack với c|c h{m. Ngô Quốc Việt-2010 14
  14. Ngô Quốc Việt-2010 15
  15. Fovy = góc (theo độ) của vùng nhìn (field of view) theo hướng y . Aspect = tỉ lệ của vùng nhìn theo hướng x Ngô Quốc Việt-2010 16
  16. Ngô Quốc Việt-2010 17
  17. Vị trí camera, điểm camera hướng đến, v{ vector hướng của camera 18
  18. Functions in OpenGL start with gl . Hầu hết h{m bắt đầu gl (e.g., glColor()) . Một số h{m bắt đầu với glu l{ h{m tiện tích (e.g., gluLookAt()) . H{m bắt đầu với glx l{ giao diện với X Windows system (e.g., in gfx.c) Ngô Quốc Việt-2010 19
  19. Ngô Quốc Việt-2010 20
  20. Tên h{m chỉ ra kiểu v{ số lượng tham số . H{m có đuôi f có tham số floats . H{m có đuôi i có tham số ints . H{m có đuôi b có tham số bytes . H{m có đuôi ub có tham số unsigned bytes . H{m có đuôi v có tham số array. Ví dụ . glColor3f() có tham số l{ 3 số floats . glColor4fv() có tham số mảng 4 floats Ngô Quốc Việt-2010 21
  21. Ngô Quốc Việt-2010 22
  22. C|c kiểu nguồn s|ng: emit (tự ph|t), ambient (xung quanh), diffuse (khuếch t|n), specular (phản chiếu). . Emit: . Ambient: không có nguồn cụ thể. Mọi đối tượng đều bị t|c động của |nh s|ng n{y . Diffuse: bởi nguồn s|ng v{ vật liệu bề mặt. . Specular: M{u v{ cường độ s|ng x|c định bởi vector (R,G,B,A) tương tự như m{u sắc. Ngô Quốc Việt-2010 23
  23. Vị trí nguồn |nh s|ng (vd: bóng đèn): x|c định bởi vector (leftright, updown, frontback, 1) tương tự như một toạ độ. . Gi| trị frontback ▪ Zero: l{ nằm trên mặt phẳng Z. ▪ Dương: nguồn s|ng chiếu v{o m{n hình. ▪ Âm: nguồn s|ng chiếu từ sau v{o m{n hình. . Gi| trị leftright: chạy trên trục x. . Gi| trị updown: chạy trên trục y. H{m glEnable(GL_LIGHTING) bật nguồn s|ng Ngô Quốc Việt-2010 24
  24. Ngô Quốc Việt-2010 25
  25. Độ bóng, m{u phản xạ của vật liệu ảnh hưởng tới render mô hình Ngô Quốc Việt-2010 26
  26. Load bitmap l{m texture. Sinh texture với glGenTextures; glBindTexture; glTexParameteri; glTexImage2D; gluBuild2DMipmaps; Định vị khung cho texture khi d|n lên bề mặt với glTexCoord2f; Ngô Quốc Việt-2010 27
  27. glBegin(GL_POLYGON) glNormal3fv(n0); glVertex3fv(v0); glNormal3fv(n1); glVertex3fv(v1); glNormal3fv(n2); glVertex3fv(v2); glNormal3fv(n3); glVertex3fv(v30); glEnd(); Ngô Quốc Việt-2010 28
  28. GLUT (OpenGL UtilityToolkit). . Thư viện bổ sung ▪ L{ windowing API ▪ Không phải l{ th{nh phần của OpenGL . C|c t|c vụ chính ▪ Tạo cửa sổ. ▪ Đăng ký sự kiện. ▪ Mouse buttons, movement, keyboard, etc ▪ Viết c|c h{m Callbacks xử lý sự kiện. Ngô Quốc Việt-2010 29
  29. Download GLUT: Kết hợp với Visual C++. Copy files v{o c|c folder sau: . glut.h VC/include/gl/ . glut32.lib VC/lib/ . glut32.dll windows/system32/ Header Files, luôn đưa c|c include sau v{o đầu file header có sử dụng OpenGL. . #include Lib Files: Glu32.lib; GLaux.lib v{ OpenGL32.lib (nếu l{ GLUT cũ). Ngô Quốc Việt-2010 30
  30. #include Specify the display #include Mode – RGB or color Index, single or double Buffer void main(int argc, char argv) { Create a window int mode = GLUT_RGB|GLUT_DOUBLE; Named “simple” glutInitDisplayMode( mode ); with resolution glutInitWindowSize( 500,500 ); 500 x 500 glutCreateWindow( “Simple” ); init(); Your OpenGL initialization glutDisplayFunc( display ); code (Optional) glutKeyboardFunc( key ); Register your call back glutMainLoop(); functions } Infinite loop waiting for Ngô Quốc Việt-2010 events 31
  31. void init( void ) { glClearColor (0.0, 0.0, 0.0, 0.0); glViewport(0, 0, width, height); X|c lập hình chiếu của camera. glMatrixMode(GL_PROJECTION); Phối cảnh. glLoadIdentity(); glOrtho(-10, 10, -10, 10, -10, 20); Hệ toạ độ trực giao glMatrixMode(GL_MODELVIEW); glLoadIdentity(); Định vị v{ hướng của camera glEnable( GL_LIGHT0 ); glEnable( GL_LIGHTING ); Ma trận đơn vị 4x4 glEnable( GL_DEPTH_TEST ); } Ma trận 4x4 được xem như phép biến đổi Ngô Quốc Việt-2010 32
  32. Điều khiển sự kiện: Chương trình sử dụng windows . Input/Output . Chờ sự kiện nhất định xuất hiện, sau đó thực hiện yêu cầu tuỳ theo sự kiện Sự kiện – key press, mouse button press and release, window resize, etc. Chương trình OpenGL luôn ở trong vòng lặp Ngô Quốc Việt-2010 33
  33. Hàm Callback : thủ tục được gọi khi event xuất hiện . Window resize hay redraw . User input (mouse, keyboard) . Animation (render many frames) “Đăng ký” callbacks trong GLUT với c|c h{m . glutDisplayFunc( my_display_func ); . glutIdleFunc( my_idle_func ); . glutKeyboardFunc( my_key_events_func ); . glutMouseFunc ( my_mouse_events_func ); Ngô Quốc Việt-2010 34
  34. Keyboard Event queue . MainLoop() Mouse Window Mouse_callback() Keypress_callback() window_callback() { { { . . . { { { Ngô Quốc Việt-2010 35
  35. H{m Callback xử lý mọi thao t|c vẽ Mọi chương trình GLUT phải có h{m callback hiển thị. glutDisplayFunc( my_display_func ); /* this part is in main.c */ void my_display_func (void ) { glClear( GL_COLOR_BUFFER_BIT ); glBegin( GL_TRIANGLE ); glVertex3fv( v[0] ); glVertex3fv( v[1] ); glVertex3fv( v[2] ); glEnd(); glFlush(); } Ngô Quốc Việt-2010 36
  36. Dùng cho animation v{ cập nhật liên tục . Có thể dùng glutTimerFunc hoặc callbacks timer cho animations glutIdleFunc( idle ); void idle( void ) { /* change something */ t += dt; glutPostRedisplay(); } Ngô Quốc Việt-2010 37
  37. Xử lý user input glutKeyboardFunc( my_key_events ); void my_key_events (char key, int x, int y ) { switch ( key ) { case ‘q’ : case ‘Q’ : exit ( EXIT_SUCCESS); break; case ‘r’ : case ‘R’ : rotate = GL_TRUE; break; } } Ngô Quốc Việt-2010 38
  38. Bắt sự kiện mouse press v{ release. glutMouseFunc( my_mouse ); void myMouse(int button, int state, int x, int y) { if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) { } } Ngô Quốc Việt-2010 39
  39. Event Example OpenGL Callback Function Keypress KeyDown glutKeyboardFunc KeyUp Mouse leftButtonDown glutMouseFunc leftButtonUp Motion With mouse press glutMotionFunc Without glutPassiveMotionFunc Window Moving glutReshapeFunc Resizing System Idle glutIdleFunc Timer glutTimerFunc Software What to draw glutDisplayFunc Ngô Quốc Việt-2010 40
  40. Thực thể hình học được x|c định bởi c|c đỉnh 3D. Có 10 kiểu thực thể hình học: Ngô Quốc Việt-2010 41
  41. glVertex3fv Ngô Quốc Việt-2010 42
  42. C|ch thực hiện được x|c định bởi glBegin( primType ); glEnd(); . primType x|c định c|ch kết hợp c|c đỉnh GLfloat red, green, blue; Glfloat coords[nVerts][3]; /*Initialize coords and colors somewhere in program*/ glBegin( primType ); for ( i = 0; i < nVerts; ++i ) { glColor3f( red, green, blue ); glVertex3fv( coords[i] ); } glEnd(); Ngô Quốc Việt-2010 43
  43. void drawParallelogram( GLfloat color[] ) { glBegin( GL_QUADS ); glColor3fv( color ); glVertex2f( 0.0, 0.0 ); glVertex2f( 1.0, 0.0 ); glVertex2f( 1.5, 1.118 ); glVertex2f( 0.5, 1.118 ); glEnd(); } Ngô Quốc Việt-2010 44
  44. Points, GL_POINTS . Điểm rời rạc . Kích thước điểm có thể thay đổi ▪ glPointSize (float size) glBegin(GL_POINTS); glColor3fv( color ); glVertex2f( P0.x, P0.y ); glVertex2f( P1.x, P1.y ); glVertex2f( P2.x, P2.y ); glVertex2f( P3.x, P3.y ); glVertex2f( P4.x, P4.y ); glVertex2f( P5.x, P5.y ); glVertex2f( P6.x, P6.y ); glVertex2f( P7.x, P7.y ); glEnd(); Ngô Quốc Việt-2010 45
  45. Lines, GL_LINES . Nối giữa 2 đỉnh: ví dụ sau vẽ 8 đoạn thẳng. . Có thể chỉ ra độ d{y với. ▪ glLineWidth (float width) glBegin(GL_LINES); glColor3fv( color ); glVertex2f( P0.x, P0.y ); glVertex2f( P1.x, P1.y ); glVertex2f( P2.x, P2.y ); glVertex2f( P3.x, P3.y ); glVertex2f( P4.x, P4.y ); glVertex2f( P5.x, P5.y ); glVertex2f( P6.x, P6.y ); glVertex2f( P7.x, P7.y ); glEnd(); Ngô Quốc Việt-2010 46
  46. Line Loop, GL_LINE_LOOP Sử dụng GL_POLYGON Ngô Quốc Việt-2010 47
  47. Triangles , GL_TRIANGLES v0 v1 Sử dụng GL_TRIANGLE_STRIP v2 v3 v4 v5 v7 v6 Ngô Quốc Việt-2010 48
  48. v1 v2 Sử dụng, GL_TRIANGLE_FAN v3 v4 v0 v5 Sử dụng GL_QUADS với bộ 4 đỉnh Ngô Quốc Việt-2010 49
  49. M{u theo bộ 4 (Red, Green, Blue, Alpha) glColor4f(red, green, blue, alpha); glColor3f(red, green, blue); glColor3f(0.0, 0.0, 0.0); /* Black */ glColor3f(1.0, 0.0, 0.0); /* Red */ glColor3f(0.0, 1.0, 0.0); /* Green */ glColor3f(1.0, 1.0, 0.0); /*Yellow */ glColor3f(1.0, 0.0, 1.0); /* Magenta */ glColor3f(1.0, 1.0, 1.0); /* White */) Ngô Quốc Việt-2010 50
  50. 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 51
  51. Tạo texture (load bitmap, sinh texture). Vẽ quads đ~ bind bitmap texture tại c|c vị trí texture. Có sử dụng h{m glColor4ub (4 bytes m{u). Dùng c|c h{m glRotate, glTranslatef để vẽ quad có d|n texture. Ngô Quốc Việt-2010 52
  52. Xác lập màu glColor3f(1.0f*float(cos(cnt1)),1.0f*float(sin(cnt2)),1.0f- 0.5f*float(cos(cnt1+cnt2))); Định vị trí dòng text glRasterPos2f(-0.45f+0.05f*float(cos(cnt1)), 0.32f*float(sin(cnt2))); Hiển thị Text glPrint("Active OpenGL Text With Me - %7.2f", cnt1); Ngô Quốc Việt-2010 53
  53. L{m sao vẽ hình chữ nhật phủ to{n bộ cửa sổ viewport? Set cả modelView v{ ProjectionView l{ Identity Ví dụ sau vẽ tại zNear=-1 glMatrixMode (GL_MODELVIEW); glPushMatrix (); glLoadIdentity (); glMatrixMode (GL_PROJECTION); glPushMatrix (); glLoadIdentity (); glBegin (GL_QUADS); glVertex3i (-1, -1, -1); glVertex3i (1, -1, -1); glVertex3i (1, 1, -1); glVertex3i (-1, 1, -1); glEnd (); glPopMatrix (); glMatrixMode (GL_MODELVIEW); glPopMatrix (); Ngô Quốc Việt-2010 54
  54. L{m c|ch n{o giữ nguyên tỉ lệ phối cảnh khi kích thước cửa sổ thay đổi. glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(fov, (float)windowWidth/(float)windowHeight, zNear, zFar); Hoặc float cx, halfWidth = windowWidth*0.5f; float aspect = (float)windowWidth/(float)windowHeight; glMatrixMode(GL_PROJECTION); glLoadIdentity(); glFrustum(cx-halfWidth*aspect, cx+halfWidth*aspect, bottom, top, zNear, zFar); Ngô Quốc Việt-2010 55