Download presentation
Presentation is loading. Please wait.
1
1 CSC461 Lecture 7: 3D Programming in OpenGL Objectives: Develop 2D and 3D examples -- Sierpinski gasket: a fractal Develop 2D and 3D examples -- Sierpinski gasket: a fractal 3D functions 3D functions Introduce hidden-surface removal Introduce hidden-surface removal Locate the camera Locate the camera
2
2 Three-dimensional Applications In OpenGL, two-dimensional applications are a special case of three-dimensional graphics In OpenGL, two-dimensional applications are a special case of three-dimensional graphics Not much changes Not much changes Use glVertex3*( ) Use glVertex3*( ) Have to worry about the order in which polygons are drawn or use hidden-surface removal Have to worry about the order in which polygons are drawn or use hidden-surface removal Polygons should be simple, convex, flat Polygons should be simple, convex, flat
3
3 Sierpinski Gasket (2D) Start with a triangle Start with a triangle Connect bisectors of sides and remove central triangle Connect bisectors of sides and remove central triangle Repeat Repeat
4
4 Example Four subdivisions Four subdivisions
5
5 The gasket as a fractal Consider the filled area (black) and the perimeter (the length of all the lines around the filled triangles) Consider the filled area (black) and the perimeter (the length of all the lines around the filled triangles) As we continue subdividing As we continue subdividing the area goes to zero the area goes to zero but the perimeter goes to infinity but the perimeter goes to infinity This is not an ordinary geometric object This is not an ordinary geometric object It is neither two- nor three-dimensional It is neither two- nor three-dimensional It has a fractal (fractional dimension) object It has a fractal (fractional dimension) object
6
6 Gasket Program #include #include /* a point data type typedef GLfloat point2[2]; /* initial triangle */ point2 v[]={{-1.0, -0.58}, {1.0, -0.58}, {0.0, 1.15}}; int n; /* number of recursive steps */
7
7 Draw a triangle void triangle( point2 a, point2 b, point2 c) /* display one triangle */ { glBegin(GL_TRIANGLES); glBegin(GL_TRIANGLES); glVertex2fv(a); glVertex2fv(a); glVertex2fv(b); glVertex2fv(b); glVertex2fv(c); glVertex2fv(c); glEnd(); glEnd();}
8
8 Triangle Subdivision void divide_triangle(point2 a, point2 b, point2 c, int m) { /* triangle subdivision using vertex numbers */ point2 v0, v1, v2; point2 v0, v1, v2; int j; int j; if(m>0) if(m>0) { for(j=0; j<2; j++) v0[j]=(a[j]+b[j])/2; for(j=0; j<2; j++) v0[j]=(a[j]+b[j])/2; for(j=0; j<2; j++) v1[j]=(a[j]+c[j])/2; for(j=0; j<2; j++) v1[j]=(a[j]+c[j])/2; for(j=0; j<2; j++) v2[j]=(b[j]+c[j])/2; for(j=0; j<2; j++) v2[j]=(b[j]+c[j])/2; divide_triangle(a, v0, v1, m-1); divide_triangle(a, v0, v1, m-1); divide_triangle(c, v1, v2, m-1); divide_triangle(c, v1, v2, m-1); divide_triangle(b, v2, v0, m-1); divide_triangle(b, v2, v0, m-1); } else(triangle(a,b,c)); else(triangle(a,b,c)); /* draw triangle at end of recursion */ /* draw triangle at end of recursion */}
9
9 Display and Init Functions void display(void) { glClear(GL_COLOR_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT); divide_triangle(v[0], v[1], v[2], n); divide_triangle(v[0], v[1], v[2], n); glFlush(); glFlush();} void myinit() { glMatrixMode(GL_PROJECTION); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glLoadIdentity(); gluOrtho2D(-2.0, 2.0, -2.0, 2.0); gluOrtho2D(-2.0, 2.0, -2.0, 2.0); glMatrixMode(GL_MODELVIEW); glMatrixMode(GL_MODELVIEW); glClearColor (1.0, 1.0, 1.0,1.0) glClearColor (1.0, 1.0, 1.0,1.0) glColor3f(0.0,0.0,0.0); glColor3f(0.0,0.0,0.0);}
10
10 main Function int main(int argc, char **argv) { n=4; n=4; glutInit(&argc, argv); glutInit(&argc, argv); glutInitDisplayMode glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); glutInitWindowSize(500, 500); glutInitWindowSize(500, 500); glutCreateWindow(“2D Gasket"); glutCreateWindow(“2D Gasket"); glutDisplayFunc(display); glutDisplayFunc(display); myinit(); myinit(); glutMainLoop(); glutMainLoop();}
11
11 Moving to 3D We can easily make the program three- dimensional by using We can easily make the program three- dimensional by using typedef Glfloat point3[3] glVertex3fglOrtho But that would not be very interesting But that would not be very interesting Instead, we can start with a tetrahedron Instead, we can start with a tetrahedron
12
12 3D Gasket We can subdivide each of the four faces We can subdivide each of the four faces Appears as if we remove a solid tetrahedron from the center leaving four smaller tetrahedtra Appears as if we remove a solid tetrahedron from the center leaving four smaller tetrahedtra
13
13 Example After 4 interations
14
14 triangle code void triangle( point a, point b, point c) {// right-hand rule glBegin(GL_POLYGON); glBegin(GL_POLYGON); glVertex3fv(a); glVertex3fv(a); glVertex3fv(b); glVertex3fv(b); glVertex3fv(c); glVertex3fv(c); glEnd(); glEnd();}
15
15 subdivision code void divide_triangle(point a, point b, point c, int m) { point v1, v2, v3; point v1, v2, v3; int j; int j; if(m>0) if(m>0) { for(j=0; j<3; j++) v1[j]=(a[j]+b[j])/2; for(j=0; j<3; j++) v1[j]=(a[j]+b[j])/2; for(j=0; j<3; j++) v2[j]=(a[j]+c[j])/2; for(j=0; j<3; j++) v2[j]=(a[j]+c[j])/2; for(j=0; j<3; j++) v3[j]=(b[j]+c[j])/2; for(j=0; j<3; j++) v3[j]=(b[j]+c[j])/2; divide_triangle(a, v1, v2, m-1); divide_triangle(a, v1, v2, m-1); divide_triangle(c, v2, v3, m-1); divide_triangle(c, v2, v3, m-1); divide_triangle(b, v3, v1, m-1); divide_triangle(b, v3, v1, m-1); } else(triangle(a,b,c)); else(triangle(a,b,c));}
16
16 tetrahedron code void tetrahedron( int m) { glColor3f(1.0,0.0,0.0); glColor3f(1.0,0.0,0.0); divide_triangle(v[0], v[1], v[2], m); divide_triangle(v[0], v[1], v[2], m); glColor3f(0.0,1.0,0.0); glColor3f(0.0,1.0,0.0); divide_triangle(v[3], v[2], v[1], m); divide_triangle(v[3], v[2], v[1], m); glColor3f(0.0,0.0,1.0); glColor3f(0.0,0.0,1.0); divide_triangle(v[0], v[3], v[1], m); divide_triangle(v[0], v[3], v[1], m); glColor3f(0.0,0.0,0.0); glColor3f(0.0,0.0,0.0); divide_triangle(v[0], v[2], v[3], m); divide_triangle(v[0], v[2], v[3], m);}
17
17 Problem Because the triangles are drawn in the order they are defined in the program, the front triangles are not always rendered in front of triangles behind them Because the triangles are drawn in the order they are defined in the program, the front triangles are not always rendered in front of triangles behind them get this want this
18
18 Solution: Hidden-Surface Removal We want to see only those surfaces in front of other surfaces We want to see only those surfaces in front of other surfaces OpenGL uses a hidden-surface method called the z- buffer algorithm that saves depth information as objects are rendered so that only the front objects appear in the image OpenGL uses a hidden-surface method called the z- buffer algorithm that saves depth information as objects are rendered so that only the front objects appear in the image
19
19 Using the z-buffer algorithm The algorithm uses an extra buffer, the z-buffer, to store depth information as geometry travels down the pipeline The algorithm uses an extra buffer, the z-buffer, to store depth information as geometry travels down the pipeline It must be It must be Requested in main.c Requested in main.c glutInitDisplayMode glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH) (GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH) Enabled in init.c Enabled in init.c glEnable(GL_DEPTH_TEST) glEnable(GL_DEPTH_TEST) Cleared in the display callback Cleared in the display callback glClear(GL_COLOR_BUFFER_BIT | glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) GL_DEPTH_BUFFER_BIT)
20
20 Default camera setting With default, camera is located at the origin and oriented at the negative z-axes With default, camera is located at the origin and oriented at the negative z-axes If place a cube at the origin, only one side of the cube is visible If place a cube at the origin, only one side of the cube is visible Look at objects from Look at objects from different angles Move the objects Move the objects Move the camera Move the camera Example – a cube Example – a cube
21
21 Locating the camera Position and orient the camera – three inputs Position and orient the camera – three inputs Eye, at, and direction – up Eye, at, and direction – up Camera is on Model-View mode Camera is on Model-View mode
22
22 Set Viewing Glu function Glu function void gluLookAt(eyex, eyey, eyez, atx, aty, atz, upx, upy, upz) Set viewing -- example Set viewing -- exampleglMatrixMode(GL_MODELVIEW);glLoadIdentity(); gluLookAt(1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); // Camera located at (1,1,1), oriented to the origin, and directed up along y-axis
23
23 Code: Display a cube void display() {glClear(GL_COLOR_BUFFER_BIT);glMatrixMode(GL_MODELVIEW);glLoadIdentity(); gluLookAt(1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); cube();glFlush();}
Similar presentations
© 2024 SlidePlayer.com Inc.
All rights reserved.