0% found this document useful (0 votes)
125 views114 pages

Understanding OpenGL: A Graphics API Guide

This document provides an overview of OpenGL: 1. OpenGL is a graphics rendering API that allows programs written in languages like C/C++ to interface with graphics hardware for rendering 2D and 3D graphics. 2. It has a long history beginning as SGI's IrisGL and is now an open standard maintained by the OpenGL ARB. Major versions include 1.0, 1.1, and 1.5. 3. OpenGL uses a state-based rendering model and contains over 200 functions for tasks like defining primitives, setting attributes, viewing transformations, and more. It is platform independent but relies on libraries like GLUT/GLX for window management.

Uploaded by

rahul.yerrawar
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPTX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
125 views114 pages

Understanding OpenGL: A Graphics API Guide

This document provides an overview of OpenGL: 1. OpenGL is a graphics rendering API that allows programs written in languages like C/C++ to interface with graphics hardware for rendering 2D and 3D graphics. 2. It has a long history beginning as SGI's IrisGL and is now an open standard maintained by the OpenGL ARB. Major versions include 1.0, 1.1, and 1.5. 3. OpenGL uses a state-based rendering model and contains over 200 functions for tasks like defining primitives, setting attributes, viewing transformations, and more. It is platform independent but relies on libraries like GLUT/GLX for window management.

Uploaded by

rahul.yerrawar
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPTX, PDF, TXT or read online on Scribd

Computer Graphics

OpenGL
What is OpenGL?
• It is NOT a language.
• It is a Graphics Rendering API (Application Programmer’s
Interface) that is a set of function with well defined interface.
• Whenever we say that a program is OpenGL-based or OpenGL
applications, we mean that it is written in some programming
language (such as C/C++ or Java) that makes calls to one or
more of OpenGL libraries.
• OpenGL is Not Object-Oriented. OpenGL API does not make
use of features such as overloading that are available in
object-oriented languages. -> I will show examples with C
language bindings.

2
A History of OpenGL
• Was SGI’s Iris GL – basis for “Open”GL
• “Open” standard allowing for wide range hardware
platforms
• OpenGL v1.0 (1992)
• OpenGL v1.1 (1995)
• OpenGL v1.5 (latest)

• Governed by OpenGL Architecture Review Board (ARB)


which has members from such as Silicon Graphics, IBM, and
NVIDIA.

