Transcript OpenGL I

CS380 LAB II
OpenGL
Donghyuk Kim
Reference1. [OpenGL course slides by Rasmus Stenholt]
Reference2. [http://nehe.gamedev.net/]
Goal
Introduce OpenGL programming
 Help you do CS380 homework by yourself

2
Notice

Use Noah board for your questions
(http://noah.kaist.ac.kr/course/CS380)
3
Outline


Transformations
Modeling Transformations
 Draw
3D objects
 Translate
 Rotate
 Scale
4
Transformations


All transformations in OpenGL are carried out by
matrices
There are different matrices for different purposes

The modelview matrix


The projection matrix


GL_TEXTURE
All matrices are post-multiplied


GL_PROJECTION
The texture matrix


GL_MODELVIEW
I.e. the current matrix M becomes MN when N is performed
Post-multiplication is closely linked to matrix stacks
5
Transformations

Matrices
 All
matrices in OpenGL are 4x4
 Why use 4-D matrices for 3-D graphics?
A 4x4 matrix can rotate and translate the same
vector in one operation
 http://gamedev.stackexchange.com/questions/720
44/why-do-we-use-4x4-matrices-to-transformthings-in-3d

6
Transformations

Specify which matrix is the current matrix
void glMatrixMode(

GLenum
mode);
Mode

GL_MODELVIEW


GL_PROJECTION


Applies subsequent matrix operations to the model view matrix stack
Applies subsequent matrix operations to the projection matrix stack
etc.
7
Skeleton Code
#include <GL/glut.h>
 #include <GL/glu.h>
 void display();

int main( int argc, char* argv[] )
{
 glutInit(&argc, argv);
 glutInitDisplayMode(GLUT_SINGLE |

8
Set a view
int main( int argc, char* argv[] )
{
…
glutReshapeFunc( reshape );
…
}
void reshape(int width, int height)
{
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
double aspect = width/double(height);
gluPerspective(45, aspect, 1, 1024);
}
9
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
double aspect = width/double(height);
gluPerspective(45, aspect, 1, 1024);
Set a view
void gluPerspective(

aspect,
GLdouble
zNear,
GLdouble
zFar);
View angle, in degrees, in the y direction
Ratio of x (width) to y (height)
zNear


GLdouble
aspect


fovy,
fovy


GLdouble
Distance from the viewer to the near clipping plane (positive)
zFar

Distance from the viewer to the far clipping plane (positive)
10
Set a view

Detailed explanations about Viewing
Transformation will be provided in the next
week.
11
Draw 3D objects


Use a set of OpenGL primitives
e.g.,









glBegin(GL_TRIANGLES);
glVertex3f( 0.0f, 1.0f, 0.0f);
glVertex3f(-1.0f,-1.0f, 0.0f);
glVertex3f( 1.0f,-1.0f, 0.0f);
glEnd();
glBegin(GL_TRIANGLES);
…
glEnd();
…
12
Draw 3D objects


GLUT provide simple 3D objects
e.g., Teapot object
 void
glutSolidTeapot(GLdouble size);
 void glutWireTeapot(GLdouble size);
13
Draw 3D objects









void display(){
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0,0,-1.0);
glColor3f(r,g,b);
glutWireTeapot(0.5);
glFlush();
}
14
Translations

Multiply the current matrix by a translation
matrix
void glTranslatef(

GLfloat
GLfloat
GLfloat
x,
y,
z);
x, y, z
 Specify
the x, y, and z coordinates of a
translation vector
15
Translations

Multiply the current matrix by a translation
matrix
void glTranslatef(
GLfloat
GLfloat
GLfloat
Translation matrix (4x4)
x,
y,
z);
1
0
0
X
0
1
0
Y
0
0
1
Z
0
0
0
1
16
Review of Translations



glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0,0,-1.0);
17
Review of Translations



glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0,0,-1.0);
Model view matrix
18
Review of Translations



glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0,0,-1.0);
1
0
0
0
0
1
0
0
0
0
1
0
0
0
0
1
Model view matrix
19
Review of Translations



glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0,0,-1.0);
1
0
0
0
1
0
0
0
1
0
0
0
0
1
0
0
0
1
0
0
0
1
0
0
0
0
1
0
0
0
1
-1
0
0
1
-1
0
0
0
1
0
0
0
1
0
0
0
1
Model view matrix
20
Review of Translations




glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0,0,-1.0);
Again??
glTranslatef(0,0,-1.0);
1
0
0
0
1
0
0
0
1
0
0
0
0
1
0
0
0
1
0
0
0
1
0
0
0
0
1
-1
0
0
1
-1
0
0
1
-2
0
0
0
1
0
0
0
1
0
0
0
1
Model view matrix
21
Review of Translations










void display(){
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0,0,-1.0);
glTranslatef(0,0,-1.0);
glColor3f(r,g,b);
glutWireTeapot(0.5);
glFlush();
}
22
Tutorials

Move your teapot based on key inputs
 ‘l’:
left
 ‘r’: right
 ‘u’: up
 ‘d’: down
 ‘f’: move out
 ‘n’: move in
‘l’
‘f’
23
Tutorials
float xpos = 0.0;
float ypos = 0.0;
float zpos = -2.0;
void main(){
…
glutKeyboardFunc(keyboard);
…
}
void display(){
…
glTranslatef(xpos,ypos,zpos);
…
}
void keyboard(unsigned char key, int x, int y){
if (key == 'l')
xpos -= 0.1;
else if (key == 'r')
xpos += 0.1;
else if (key == 'u')
ypos += 0.1;
else if (key == 'd')
ypos -= 0.1;
else if (key == 'f')
zpos -= 0.1;
else if (key == 'n')
zpos += 0.1;
glutPostRedisplay();
}
24
Rotations
void glRotatef(

angle,
x,
y,
z);
angle
 angle

GLfloat
GLfloat
GLfloat
GLfloat
of rotation, in degrees
x, y, z
 x,
y, and z coordinates of a vector, respectively
 Normalized vector (If not, GL will normalize it)
25
Rotations
void glRotatef(
GLfloat
GLfloat
GLfloat
GLfloat
?
?
?
0
?
?
?
0
?
?
?
0
0
0
0
1
angle,
x,
y,
z);
The questions will be resolved in the CS380
lecture “Modeling Transformations“.
26
Rotations






void display(){
…
glTranslatef(xpos,ypos,zpos);
glRotatef(30,0,0,1);
…
}
30 degrees rotation based on
a normalized vector (0, 0, 1)
27
Tutorials

Rotate your teapot on X axis

e.g., 30, 60, and 90 degrees
30 degrees
60 degrees
90 degrees
28
Tutorials

30 degrees on X axis
 glRotatef(30,1,0,0);

60 degrees on X axis
 glRotatef(60,1,0,0);

90 degrees on X axis
 glRotatef(90,1,0,0);
29
Scaling
void glScalef(

GLfloat
GLfloat
GLfloat
x,
y,
z);
x, y, z
 scale
factors along the x, y, and z axes,
respectively
30
Scaling
void glScalef(
GLfloat
GLfloat
GLfloat
x,
y,
z);
X
0
0
0
0
Y
0
0
0
0
Z
0
0
0
0
1
31
Scaling
void display(){
…
glLoadIdentity();
glTranslatef(0,0,-3);
glScalef(2,1,1);
…
}
32
Review of Scaling
void display(){
…
glLoadIdentity();
glTranslatef(0,0,-3);
glScalef(2,1,1);
…
}
1
0
0
0
0
1
0
0
0
0
1
0
0
0
0
1
Model view matrix
33
Review of Scaling
void display(){
…
glLoadIdentity();
glTranslatef(0,0,-3);
glScalef(2,1,1);
…
}
1
0
0
0
1
0
0
0
1
0
0
0
0
1
0
0
0
1
0
0
0
1
0
0
0
0
1
0
0
0
1
-3
0
0
1
-3
0
0
0
1
0
0
0
1
0
0
0
1
Model view matrix
34
Review of Scaling
void display(){
…
glLoadIdentity();
glTranslatef(0,0,-3);
glScalef(2,1,1);
…
}
1
0
0
0
2
0
0
0
2
0
0
0
0
1
0
0
0
1
0
0
0
1
0
0
0
0
1
-3
0
0
1
0
0
0
1
-3
0
0
0
1
0
0
0
1
0
0
0
1
Model view matrix
35
Next time

Viewing Transformation in OpenGL
36