opengl programming: viewing & trackball assignment · computer graphics: • set up tripod ......

23
OpenGL programming: Viewing & Trackball Assignment

Upload: vudan

Post on 02-Aug-2018

234 views

Category:

Documents


0 download

TRANSCRIPT

OpenGL programming:

Viewing &Trackball Assignment

Viewing in OpenGL

2

Overview

• The camera analogy• Stages of vertex transformation• The Matrix Stacks• A simple example: Drawing a cube …• Viewing & modeling transformations• Assignment: Trackball

Viewing in OpenGL

3

The Camera AnalogyTransformation process incomputer graphics:• Set up tripod and point

camera at the sceneViewing transformation

• Arrange the sceneModeling transformation

• Choose a lens and/or adjust zoomProjection transformation

• Size of the final photographViewport transformation

Viewing in OpenGL

4

Stages of Vertex Transformation

GL_MODELVIEW

GL_PROJECTION

glFrustum(), glDepthRange()

glViewport()

Modern GPUs:Vertex Program

viewing and modellingtransformation

Viewing in OpenGL

5

The Matrix Stacks

• Modelview and projection defined by two matrices• Matrices are top elements of two matrix stacks• Stack selection:

glMatrixMode()

• glPushMatrix()glPopMatrix()

• Stacks allow to undomodifications

• Functions to modifytop matrix:glLoadIdentity(), glLoadMatrix(),glMultMatrix(), glTranslate(),glRotate(), glScale()

Modelview 4

Modelview 3

Modelview 2

Modelview 1

Modelview 0 Projection 2

Projection 1

Top elementsare active

GL_MODELVIEW GL_PROJECTION

order in code does not matter

Viewing in OpenGL

6

A Simple Example:Drawing A Cube …

void display(void) {glClear (GL_COLOR_BUFFER_BIT);glLoadIdentity ();gluLookAt (0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);glScalef (1.0, 2.0, 1.0);glutWireCube (1.0);glFlush ();

}

void reshape (int w, int h) {glViewport (0, 0, (GLsizei) w, (GLsizei) h);glMatrixMode (GL_PROJECTION);glLoadIdentity ();glFrustum (-1.0, 1.0, -1.0, 1.0, 1.5, 20.0);glMatrixMode (GL_MODELVIEW);

}

int main(int argc, char** argv) {glutInit(&argc, argv);glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);glutCreateWindow (argv[0]);glutDisplayFunc(display);glutReshapeFunc(reshape);glutMainLoop();

}

Viewing in OpenGL

7

… Viewing Transformation

• Positioning and aiming a camera• Specification, e.g., with gluLookAt(…)• Arguments:

– camera position (“center of projection”)– camera aimed to (“view reference point”, “look at”)– up-direction (fixes rotation around optical axis)

• Modifies current matrix• ! Default camera position in OpenGL !

Viewing in OpenGL

8

void display(void) {glClear (GL_COLOR_BUFFER_BIT);glLoadIdentity ();gluLookAt (0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);glScalef (1.0, 2.0, 1.0);glutWireCube (1.0);glFlush ();

}

void reshape (int w, int h) {glViewport (0, 0, (GLsizei) w, (GLsizei) h);glMatrixMode (GL_PROJECTION);glLoadIdentity ();glFrustum (-1.0, 1.0, -1.0, 1.0, 1.5, 20.0);glMatrixMode (GL_MODELVIEW);

}

int main(int argc, char** argv) {glutInit(&argc, argv);glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);glutCreateWindow (argv[0]);glutDisplayFunc(display);glutReshapeFunc(reshape);glutMainLoop();

}

… Viewing TransformationDefault matrix mode:

GL_MODELVIEW

Viewing in OpenGL

9

glLookAt example(1)

