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