180 likes | 311 Vues
OpenGL and Projections. David E. Johnson. Goals. Quick overview of OpenGL Some derivation of projections and transformations. OpenGL. OpenGL is nothing more than a set of functions you call from your program Most functions map to GPU hardware
E N D
OpenGL and Projections David E. Johnson
Goals • Quick overview of OpenGL • Some derivation of projections and transformations
OpenGL • OpenGL is nothing more than a set of functions you call from your program • Most functions map to GPU hardware • Hides the details of the display adapter, operating system, etc. • Has grown to become a flexible general purpose compute platform
As a programmer, you need to • Specify the location/parameters of camera. • Specify the geometry (and appearance). • Specify the lights. • OpenGL will compute the resulting 2D image!
OpenGL Hierarchy • Several levels of abstraction are provided • GL • Lowest level: vertex, matrix manipulation • glVertex3f(point.x, point.y, point.z) • GLU • Helper functions for shapes, transformations • gluPerspective( fovy, aspect, near, far ) • GLUT • Highest level: Window and interface management • glutSwapBuffers() • All fairly raw – most people have their own point class which gets transformed to GL arrays as needed.
OpenGL Implementations • OpenGL is an API • #include <GL/gl.h> • #include <GL/glu.h> • #include <GL/glut.h> • Windows, Linux, UNIX, etc. all provide a platform specific implementation. • Windows: opengl32.lib glu32.lib glut32.lib • Linux: -l GL -l GLU –l GLUT
OpenGL Conventions • OpenGL is largely state based • Calls persist • This instead of having functions with 100s of options • Transformations live on stacks • Layers of transformations possible • Work is done on buffers (color, depth,…) • Many functions have multiple forms: • glVertex2f, glVertex3i, glVertex4dv, etc. • Number indicates number of arguments • Letters indicate type • f: float, d: double, v: pointer, etc. • Programs tend to be event based
A simple GLUT program // A simple OpenGL and glut program #include <GL/gl.h> #include <GL/glut.h> void display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); glFlush(); } int main(int argc, char **argv) { glutInit(&argc, argv); glutInitWindowSize(512,512); glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH ); glutCreateWindow("The glut hello world program"); glutDisplayFunc(display); glClearColor(0.0, 0.0, 0.0, 1.0); glutMainLoop(); // Infinite event loop return 0; }
OpenGL: Camera • Two things to specify: • Physical location of camera in the scene • Where is the camera? • Which direction is it pointing? • What is the orientation of the camera? • Projection properties of the camera • Depth of field? • Field of view in the x and y directions?
The OpenGL Camera • Initially the object and camera frames are the same • Default model-view matrix is an identity • The camera is located at origin and points in the negative z direction • OpenGL also specifies a default view volume that is a cube with sides of length 2 centered at the origin • Default projection matrix is an identity
Moving Camera Back default frames frames after translation by –d d > 0
Moving the Camera • We can move the camera to any desired position by a sequence of rotations and translations • Example: side view • Rotate the camera • Move it away from origin • Model-view matrix C = RT
OpenGL code • Remember that last transformation specified is first to be applied glMatrixMode(GL_MODELVIEW) glLoadIdentity(); glRotatef(90.0, 0.0, 1.0, 0.0); glTranslatef(0.0, 0.0, -d);
The LookAt Function • The GLU library contains the function gluLookAt to form the required modelview matrix through a simple interface • Note the need for setting an up direction • Still need to initialize • Can concatenate with modeling transformations • Example: isometric view of cube aligned with axes glMatrixMode(GL_MODELVIEW): glLoadIdentity(); gluLookAt(1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0., 1.0. 0.0);
gluLookAt glLookAt(eyex, eyey, eyez, atx, aty, atz, upx, upy, upz)
Projections • See notes