gluLookAt (0.0, 0.0, 5.0, //camera position 0.0, 0.0, 0.0, //camera aimed to 0.0, 1.0, 0.0); //up-direction

Viewing in OpenGL

10

glLookAt example(2)

gluLookAt (3.0, 2.0, 2.0, //camera position 0.0, 0.0, 0.0, //camera aimed to 0.0, 1.0, 0.0); //up-direction

Viewing in OpenGL

11

glLookAt example(3)

gluLookAt (3.0, 2.0, 2.0, //camera position 0.0, 0.0, 0.0, //camera aimed to 0.0, 0.0, 1.0); //up-direction

Viewing in OpenGL

12

… Modeling Transformation

• Placing a model (position, orientation)• In our example: using glScale(…)• Accumulated in modelview matrix (right

multiply)

• ! Duality of viewing & modeling transform !e.g. gluLookAt(…) ↔ glTranslatef(…)

Viewing in OpenGL

13

… Modeling Transformationvoid display(void) {

glClear (GL_COLOR_BUFFER_BIT);glLoadIdentity ();gluLookAt (0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);glScalef (1.0, 2.0, 1.0);glutWireCube (1.0);glFlush ();

}

void reshape (int w, int h) {glViewport (0, 0, (GLsizei) w, (GLsizei) h);glMatrixMode (GL_PROJECTION);glLoadIdentity ();glFrustum (-1.0, 1.0, -1.0, 1.0, 1.5, 20.0);glMatrixMode (GL_MODELVIEW);

}

int main(int argc, char** argv) {glutInit(&argc, argv);glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);glutCreateWindow (argv[0]);glutDisplayFunc(display);glutReshapeFunc(reshape);glutMainLoop();

}

Viewing in OpenGL

14

… Projection Transformation

• Like choosing a lens for a photo camera• Projection transformation with glFrustum(…)

• Determination of field of view/viewing volume• Determination of type of projection

• Here: included in the reshape callback

Viewing in OpenGL

15

… Projection Transformationvoid display(void) {

glClear (GL_COLOR_BUFFER_BIT);glLoadIdentity ();gluLookAt (0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);glScalef (1.0, 2.0, 1.0);glutWireCube (1.0);glFlush ();

}

void reshape (int w, int h) {glViewport (0, 0, (GLsizei) w, (GLsizei) h);glMatrixMode (GL_PROJECTION);glLoadIdentity ();glFrustum (-1.0, 1.0, -1.0, 1.0, 1.5, 20.0);glMatrixMode (GL_MODELVIEW);

}

int main(int argc, char** argv) {glutInit(&argc, argv);glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);glutCreateWindow (argv[0]);glutDisplayFunc(display);glutReshapeFunc(reshape);glutMainLoop();

}

Viewing in OpenGL

16

… Viewport Transformation

• Scene mapping to screen coordinates– Projection transformation: how …– Viewport transformation: screen area …

• Viewport transformation with glViewport(…)

• Here: included in the reshape callback

Viewing in OpenGL

17

… Viewport Transformationvoid display(void) {

glClear (GL_COLOR_BUFFER_BIT);glLoadIdentity ();gluLookAt (0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);glScalef (1.0, 2.0, 1.0);glutWireCube (1.0);glFlush ();

}

void reshape (int w, int h) {glViewport (0, 0, (GLsizei) w, (GLsizei) h);glMatrixMode (GL_PROJECTION);glLoadIdentity ();glFrustum (-1.0, 1.0, -1.0, 1.0, 1.5, 20.0);glMatrixMode (GL_MODELVIEW);

}

int main(int argc, char** argv) {glutInit(&argc, argv);glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);glutCreateWindow (argv[0]);glutDisplayFunc(display);glutReshapeFunc(reshape);glutMainLoop();

}

Viewing in OpenGL

18

Viewing & Modeling Transformations

• Transformation matrices have to be defined before rendering geometry

• Choose correct matrix stack !e.g. glMatrixMode(GL_MODELVIEW)

• Order of transformations• Thinking about transformations

– world coordinates: fixed coordinate system– object coordinates: local coordinate system

Viewing in OpenGL

19

Viewing & Modeling Transformations

• Moving the camera = moving all objects in opposite direction

• Viewing transformation commands prior toany modeling transformation

• Why? Order of transformations …• Many different roads lead to rome…

Viewing in OpenGL

20

Viewing & Modeling Transformations

Leads to the same modelview matrix…

Viewing in OpenGL

21

Further Readings …

• The red book, chapter 3:

OpenGL Programming Guide3rd EditionThe Official Guide to Learning OpenGL

• On–line version: see link on course web pagehttp://graphics.ethz.ch/

Viewing in OpenGL

22

Trackball Assignment

• Interactive Viewer for OBJ triangle objects

• Intuitive interface to rotate object:

– Trackball interface– Mouse motion is

translated into rotation• Requires knowledge of

transformations and quaternions

Viewing in OpenGL

23

Trackball Assignment• Mouse motion from x to y in screen

coordinates• Projection onto an underlying sphere

leads to x’ and y’• They define angle and axis of rotation• Framework application allows

dragging and spinning

y

x