OpenGL_summer2012.ccccccccccccccccccpptx

arcse1 12 views 56 slides May 12, 2025
Slide 1
Slide 1 of 56
Slide 1
1
Slide 2
2
Slide 3
3
Slide 4
4
Slide 5
5
Slide 6
6
Slide 7
7
Slide 8
8
Slide 9
9
Slide 10
10
Slide 11
11
Slide 12
12
Slide 13
13
Slide 14
14
Slide 15
15
Slide 16
16
Slide 17
17
Slide 18
18
Slide 19
19
Slide 20
20
Slide 21
21
Slide 22
22
Slide 23
23
Slide 24
24
Slide 25
25
Slide 26
26
Slide 27
27
Slide 28
28
Slide 29
29
Slide 30
30
Slide 31
31
Slide 32
32
Slide 33
33
Slide 34
34
Slide 35
35
Slide 36
36
Slide 37
37
Slide 38
38
Slide 39
39
Slide 40
40
Slide 41
41
Slide 42
42
Slide 43
43
Slide 44
44
Slide 45
45
Slide 46
46
Slide 47
47
Slide 48
48
Slide 49
49
Slide 50
50
Slide 51
51
Slide 52
52
Slide 53
53
Slide 54
54
Slide 55
55
Slide 56
56

About This Presentation

abc


Slide Content

OpenGL Graphics Programming Katia Oleinik: [email protected]

Graphics Programming OpenGL Low-level API cross-language cross-platform 2D, 3D computer graphics

GLUT - The OpenGL Utility Toolkit simple, easy and small window system independent toolkit for writing OpenGL programs; implements a simple windowing API; makes it considerably easier to learn and explore OpenGL; provides portable API – you can write a single OpenGL program; designed for constructing small sized OpenGL programs; is not a full-featured toolkit for large applications that requires sophisticated user interface has C/C++ and FORTRAN programming bindings available on nearly all platforms

Simple GLUT program Step0.c Log on to katana % cp –r /scratch/ ogltut / ogl . % cd ogl N ote that after tutorial, examples will be available via the web, but not in the location above. Go to http://scv.bu.edu/documentation/presentations/intro_to_OpenGL/ogltut/

Simple GLUT program #include < stdio.h > #include < stdlib.h > #include <GL/ glut.h > void display(void); void init (void); int main( int argc, char ** argv ){ glutInit (&argc, argv ); // GLUT Configuration glutCreateWindow ("Sample GL Window"); // Create Window and give a title glutDisplayFunc ( display ); /* Set display as a callback for the current window */ init (); /* Set basic openGL states */ /* Enter GLUT event processing loop, which interprets events and calls respective callback routines */ glutMainLoop (); return ; } Step0.c

Simple GLUT program /* called once to set up basic opengl state */ void init ( ){ } /* display is called by the glut main loop once for every animated frame */ void display ( ){ } Step0.c

Steps to edit, compile and run the program Edit the source file in the editor, save it and exit > make file_name > file_name For step0.c : > make step0 > step0

