440 likes | 763 Views
OpenGL Computer Graphics. Programming with Transformations. Topics. Transformations in OpenGL Saving Current Transformation Drawing 3D Scenes with OpenGL OpenGL Functions for Modeling and Viewing. Transformations in OpenGL. CT: current transformation Simplified graphics pipeline
E N D
OpenGL Computer Graphics Programming with Transformations
Topics • Transformations in OpenGL • Saving Current Transformation • Drawing 3D Scenes with OpenGL • OpenGL Functions for Modeling and Viewing
Transformations in OpenGL • CT: current transformation • Simplified graphics pipeline • OpenGL maintains so-called modelview matrix • Every vertex passed down the graphics pipeline is multiplied by this matrix V Window-to-Viewport Transformation S Q CT S V Q Viewport World Window Screen Coordinate System Model (Master) Coordinate System World Coordinate System
Transformations in OpenGL • OpenGL is a 3D graphics package • Transformations are 3D • How does it work in 2D? • 2D drawing is done in the xy-plane, z coordinate is 0. • Translation: dz = 0 • Scaling: Sz = 1 • Rotation: z-roll y z x
Transformations in OpenGL • Fundamental Transformations • Translation: glTranslated(dx, dy, dz) for 2D: glTranslated(dx, dy, 0) • Scaling: glScaled(sx, sy, sz) for 2D: glScaled(sx, sy, 1.0) • Rotation: glRotated(angle, ux, uy, uz) for 2D: glRotated(angle, 0, 0, 1) • Transformations does not set CT directly, a matrix is postmultiplied to CT • CT = CT M
Transformations in OpenGL • Canvas functions • void Canvas:: initCT(void) { glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } • void Canvas:: scale2D(double sx, double sy) { glMatrixMode(GL_MODELVIEW); glScaled(dx, dy, 1.0); }
Transformations in OpenGL • Canvas functions • void Canvas:: translate2D(double dx, double dy) { glMatrixMode(GL_MODELVIEW); glTranslated(dx, dy, 0); } • void Canvas:: rotate2D(double angle) { glMatrixMode(GL_MODELVIEW); glRotated(angle, 0.0, 0.0, 1.0); }
Transformations Example • Draw a house. Draw another house by rotating it through -30° and then translating it through (32, 25) • cvs.initCT(); house(); cvs.translate2D(32, 25); cvs.rotate2D(-30.0); house();
Transformations Example • Think of it in two different ways • Q =T(32, 25)R(-30)P CT = CT T(32, 25) R(-30) • Translate the coordinate system through (32, 25) and then rotate it through –30° • The code generated by these two ways is identical.
Saving Current Transformation • We can save and restore CTs using glPushMatrix() and glPopMatrix() • Manipulation of a stack of CT After popCT() After rotate2D() Before After pushCT() CT4 = CT3 Rot CT4 CT3 CT3 CT3 CT3 CT2 CT2 CT2 CT2 CT1 CT1 CT1 CT1
Saving Current Transformation • Canvas functions • void Canvas:: pushCT(void) { glMatrixMode(GL_MODELVIEW); glPushMatrix(); } • void Canvas:: popCT(void) { glMatrixMode(GL_MODELVIEW); glPopMatrix(); }
Saving CT Examples • Master coordinate system: where an object is defined • Modeling transformation: transforms an object from its master coordinate system to world coordinate system to produce an instance • Instance: a picture of an object in the scene
Drawing 3D Scenes with OpenGL • The concept of “camera” (eye) is used for 3D viewing • Our 2D drawing is a special case of 3D drawing far plane y view volume near plane z x eye Viewport window
Drawing 3D Scenes with OpenGL • Camera to produce parallel view of a 3D scene
Drawing 3D Scenes with OpenGL • Simplified OpenGL graphics pipeline VM P Vp clip viewport matrix modelview matrix projection matrix
Drawing 3D Scenes with OpenGL • Modelview matrix = CT • Object transformation + camera transformation • Applying model matrix M then viewing matrix V
Drawing 3D Scenes with OpenGL • Projection matrix • Shifts and scales view volume into a standard cube (extension from –1 to 1) • Distortion can be compensated by viewport transformation later
Drawing 3D Scenes with OpenGL • Viewport matrix • Maps surviving portion of objects into a 3D viewport after clipping is performed • Standard cube block w/ x and y extending across viewport and z from 0 to 1
OpenGL Modeling and Viewing Functions • Modeling transformation • Translation: glTranslated(dx, dy, dz) • Scaling: glScaled(sx, sy, sz) • Rotation: glRotated(angle, ux, uy, uz) • Camera for parallel projection • glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(left, right, bottom, top, near, far) • Example • near=2: near plane is 2 units in front of eye far=20: far plane is 20 units in front of eye
OpenGL Modeling and Viewing Functions • Positioning and aiming camera • glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glutLookAt(eye.x, eye.y, eye.z, // eye position look.x, look.y, look.z, // look at point up.x, up.y, up.z) // up vector • Up vector is often set to (0, 1, 0) • glutLookAt() builds a matrix that converts world coordinates into eye coordinates.
Set up a Typical Camera - Example • glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-3.2, 3.2, -2.4, 2.4, 1, 50) glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glutLookAt(4, 4, 4, 0, 1, 0, 0, 1, 0) (4, 4, 4) (0, 1, 0)
Transformation Matrix for LookAt • Camera coordinate system • Axes: u, v, n n = eye – look u = up n v = nu • Origin: eye (looking in the direction –n) • Transformation matrix
Elementary 3D Shapes Provided by OpenGL • Cube • glutWireCube(GLdouble size) • size = length of a side • Sphere • glutWireSphere(GLdouble radius, GLint nSlices, GLint nStacks) • Approximated by polygonal faces • nSlices = #polygons around z-axis • nStacks = #bands along z-axis
Elementary 3D Shapes Provided by OpenGL • Torus • glutWireTorus(GLdouble inRad, GLdouble outRad, GLint nSlices, GLint nStacks) • Approximated by polygonal faces • Teapots • glutWireTeapot(GLdouble size) • There are solid counterparts of the wire objects
Plantonic Solids Provided by OpenGL • Tetrahedron • glutWireTetrahedron() • Octahedron • glutWireOctahedron() • Dodecahedron • glutWireDodecahedron() • Icosahedron • glutWireIcosahedron() • All of them are centered at the origin
Cone Provided by OpenGL • Cone • glutWireCone(GLdouble baseRad, GLdouble height, GLint nSlices, GLint nStacks) • Axis coincides with the z-axis • Base rests on xy-plane and extends to z = height • baseRad: radius at z = 0
Tapered Cylinder Provided by OpenGL • Tapered cylinder • gluCylinder(GLUquadricObj *qobj, GLdouble baseRad, GLdouble topRad, GLdouble height, GLint nSlices, GLint nStacks) • Axis coincides with the z-axis • Base rests on xy-plane and extends to z = height • baseRad: radius at z = 0 • topRad: radius at z = height
Tapered Cylinder Provided by OpenGL • A family of shapes distinguished by the value of topRad • To draw, we have to • Deifne a new quadric object • Set drawing style • GLU_LINE: wire frame • GLU_FILL: solid rendering • Draw the object
Tapered Cylinder Provided by OpenGL • Example – wire frame cylinder • GLUquadricObj *qobj; qobj = gluNewQuadric(); gluQuadricDrawStyle(qobj, GLU_LINE); gluCylinder(qobj, baseRad, topRad, height, nSlices, nStacks);
#include <gl/glut.h> //<<<<<<<<<<<<<<<<<<< axis >>>>>>>>>>>>>> void axis(double length) { // draw a z-axis, with cone at end glPushMatrix(); glBegin(GL_LINES); glVertex3d(0, 0, 0); glVertex3d(0,0,length); // along the z-axis glEnd(); glTranslated(0, 0,length -0.2); glutWireCone(0.04, 0.2, 12, 9); glPopMatrix(); }
//<<<<<<<<<<<<<< displayWire >>>>>>>>>>>>>> void displayWire(void) { glMatrixMode(GL_PROJECTION); // set the view volume shape glLoadIdentity(); glOrtho(-2.0*64/48.0, 2.0*64/48.0, -2.0, 2.0, 0.1, 100); glMatrixMode(GL_MODELVIEW); // position and aim the camera glLoadIdentity(); gluLookAt(2.0, 2.0, 2.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); // to obtain the picture shown in Figure 5.59 we have to // change the eye location as follows // gluLookAt(1.0, 1.0, 2.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT); // clear the screen glColor3d(0,0,0); // draw black lines axis(0.5); // z-axis glPushMatrix(); glRotated(90, 0, 1, 0); axis(0.5); // x-axis glRotated(-90, 1, 0, 0); axis(0.5); // y-axis glPopMatrix(); glPushMatrix(); glTranslated(0.5, 0.5, 0.5); // big cube at (0.5, 0.5, 0.5) glutWireCube(1.0); glPopMatrix();
glPushMatrix(); glTranslated(1.0,1.0,0); // sphere at (1,1,0) glutWireSphere(0.25, 10, 8); glPopMatrix(); glPushMatrix(); glTranslated(1.0,0,1.0); // cone at (1,0,1) glutWireCone(0.2, 0.5, 10, 8); glPopMatrix(); glPushMatrix(); glTranslated(1,1,1); glutWireTeapot(0.2); // teapot at (1,1,1) glPopMatrix();
glPushMatrix(); glTranslated(0, 1.0 ,0); // torus at (0,1,0) glRotated(90.0, 1,0,0); glutWireTorus(0.1, 0.3, 10,10); glPopMatrix(); glPushMatrix(); glTranslated(1.0, 0 ,0); // dodecahedron at (1,0,0) glScaled(0.15, 0.15, 0.15); glutWireDodecahedron(); glPopMatrix();
glPushMatrix(); glTranslated(0, 1.0 ,1.0); // small cube at (0,1,1) glutWireCube(0.25); glPopMatrix(); glPushMatrix(); glTranslated(0, 0 ,1.0); // cylinder at (0,0,1) GLUquadricObj * qobj; qobj = gluNewQuadric(); gluQuadricDrawStyle(qobj,GLU_LINE); gluCylinder(qobj, 0.2, 0.2, 0.4, 8,8); glPopMatrix(); glFlush(); }
//<<<<<<<<<<<<<<<< main >>>>>>>>>>>>>>>> void main(int argc, char **argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB ); glutInitWindowSize(640,480); glutInitWindowPosition(100, 100); glutCreateWindow("Transformation testbed - wireframes"); glutDisplayFunc(displayWire); glClearColor(1.0f, 1.0f, 1.0f,0.0f); // background is white glViewport(0, 0, 640, 480); glutMainLoop(); }