• “Mesa” – an Open source (http://www.mesa3d.org)


Useful Websites and Books
• Official Site
http://www.opengl.org
• Non official sites
– http://nehe.gamedev.net/
• BOOKS
– OpenGL : A Primer
– OpenGL Red Book &
– OpenGL Blue Book

4
Useful Links
• Online Reference manual sites

• GL and GLU
http://www.mevis.de/~uwe/opengl/opengl.html
• GLUT
http://pyopengl.sourceforge.net/documentation/manual/reference-
GLUT.html

5
Three View of OpenGL
• Programmer’s view
– Specifying a set of objects to render
– Describing properties of these objects
– Defining how these objects should be viewed
• State machine
– Keeps states that affects appearances of input ie. States determines
how the inputs are processed.
– Change state (such as color) by using state changing functions
• OpenGL uses Rendering Pipeline Model
– Models -> Transformer -> Clipper -> Projector -> Rasterizer -> Image

6
OpenGL API Functions
• OpenGL contains over 200 functions
– Primitive functions : define the elements (eg. A point, line,
polygon, etc)
– Attribute functions : control the appearance of primitives
(eg. colors, line types, light source, textures.)
– Viewing functions : determine the properties of camera.
Transformation
– Windowing functions: not part of core OpenGL
– Other functions

7
Window Management
• OpenGL is meant to be platform independent.
i.e. OpenGL is window and operating system
independent.
• OpenGL does not include any functions for
window management, user interaction, and
file I/O.
• Host environment is responsible for window
management.

8
Window Management API
• We need additional libraries to handle
window management

• GLX/AGL/WGL - glue between OpenGL and


windowing systems
• GLUT - OpenGL Window Interface/Utility
toolkit
• AUX - OpenGL Utility Toolkit

9
OpenGL API Hierarchy
`
• GL - “core” library of OpenGL that is platform
independent
• GLU - an auxiliary library that handles a variety
of graphics accessory functions
• GLUT/AUX - utility toolkits that handle window
managements

11
Libraries and Headers
Library Name Library File Header File Note
OpenGL opengl32.lib (PC) gl.h “core”
-lgl (UNIX) library
Auxiliary library glu32.lib (PC) glu.h handles a
-lglu variety of
accessory
functions
Utility toolkits glut32.lib (PC) glut.h window
-lglut (UNIX) glaux.h managemen
glaux.lib (PC) ts

All are presented in the-lglaux (UNIX)


C language
Learning OpenGL with GLUT
• GLUT is a Window Manager (handles window
creation, user interaction, callbacks, etc)
• http://www.opengl.org/resources/libraries/glut/spec
3/spec3.html
• Platform Independent
• Makes it easy to learn and write OpenGL programs
without being distracted by your environment
• All of our discussions will be presented in C/C++
language

13
Include Header files
Include the necessary header files in your code

#include <GL/gl.h> // “core”, the only thing is required


#include <GL/glu.h> // handles accessory functions
#include <GL/glut.h> // handles window managements

void main( int argc, char **argv )


{
…..
}

Only the “core” library (opengl32.lib, gl.h) are required


Link Libraries
Link the necessary Libraries to your code

• Link GL library
– Link opengl32.lib (PC), or -lgl (UNIX)
• Link GLU library
– Link glu32.lib (PC), or -lglu (UNIX)
• Link GLUT library
– Link glut32.lib (PC), or -lglut (UNIX)
Programming Convention : OpenGL Data
Types

To make it easier to convert OpenGL code


from one platform to another, OpenGL
defines its own data types that map to
normal C data types

GLshort A[10]; short A[10];


GLdouble B; double B;
Programming Convention : OpenGL Data
Types

OpenGL Data Type Representation As C Type


GLbyte 8-bit integer signed char
GLshort 16-bit integer short
GLint, GLsizei 32-bit integer long
GLfloat 32-bit float float
GLdouble 64-bit float double
GLubyte, GLboolean 8-bit unsigned integer unsigned char
GLushort 16-bit unsigned short unsigned short
GLunit, GLenum, GLbitfield 32-bit unsigned unsigned long
integer
Programming Convention : OpenGL
Function Naming

OpenGL functions all follow a naming convention


that tells you which library the function is from,
and how many and what type of arguments that
the function takes

<Library prefix><Root command><Argument count><Argument type>


Programming Convention : OpenGL Function
Naming

glColor3f(…)
gl library Root command, # of arguments, type of arguments

gl means OpenGL f: the argument is float type


glu means GLU i: the argument is integer type
glut means GLUT v: the argument requires a vector
Programming Convention : OpenGL Function
Naming
• Multiple forms of OpenGL functions to
support the variety of data types
– glVertex3i(ix, iy, iz)
– glVertex3f(x, y, z)
– glVertex2i(ix, iy)
– glVertex2f(x, y)
– ..
– We shall use the notation glVertex*() to refer to all
the forms of the vertex function
20
Basic OpenGL Coding Framework
1. Configure GL (and GLUT) - Open window, Display
mode, ……
2. Initialize OpenGL state - background color, light,
View positions, ……
3. Register callback functions - Render, Interaction
(keyboard, mouse), ……
4. Event processing loop - glutMainLoop()

21
A Sample Program
void main (int argc, char **argv)
{
glutInit (&argc, argv);
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize (500, 500);
1
glutCreateWindow (“My First Program");
myinit ();
glutDisplayFunc ( display ); 2
glutReshapeFunc ( resize );
glutKeyboardFunc ( key );
3
glutMainLoop ();
}
4
1: Initializing & Creating Window

Set up window/display you’re going to use


void main (int argc, char **argv)
{
glutInit (&argc, argv); // GLUT initialization
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); // display
model
glutInitWindowSize (500, 500); // window size
glutCreateWindow (“My First Program"); // create window
……
}
GLUT Initializing Functions
• Standard GLUT initialization
void glutInit (int *argc, char ** argv)
• Display model
void glutInitDisplayMode (unsigned int mode)
– Define color model : GLUT_RGB or GLUT_INDEX
– Define buffering: GLUT_SINGLE | GLUT_DOUBLE
• Window size and position
void glutInitWindowSize (int width, int height)
void glutInitWindowPosition(int x, int y)
- top-left corner of the screen in pixel
• Create window
int glutCreateWindow (char *title);
2: Initializing OpenGL State
Set up whatever state you’re going to use
void myinit(void)
{
glClearColor(1.0, 1.0, 1.0, 1.0); // background color
glColor3f(1.0, 0.0, 0.0); // line color
glMatrixMode(GL_PROJECTION); // followings set up viewing
glLoadIdentity();
gluOrtho2D(0.0, 500.0, 0.0, 500.0);
glMatrixMode(GL_MODELVIEW);
}
Event Loops and Callback Functions

• Interactive programs react to the events such


as mouse or keyboard events and window
events.
• Callback Function - Routine to call when
something happens (eg. window resize, redraw, user
input, etc)

• GLUT uses a callback mechanism to do its


event processing
GLUT Callback Functions
• Contents of window need to be refreshed
glutDisplayFunc()
• Window is resized or moved
glutReshapeFunc()
• Key action
glutKeyboardFunc()
• Mouse button action
glutMouseFunc()
• Mouse moves while a button is pressed
glutMotionFunc()
• Mouse moves regardless of mouse button state
glutPassiveMouseFunc()
• Called when nothing else is going on
glutIdleFunc()
3: Register Callback Functions
Set up any callback function you’re going to use
void main (int argc, char **argv)
{
……
glutDisplayFunc ( display ); // display callback
glutReshapeFunc ( resize ); // window resize callback
glutKeyboardFunc ( key ); // keyboard callback

……
}
Rendering Callback
It’s here that does all of your OpenGL rendering
void display( void )
{
int k;
glClear(GL_COLOR_BUFFER_BIT);
for( k=0; k<5000; k++)
……
}
Window Resize Callback
It’s called when the window is resized or moved

void resize(int w, int h)


{
……
display();
}
Keyboard Input Callback
It’s called when a key is struck on the keyboard

void key( char mkey, int x, int y )


{
switch( mkey )
{
case ‘q’ :
exit( EXIT_SUCCESS );
break;
……
}
}
4. Event Process Loop

This is where your application receives events,


and schedules when callback functions are called
void main (int argc, char **argv)
{
……
glutMainLoop();
}
2D Geometric Primitives
• Primitives – fundamental entities such as
point and polygons
• Basic types of geometric primitives
– Points
– Line segments
– Polygons

33
2D Geometric Primitives

GL_POINTS GL_LINES GL_LINE_STRIP GL_LINE_LOOP

GL_POLYGON GL_QUADS GL_TRIANGLES GL_TRIANGLE_FAN

All geometric primitives are specified by vertices


34
Geometry Commands
• glBegin(GLenum type)
marks the beginning of a vertex-data list that
describes a geometric primitives

• glEnd (void)
marks the end of a vertex-data list

• glVertex*(…)
specifies vertex for describing a geometric object
35
Specifying Geometric Primitives

glBegin( type );
glVertex*(…);
……
glVertex*(…);
glEnd();
type determines how vertices are combined

36
Types

GL_POINTS GL_LINES GL_LINE_STRIP GL_LINE_LOOP

GL_POLYGON GL_QUADS GL_TRIANGLES GL_TRIANGLE_FAN

37
Types
GL_POINTS
GL_LINES : each successive pair for a ling segment
GL_LINE_STRIP: vertices defining a sequence of line
segments
GL_LINE_LOOP: GL_LINE_STRIP + the last vertex connects to
the first
GL_POLYGON : sequence of vertices of polygon, filled
GL_QUADS: each successive group of four vertices for a
quadrilaterals
GL_TRIANGLES: each successive group of three vertices for a
triangle
GL_TRIANGLE_FAN: first three vertices for the first triangle
and each subsequent vertex with the first vertex and the
previous vertex for the next triangle

38
Attribute : Line
void glLineWidth(GLfloat width)
– Set the width in pixel. Default is 1.0

void glLineStripple(GLint factor, GLushort pattern)

39
Rectangles
• glRect*() – defines 2D filled rectangle aligned
with the axes.

void glRect{sifd} (TYPE x1, TYPE y1, TYPE x2, TYPE y2);

40
Example
void drawSquare ()
{
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_POLYGON);
glVertex2f ( 0.0, 0.0 );
glVertex2f ( 1.0, 0.0 );
glVertex2f ( 1.1, 1.1 );
glVertex2f ( 0.0, 1.0 );
glEnd();
glFlush(); // force the renderer to output the results
}

41
OpenGL Color

• There are two color models in OpenGL


– RGB Color (True Color)
– Indexed Color (Color map)

42
RGB Color Model

• R, G, B components are stored for each pixel

43
RGB Color

Red

Green

Blue
44
How Many Colors?
color_depth
2
Color number =
For example:
4-bit color
24 = 16 colors
8-bit color
8 = 256 colors
2
24-bit color
2 24= 16.77 million colors
45
How Much Memory?

Buffer size = width * height *color depth

For example:
If width = 640, height = 480, color depth = 24 bits
Buffer size = (640 * 480 * 2) bytes
If width = 640, height = 480, color depth = 32 bits
Buffer size = (640 * 480 * 4) bytes

46
Alpha Component

Alpha value
A value indicating the pixels opacity
0 usually represents totally transparent and the 1
represents completely opaque

Alpha buffer
Hold the alpha value for every pixel
Alpha values are commonly represented in 8 bits, in
which case transparent to opaque ranges from 0 to
255
47
RGB Color Commands
• glColor*(…)
specifies vertex colors

• glClearColor(r, g, b, a)
sets current color for cleaning color buffer

48
Example
void drawLine (GLfloat *color)
{
glColor3fv ( color );
glBegin(GL_LINE);
glVertex2f ( 0.0, 0.0 );
glVertex2f ( 1.0, 0.0 );
glEnd();
}

49
Example

void drawLine (GLfloat *color)


{
glBegin(GL_LINE);
glColor3f(1.0,0.0,0.0 );
glVertex2f ( 0.0, 0.0 );
glColor3f(0.0,0.0,1.0);
glVertex2f ( 1.0, 0.0 );
glEnd();
}

50
Color Interpolation
glShadeModel(GL_SMOOTH);
Or
glShadeModel(GL_FLAT); - the last vertex
color

• Linear interpolation for a line


• Bilinear interpolation for a polygons

51
2D Viewing
• Where do we draw the 2D object?
– Assume that we draw objects on an infinite sheet
of paper
– Then we need to specify clipping region and
project these 2D objects to the screen

void gluOrtho2D(GLdouble left, GLdouble right,


GLdouble bottom, GLdouble top);

52
Coordinate Systems and
Transformation
• Identify which matrix we wish to alter
• Set the matrix to an identity matrix
• Alter the matrix to form the desired matrix

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(-1.0, 1.0, -1.0, 1.0);

53
Coordinate Systems and
Transformation
glMatrixMode(GLenum mode);
– Identify which matrix we wish to alter – The mode
is usually GL_MODELVIEW, GL_PROJECTION
glLoadIdentity();
– Set the current matrix to an identity matrix

54
Enabling GL Features
• Features – lighting, hidden-surface removal, texture
mapping, etc…
• Each feature will slow down the rendering process.
• We can enable/disable each feature individually

void glEnable(GLenum feature)


void glDisable(GLenum feature)
Eg. glEnable(GL_LINE_STRIPPLE);

55
Enabling GL Features
GL_ALPHA_TEST
If enabled, do alpha testing.
GL_AUTO_NORMAL
If enabled, generate normal vectors when either GL_MAP2_VERTEX_3 or GL_MAP2_VERTEX_4 is used to generate
vertices. See glMap2.
GL_BLEND
If enabled, blend the incoming RGBA color values with the values in the color buffers..
GL_CLIP_PLANE i
If enabled, clip geometry against user-defined clipping plane i..
GL_COLOR_LOGIC_OP
If enabled, apply the currently selected logical operation to the incoming RGBA color and color buffer values.
GL_COLOR_MATERIAL
If enabled, have one or more material parameters track the current color.
GL_COLOR_TABLE
If enabled, preform a color table lookup on the incoming RGBA color values.
GL_CONVOLUTION_1D
If enabled, perform a 1D convolution operation on incoming RGBA color values.
GL_CONVOLUTION_2D
If enabled, perform a 2D convolution operation on incoming RGBA color values.
……

56
Queries
• OpenGL state can be queried by
– void glGet*(GLenum name, Type *value);
– Eg.
GLfloat color_array[4];
glGetFloatv(GL_CURRENT_COLOR,color_array);

• Check if a feature has been enabled by


– GLboolean glIsEnabled(GLenum feature); - returns
GL_TRUE or GL_FALSE

57
Saving the State
• State changing functions – overwrites the
state variables
• We can store previous state values for later
use
– Matrix stacks
void glPushMatrix()
void glPopMatrix()
– Attribute stacks
void glPishAttrib(GLbitfield mask)
void glPopAttrib()
58
Saving the State
glMatrix(GL_PROJECTION)
// set projection matrix
// draw scene
glPushMatrix();
// change the project matrix
//draw scene
glPopMatrix();

59
Callback : Reshape
void glutReshapeFunc(void (*f) (int width, int height));

– invoked whenever the use changes the size of the


window using the mouse. width and height is the
new window size.
– Usually you want to take care of a new aspect
ratio (width-to-height ratio).

60
Callback : Idle
void glutIdleFunc(void (*)f (void))

– f will be executed whenever there are no other


events to be handled.
– necessary for animation

61
Callback : Idle
glutIdleFunc(myidle);

void myidle()
{
glutPostRedisplay();
}
: Request the display callback to be
executed after the current callback returns

62
Double Buffering
• Use two buffers :front buffer and back buffer
to guarantee to display a fully redrawn butter
image

glutSwapBuffers();

– Replace glFlush() by glutSwapBuffer()


in the display callback

63
Keyboard Interaction
glutKeyboardFunc(void *f (unsigned char key, int x,
int y))
• f is called when any key on the keyboard is pressed. (x, y) is the position of
the mouse in the window given in pixel measured from the upper-left
corner of the window.

glutKeyboardFunc(mykey);

void mykey(unsigned char key, int x, int y)


{
if(key==‘q’)
exit(0);
}

64
Keyboard Interaction
• Special Keys (defined in glut.h)
glutSpecialFunc(void *f (int key, int x, int y))

glutSpecialFunc(myskey);

void mykey(unsigned char key, int x, int y)


{
if(key== GLIT_KEY_F1)
..
if(key== GLIT_KEY_UP)

}

65
Keyboard Interaction
• int glutGetModifiers() – returns the logical
AND of GLUT_ACTIVE_SHIFT,
GLUT_ACTIVE_CTRL or GLUT_ACTIVE_ALT if
that key is pressed at the time a mouse of
keyboard event is generated.

if(glutGetModifiers() & GLUT_ACTIVE_CTRL) && (key ==


‘c’)) exit(0);

66
Mouse Interaction
void glutMouseFunc(void (*f) (int button,
int state, int x, int y);
– register mouse callback function
– Button : GLUT_LEFT_BUTTON,
GLUT_RIGHT_BUTTON, GLUT_MIDDLE_BUTTON
– State: GLUT_UP, GLUT_DOWN

67
Mouse Interaction
void glutMotionFunc(void (*f) (int x, int
y)); -- mouse moved with button down
void glutPassiveMotionFunc(void (*f) (int x, int y);
-- mouse moved without button down
– (x,y) is the current position of the mouse
• void glutEntryFunc(void (*f) (int
state)) ;
– specifies the mouse entry callback
– state : GLUT_ENTERED, GLUT_LEFT

68
Null Callback
• When we no longer need a callback.
glutIdleFunc(Null);

69
Camera Analogy

The graphics transformation process is


analogous to taking a photograph with a
camera
- Place objects
- Position camera
- Adjust camera
- Produce photograph

70
Transformations and Camera Analogy
• Modeling transformation
– Positioning and moving the model.
• Viewing transformation
– Positioning and aiming camera in the world.
• Projection transformation
– Adjusting the lens of the camera.
• Viewport transformation
– Enlarging or reducing the physical photograph.

71
OpenGL Transformation Pipeline

72
Transformations in OpenGL
• Transformations are specified by matrix
operations. Desired transformation can be
obtained by a sequence of simple
transformations that can be concatenated
together.
• Transformation matrix is usually
represented by 4x4 matrix (homogeneous
coordinates).
• Provides matrix stacks for each type of
supported matrix to store matrices.
73
Programming Transformations
• In OpenGL, the transformation matrices are part of
the state, they must be defined prior to any vertices
to which they are to apply.
• In modeling, we often have objects specified in their
own coordinate systems and must use
transformations to bring the objects into the scene.
• OpenGL provides matrix stacks for each type of
supported matrix (model-view, projection, texture) to
store matrices.

74
Steps in Programming

• Define matrices:
– Viewing/modeling, projection, viewport …
• Composite transformations

75
Transformation Matrix Operation
• Current Transformation Matrix (CTM)
– The matrix that is applied to any vertex that is
defined subsequent to its setting.
• If change the CTM, we change the state of the
system.
• CTM is a 4 x 4 matrix that can be altered by a
set of functions.

76
Current Transformation Matrix

The CTM can be set/reset/modify (by post-


multiplication) by a matrix
Ex:
C <= M // set to matrix M
C <= CT // post-multiply by T
C <= CS // post-multiply by S
C <= CR // post-multiply by R

77
Current Transformation Matrix
• Each transformation actually creates a new
matrix that multiplies the CTM; the result,
which becomes the new CTM.
• CTM contains the cumulative product of
multiplying transformation matrices.

Ex: If C <= M; C <= CT; C <= CR; C <= CS


Then C=MTRS 78
Ways to Specify Transformations

• In OpenGL, we usually have two styles of


specifying transformations:
– Specify matrices ( glLoadMatrix,
glMultMatrix )

– Specify operations ( glRotate, glTranslate )

79
Specifying Matrix

• Identify current matrix


• Modify current matrix
• Load current matrix
• Multiple current matrix

80
Specifying Matrix (1)

• Identify current matrix


glMatrixMode (mode)
Specified what transformation matrix is modified.
mode:
GL_MODELVIEW
GL_PROJECTION

81
Specifying Matrix(2)

• Modify current matrix

glLoadMatrix{fd} ( Type *m )
Set the 16 values of current matrix to those
specified by m.

Note: m is the 1D array of 16 elements arranged by the


columns of the desired matrix

82
Specifying Matrix(3)

• Modify current matrix

glLoadIdentity ( void )
Set the currently modifiable matrix to the 4x4
identity matrix.

83
Specifying Matrix(4)

• Modify current matrix

glMultMatrix{fd} ( Type *m )
Multiple the matrix specified by the 16 values
pointed by m by the current matrix, and stores the
result as current matrix.

Note: m is the 1D array of 16 elements arranged by the


columns of the desired matrix
84
Specifying Operations

• Three OpenGL operation routines for


modeling transformations:
– Translation
– Scale
– Rotation

85
Recall
• Three elementary 3D transformations

é1 0 0 d xù
ê ú
0 1 0 d yú
T(dx, dy , d z) ê
= ê
Translation: 0 0 1 d zú
ê ú
ë0 0 0 1û

ésx 0 0 0ù
ê ú
0 sy 0 0ú
S (sx , s y , s) = ê
Scale: z
ê0 0 sz 0ú
ê ú
ë0 0 0 1û

86
Recall
é1 0 0 0ù
ê ú
0 cosq - sin q 0ú
Rotation Rx (q ) Rx (q ) = ê
ê0 sin q cosq 0ú
ê ú
ë0 0 0 1û
é cosq 0 sin q 0ù
ê ú
0 1 0 0ú
Rotation Ry (q ) Ry(q ) = ê
ê- sin q 0 cosq 0ú
ê ú
ë 0 0 0 1û

écosq - sinq 0 0ù
ê ú
Rotation Rz (q ) êsin q cosq 0 0ú
Rz (q ) =
ê 0 0 1 0ú
ê ú
ë 0 0 0 1û

87
Specifying Operations (1)

• Translation

glTranslate {fd} (TYPE x, TYPE y, TYPE z)


Multiplies the current matrix by a matrix that
translates an object by the given x, y, z.

88
Specifying Operations (2)

• Scale

glScale {fd} (TYPE x, TYPE y, TYPE z)


Multiplies the current matrix by a matrix that
scales an object by the given x, y, z.

89
Specifying Operations (3)

• Rotate
glRotate {fd} (TPE angle, TYPE x, TYPE y, TYPE z)
Multiplies the current matrix by a matrix that rotates
an object in a counterclockwise direction about the ray
from origin through the point by the given x, y, z. The
angle parameter specifies the angle of rotation in
degree.

90
Order of Transformations

• The transformation matrices appear in


reverse order to that in which the
transformations are applied.
• In OpenGL, the transformation specified
most recently is the one applied first.

91
Order of Transformations
• In each step:
C <= I
C <= CT(4.0, 5.0, 6.0)
C <= CR(45, 1.0, 2.0, 3.0)
C < = CT(-4.0, -5.0, -6.0)
• Finally
C = T(4.0, 5.0, 6.0) CR(45, 1.0, 2.0, 3.0) CT(-4.0, -5.0, -6.0)

Write it

Read it

92
Matrix Multiplication is Not Commutative

First rotate, then translate =>

First translate, then rotate =>

93
Viewing-Modeling Transformation

• If given an object, and I want to render it from


a viewpoint, what information do I have to
have?
– Viewing position
– Which way I am looking at
– Which way is “up”
…..

94
Viewing Position
y

y R, T
x

z
• Translation
x • Rotation
z Camera

95
Where I am and Looking at

y
y Loot at
View-up vector (atx, aty, atz)
(upx, upy, upz)

x x
Model
z z
Eyepoint
(eyex, eyey, eyez)

96
Define Coordinate System

+Y
In the default
position, the
camera is at the
origin, looking
down the +X
negative z-axis
+Z

97
If we use OpenGL

• Look-At Function

gluLookAt (eyex, eyey, eyez, atx, aty, atz, upx, upy, upz )
Define a viewing matrix and multiplies it to the
right of the current matrix.

98
Matrix Stacks

• OpenGL uses matrix stacks mechanism to


manage transformation hierarchy.
• OpenGL provides matrix stacks for each
type of supported matrix to store matrices.
– Model-view matrix stack
– Projection matrix stack
– Texture matrix stack

99
Matrix Stacks

• Current matrix is
always the topmost
matrix of the stack Pushing
• We manipulate the
Popping
current matrix is that Top
we actually
manipulate the
topmost matrix.
• We can control the Bottom
current matrix by
using push and pop
operations.

100
Manipulating Matrix Stacks (1)

• Remember where you are

glPushMatrix ( void )
Pushes all matrices in the current stack down one
level. The topmost matrix is copied, so its contents
are duplicated in both the top and second-from-the
top matrix.

Note: current stack is determined by glMatrixModel()


101
Manipulating Matrix Stacks (2)

• Go back to where you were

glPopMatrix ( void )
Pops the top matrix off the stack, destroying the
contents of the popped matrix. What was the
second-from-the top matrix becomes the top
matrix.

Note: current stack is determined by glMatrixModel()


102
Manipulating Matrix Stacks (3)
• The depth of matrix stacks are implementation-dependent.
• The Modelview matrix stack is guaranteed to be at least 32
matrices deep.
• The Projection matrix stack is guaranteed to be at least 2
matrices deep.

glGetIntegerv ( Glenum pname, Glint *parms )


Pname:
GL_MAX_MODELVIEW_STACT_DEPTH
GL_MAX_PROJECTION_STACT_DEPTH

103
Projection Transformation
• Projection & Viewing Volume
• Projection Transformation
• Viewpoint Transformation

104
OpenGL and Windows Screen

Windows Screen Mapping OpenGL Screen Mapping


X Y
(0, 0) Positive
Positive
(50, 50)

(50, 50)
Positive
(0, 0) X
Y Positive

Remember: the Y coordinates of OpenGL screen is the opposite


of Windows screen. But same as in the XWindows system.
105
Perspective Projection Volume

y
aspect ratio = w/h

w
h
z

fovy
x Far-plane: zNear
Near-plane: zNear

Viewing volume
106
Perspective Projection Commands

glFrustum( left, right, bottom, top, zNear, zFar )


Creates a matrix for a perspective viewing
frustum and multiplies the current matrix by it.

107
Perspective Projection Commands

gluPerspective( fovy, aspect, zNear, zFar )


Creates a matrix for an perspective viewing
frustum and multiplies the current matrix by it.

Note: fovy is the field of view (fov) between the top and bottom
planes of the clipping volume. aspect is the aspect ratio

108
Remember to Initialize

glutInitDisplayMode(GLUT_DOUBLE|GLUT_RBG|GLUT_DEPTH);

You can also clear the depth buffer (as we did for color buffer)

glClear(GL_DEPTH_BUFFER_BIT)
Clear z (depth) buffer

109
Viewing a 3D world

View up

ViewRight
Aspect Ratio =
ViewUp

View right

110
Viewport
• Viewport
– The region within the window that will be used for
drawing the clipping area
– By default, it is set to the entire rectangle of the
window that is opened
– Measured in the window coordinates, which
reflect the position of pixels on the screen related
to the lower-left corner of the window

111
Viewport Transformation

h
h
w

A viewpoint is A viewpoint is
defined as half the defined as the same
size of the window size as the window

112
Aspect Ratio
• The Aspect Ratio of a rectangle is the ratio of
the rectangle’s width to its height:
e.g. Aspect Ratio = width/height

• Viewport aspect ratio should be same as


projection transformation, or resulting image
may be distorted.

113
Viewport Commands

• glViewport( x, y, width, height )


Defines a pixel rectangle in the window into
which the final image is mapped
(x, y) specifies the lower-left corner of the
viewport
(width, height) specifies the size of the viewport
rectangle

114

You might also like