More GLUT functions int main( int argc, char ** argv ){ glutInit (&argc, argv ); // GLUT Configuration glutInitDisplayMode ( GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH ); glutInitWindowSize ( 500, 500 ); // Set size and position of the window glutWindowPosition ( 200 , 200 ); glutCreateWindow (“GL Primitives"); // Create Window and give a title glutDisplayFunc ( display ); /* Set a callback for the current window */ init (); /* Set basic openGL states */ /* Enter GLUT event processing loop */ glutMainLoop (); return ; } Step1.c

Initialize openGL scene /* called once to set up basic openGL state */ void init (void){ glEnable (GL_DEPTH_TEST); /* Use depth buffering for hidden surface removal*/ glMatrixMode (GL_PROJECTION); /* Set up the perspective matrix */ glLoadIdentity (); /* left, right, bottom, top, near, far */ /* near and far values are the distances from the camera to the front and rear clipping planes */ glOrtho (-4.0, 4.0, -4.0, 4.0, 1., 10.0); // orthgraphic view glMatrixMode (GL_MODELVIEW); /* Set up the model view matrix */ glLoadIdentity (); /* Camera position */ /* By the default, the camera is situated at the origin, points down the negative z-axis, and has an upper vector (0,1,0)*/ gluLookAt (0 .,0.,5.,0.,0.,0.,0.,1.,0.); } Step1.c

More GLUT functions /* drawing routine, called by the display function every animated frame */ void mydraw ( ){ glColor3f ( 1.0, 0.0, 0.0); // red color glutSolidSphere (1 ., 24, 24 ); // draw a sphere of radius 1 . } /* display is called by the glut main loop once for every animated frame */ void display ( ){ /* initialize color and depth buffers */ glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); /* call the routine that actually draws what you want */ mydraw (); glutSwapBuffers (); /* show the just-filled frame buffer */ } Step1.c

GLUT primitives void glut Solid Sphere ( GLdouble radius, GLint slices, GLint stacks); void glut Wire Sphere ( GLdouble radius, GLint slices, GLint stacks ); void glutSolid Cube ( GLdouble size); void glutSolid Cone ( GLdouble base, GLdouble height, GLint slices, GLint stacks); void glutSolid Torus ( GLdouble innerRadius , GLdouble outerRadius , GLint nsides , GLint rings); void glutSolid Dodecahedron (void); // radius sqrt (3) void glutSolid Tetrahedron (void ); // radius sqrt (3 ) void glutSolid Icosahedron (void ) // radius 1 void glutSolid Octahedron (void ); // radius 1

Interactive Exercise #1: working with GLUT primitives Run interactive exercise #1 > int_gl_prim Use up and down arrows to explore different GLUT primitives Use w/s keys to switch between wire and solid state Step1.c

GLUT primitives glutSolidSphere glutWireSphere glutSolidCube glutWireCube glutSolidCone glutWireCone glutSolidTorus glutWireTorus glutSolidDodecahedron glutWireDodecahedron glutSolidOctahedron glutWireOctahedron glutSolidTetrahedron glutWireTetrahedron glutSolidIcosahedron glutWireIcosahedron glutSolidTeapot glutWireTeapot More info: http://www.opengl.org/documentation/specs/glut/spec3/node80.html Step1.c

Colors: RGBA vs. Color-Index

Interactive Exercise #2: Exploring openGL colors Run interactive exercise > int_gl_color Press c/s keys to switch between object/background mode Use r/g/b keys to switch between red/green/blue components Use arrow keys to modify the value of color component Step1.c

Setting up the scene and adding color /* display is called by the glut main loop once for every animated frame */ void display ( ){ /* initialize background color and clear color and depth buffers */ glClearColor (0.7f, 0.7f, 0.7, 0.0f); glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); mydraw (); glutSwapBuffers (); } Step1.c

Setting up the scene and adding color void mydraw () { glColor3f ( 1.0 , 0.0 , 0.0 ); /* red color */ glutSolidTeapot (.5); /* draw teapot */ } More information about gl color routines: http://www.opengl.org/sdk/docs/man/xhtml/glColor.xml Step1.c

Open GL transformation Step1.c

Viewing: Camera Analogy Step1.c

Viewport transformation indicates the shape of the available screen area into which the scene is mapped Since viewport specifies the region the image occupies on the computer screen, you can think of the viewport transformation as defining the size and location of the final processed photograph - for example, whether the photograph should be enlarged or shrunk . if the window changes size, the viewport needs to change accordingly Step1.c void glViewport ( int x, int y, int width, int height);

Viewport transformation Step1.c glViewport ( 0, 0, width, height );

Projection Perspective vs. Orthographic Objects which are far away are smaller than those nearby; Does not preserve the shape of the objects. Perspective view points give more information about depth; Easier to view because you use perspective views in real life . Useful in architecture, game design, art etc. All objects appear the same size regardless the distance; Orthographic views make it much easier to compare sizes of the objects. It is possible to accurately measure the distances All views are at the same scale Very useful for cartography, engineering drawings, machine parts. Step1.c

Projection transformation glMatrixMode (GL_PROJECTION ); glLoadIdentity (); //perspective projection glFrustum (left , right , bottom, top , near , far); Or //orthographic projection glOrtho ( left, right, bottom, top, near, far ); Step1.c

Perspective Transformation //perspective projection void glFrustum (double left , double right , double bottom, double top , double near , double far); Step1.c

Perspective Transformation Four sides of the frustum, its top, and its base correspond to the six clipping planes of the viewing volume. Objects or parts of objects outside these planes are clipped from the final image Does not have to be symmetrical Step1.c

Perspective Transformation //perspective projection void gluPerspective ( double fovy , double aspect, double near, double far); Step1.c

Orthographic Transformation //orthographic projection void glOrtho ( double left, double right, double bottom, double top, double near, double far); Step1.c

Modelview Matrix //perspective projection void gluLookAt (double eyeX , double eyeY , double eyeZ , double centerX , double centerY , double centerZ , double upX , double upY , double upZ ); Step1.c

Setting up the scene void init (void ) { /* called once to set up basic opengl state */ gl Enable (GL_DEPTH_TEST); gl MatrixMode(GL_PROJECTION); /* Set up the projection matrix */ gl LoadIdentity(); // left , right , bottom , top , near , far gl Frustum ( -1.0 , 1.0 , -1.0 , 1.0 , 1. , 10.0 ); // perspective view // gl Ortho ( - 1.0 , 1.0 , -1.0 , 1.0 , 1. , 10.0 ); // orthographic view // glu Perspective(45.0f, 1., 1., 10.); // perspective view gl MatrixMode(GL_MODELVIEW); /* Set up the model view matrix */ gl LoadIdentity(); eye center up-direction glu LookAt ( .,0.,2., 0.,0.,0., 0.,1.,0 . ); /* Camera position */ } Step1.c

Interactive exercise #3: setting up the camera Run interactive exercise > int_gl_camera Use a/ n/ f keys to choose angle/ near/ far modes. Use ex/ ey / ez keys to choose x, y, z values for eye location. Use cx / cy / cz keys to choose x, y, z values for center location. Step1.c

Assignment #1: setting up the scene Modify input file step1.c Draw a ball with the color of your choice Set orthographic projection, so that the diameter of the ball would be about 20% of the width of the screen. Set up camera on z axis 5 units away from the origin step1.c

Additional GLUT callback routines GLUT supports many different callback actions, including : glutDisplayFunc () defines the function that sets up the image on the screen glutReshapeFunc () function is called when the size of the window is changed glutKeyBoardFunc () callback routine to respond on keyboard entry glutMouseFunc () callback to respond on pressing the mouse button glutMotionFunc () callback to respond mouse move while a mouse button is pressed glutPassiveMouseFunc () callback to respond to mouse motion regardless state of mouse button glutIdleFunc () callback routine for idle state, usually used for animation More info: http ://www.opengl.org/resources/libraries/glut/spec3/node45.html step2.c

Additional GLUT callback routines int main ( int argc , char ** argv ) { . . . /* Set callback function that responds on keyboard pressing */ glutKeyboardFunc ( keypress ); . . . } /* keyboard callback routine */ void keypress ( unsigned char key, int x, int y) { if (key == 'q' || key =='Q' || key ==27) exit (0); // exit } step2.c

Callback routines & Window Resizing int main (int argc, char **argv ) { . . . /* Set display as a callback for the current window */ glutDisplayFunc ( display ); /* Set callback function that respond to resizing the window */ glutReshapeFunc ( resize ); /* Set callback function that responds on keyboard pressing */ glutKeyboardFunc ( keypress ); /* Set callback function that responds on the mouse click */ glutMouseFunc ( mousepress ); . . . } Step2.c

Callback routines & Window Resizing void keypress ( unsigned char key, int x, int y ) { … } void mousepress ( int button, int state, int x, int y ) { … } void resize (int width, int height ) { double aspect ; glViewport (0,0,width,height); /* Reset the viewport */ aspect = ( double)width / (double)height ; /* compute aspect ratio*/ glMatrixMode (GL_PROJECTION ); glLoadIdentity (); // reset projection matrix if (aspect < 1.0) { glOrtho (-4., 4., -4./aspect, 4./aspect, 1., 10 .); } else { glOrtho (-4.*aspect, 4.*aspect, -4., 4., 1., 10 .); } glMatrixMode (GL_MODELVIEW ); glLoadIdentity (); gluLookAt (0 ., 0., 5., 0., 0., 0., 0., 1., 0 .); } Step2.c

Assignment #2: callback routines and viewport Modify input file step2.c Enable a Keyboard callback routine that prints the pressed key in the command window Make the program exit, when ESC ( ascii =27), "q" or "Q" are pressed Enable a Mouse callback routine that prints on the screen the information about which mouse button was pressed step2.c

Geometric Primitives step3.c

OpenGL Primitives glBegin (GL_LINES); glVertex3f(10.0f , 0.0f , 0.0f); glVertex3f(20.0f , 0.0f , 0.0f); glVertex3f(10.0f , 5.0f, 0.0f ); glVertex3f(20.0f , 5.0f , 0.0f ); glEnd (); step3.c http://www.opengl.org/sdk/docs/man/xhtml/glBegin.xml

Define a box void boxDef ( float length, float height, float width ) { glBegin (GL_QUADS); /* you can color each side or even each vertex in different color */ glColor3f(0 ., .35, 1 .); glVertex3f (-length/2., height/2., width/2.); glVertex3f ( length/2., height/2., width/2.); glVertex3f ( length/2., height/2.,-width/2.); glVertex3f (-length/2., height/2.,-width/2.); /* add here other sides */ ….. glEnd (); } s tep3.c

OpenGL Transformations Object Coordinates Eye Coordinates Clip Coordinates Device Coordinates Window Coordinates step3.c

Model View Transformations glMatrixMode (GL_MODELVIEW); glLoadIdentity (); glTranslate (x, y, z ); /* transformation L */ glRotate ( angle , x, y, z ); /* transformation M */ glScale (x, y, z ); /* transformation N */ Order of operations : L * M * N * v Draw Geometry step3.c

Model View Transformations View from a plane Orbit an object void pilotView ( … ) { glRotatef (roll , 0.0, 0.0, 1.0 ); glRotatef (pitch , 0.0, 1.0, 0.0 ); glRotatef (heading , 1.0, 0.0, 0.0 ); glTranslatef (-x , -y , -z); } void polarView ( … ) { glTranslatef (0.0 , 0.0, -distance ); glRotated (-twist, 0.0, 0.0, 1.0 ); glRotated (-elevation, 1.0, 0.0,0.0); glRotated (azimuth, 0.0, 0.0, 1.0); } step3.c http://www.opengl.org/sdk/docs/man/xhtml/glRotate.xml

Assignment #3: GL primitives and transformations Modify input file step3.c Create a thin box, centered around 0, using GL_QUADS type. This box should be .01 thick (along y axis), 2.0 units in length (in x axis ), . 4 units in width (along z axis). Define a different (from your sphere) color for the box. Remember you can assign a different color for each quad or even to each vertex(!). Move your sphere 1 unite up along y axis. Move box down y axis, so its upper plane is on the level y=0. Modify your keypress callback function to respond on pressing "w" and "s" keys to switch between wire and solid states: The GL constants are GL_FILL and GL_LINE step3.c

OpenGL Display Lists // create one display list int index = glGenLists (1 ); // compile the display list glNewList (index , GL_COMPILE); glBegin (GL_TRIANGLES ); glVertex3fv(v0 ); glVertex3fv(v1 ); glVertex3fv(v2 ); glEnd (); glEndList (); ... // draw the display list glCallList (index ); ... // delete it if it is not used any more glDeleteLists (index , 1); step4.c

Assignment #4: using GL lists Modify input file step4.c use glScale to scale down the ball. Try to place glScale command before glTranslate and then after. Compare the results . Add to the keyPress callback routine: if user presses "<" and ">" (or left, right) buttons, the platform (box) moves to the left and to the right accordingly. Remember it should not go beyond the clipping planes, so x coordinate for the translation can not exceed plus/minus 4 step4.c

Lighting Ambient Diffuse Specular Ambient & Diffuse Diffuse & Specular Ambient, Diffuse & Specular step5.c

Light(s) Position At least 8 lights available. GLfloat light_pos [] = { x, y, z, w } // 4 th value: w=1 – for positional, w=0 – for directional glLightfv (GL_LIGHT0, GL_POSITION, light_pos ) step5.c http://www.opengl.org/sdk/docs/man/xhtml/glLight.xml

Material Properties step5.c

Default Lighting values Parameter Name Default Value Meaning GL_AMBIENT (0.0, 0.0, 0.0, 1.0) ambient RGBA intensity of light GL_DIFFUSE (1.0, 1.0, 1.0, 1.0) diffuse RGBA intensity of light GL_SPECULAR (1.0, 1.0, 1.0, 1.0) specular RGBA intensity of light GL_POSITION (0.0, 0.0, 1.0, 0.0) ( x, y, z, w ) position of light GL_SPOT_DIRECTION (0.0, 0.0, -1.0) ( x, y, z ) direction of spotlight step5.c

Default Material values Parameter Name Default Value Meaning GL_AMBIENT (0.2, 0.2, 0.2, 1.0) ambient color of material GL_DIFFUSE (0.8, 0.8, 0.8, 1.0) diffuse color of material GL_AMBIENT_AND_DIFFUSE   ambient and diffuse color of material GL_SPECULAR (0.0, 0.0, 0.0, 1.0) specular color of material GL_SHININESS 0.0 specular exponent in the range of 0.0 to 128.0 GL_EMISSION (0.0, 0.0, 0.0, 1.0) emissive color of material (to simulate a light) step5.c

A simple way to define light Light: set diffuse to the color you want the light to be set specular equal to diffuse set ambient to 1/4 of diffuse. M aterial : set diffuse to the color you want the material to be set specular to a gray (white is brightest reflection, black is no reflection) set ambient to 1/4 of diffuse step5.c

Enable Lighting /* Enable a single OpenGL light. */ glLightfv (GL_LIGHT0 , GL_DIFFUSE, light_diffuse ); glLightfv (GL_LIGHT0 , GL_POSITION, light_position ); glEnable (GL_LIGHT0 ); glEnable (GL_LIGHTING); glClearColor (0.0, 0.0, 0.0, 0.0); // background color glShadeModel (GL_SMOOTH); // shading algorithm glMaterialfv (GL_FRONT , GL_SPECULAR, mat_specular ); glMaterialfv (GL_FRONT , GL_SHININESS, mat_shininess ); glEnable ( GL_NORMALIZE ) ; //enable normalizing to avoid problems with light! … glBegin (GL_QUADS ); // specify a normal either per vertex or per polygon    glNormal3f (0 , 0, 1);    glVertex3fv(a );    glVertex3fv(b );    glVertex3fv(c );    glVertex3fv(d ); glEnd (); step5.c

Assignment #5: add lights to the scene and explore transformations Modify input file step5.c Enable openGL lighs . Use directional light with the direction coming diagonaly from the upper right corner toward the origin. Calculate normals for the sides of the platform Add to the keyboard events the handling of pressing X, Y, Z , keys - they will change the axis of the rotation. And pressing keys F and B will rotate the object for 10 degrees. Apply this rotations to the platform only. step5.c

Assignment #6: putting it all together for a game! Modify input file step6.c move the platform down the screen, so it would move along the y=-4 level make ball "bounce" from the wall, left and right walls and the platform if the ball misses the platform, it should "fall" beneath the "floor" and a new ball should appear from the "ceiling". step6.c

OpenGL Helpful Materials

Thank you! Final Notes: Please fill out an online evaluation of this tutorial: scv.bu.edu/survey/tutorial_evaluation.html System help [email protected] , [email protected] Web-based tutorials www.bu.edu/tech/research/tutorials Consultation by appointment Katia Oleinik ([email protected])
Tags