370 likes | 507 Views
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. Notice. Use Noah board for your questions ( http://noah.kaist.ac.kr/course/CS380 ).
E N D
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
Notice Use Noah board for your questions (http://noah.kaist.ac.kr/course/CS380)
Outline • Transformations • Modeling Transformations • Draw 3D objects • Translate • Rotate • Scale
Transformations • All transformations in OpenGL are carried out by matrices • There are different matrices for different purposes • The modelview matrix • GL_MODELVIEW • The projection matrix • GL_PROJECTION • The texture matrix • GL_TEXTURE • All matrices are post-multiplied • I.e. the current matrix M becomes MN when N is performed • Post-multiplication is closely linked to matrix stacks
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/72044/why-do-we-use-4x4-matrices-to-transform-things-in-3d
Transformations • Specify which matrix is the current matrix • Mode • GL_MODELVIEW • Applies subsequent matrix operations to the model view matrix stack • GL_PROJECTION • Applies subsequent matrix operations to the projection matrix stack • etc.
Skeleton Code #include <GL/glut.h> #include <GL/glu.h> void display(); int main( int argc, char* argv[] ) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA | GLUT_DEPTH); glutInitWindowSize(512, 512); glutCreateWindow("CS380 LAB"); glutDisplayFunc(display); glutMainLoop(); return 0; } void display(){ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glColor3f(1.0,0.0,0.0); glutWireTeapot(0.5); glFlush(); }
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); }
Set a view glMatrixMode(GL_PROJECTION); glLoadIdentity(); double aspect = width/double(height); gluPerspective(45, aspect, 1, 1024); • fovy • View angle, in degrees, in the y direction • aspect • Ratio of x (width) to y (height) • zNear • Distance from the viewer to the near clipping plane (positive) • zFar • Distance from the viewer to the far clipping plane (positive)
Set a view • Detailed explanations about Viewing Transformation will be provided in the next week.
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(); • …
Draw 3D objects • GLUT provide simple 3D objects • e.g., Teapot object • void glutSolidTeapot(GLdouble size); • void glutWireTeapot(GLdouble size);
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(); }
Translations • Multiply the current matrix by a translation matrix • x, y, z • Specify the x, y, and z coordinates of a translation vector
Translations Translation matrix (4x4) • Multiply the current matrix by a translation matrix
Review of Translations glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslatef(0,0,-1.0);
Review of Translations Model view matrix glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslatef(0,0,-1.0);
Review of Translations Model view matrix glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslatef(0,0,-1.0);
Review of Translations Model view matrix glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslatef(0,0,-1.0);
Review of Translations Again?? Model view matrix glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslatef(0,0,-1.0); glTranslatef(0,0,-1.0);
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(); }
Tutorials ‘l’ ‘f’ • Move your teapot based on key inputs • ‘l’: left • ‘r’: right • ‘u’: up • ‘d’: down • ‘f’: move out • ‘n’: move in
Tutorials float xpos = 0.0; float ypos = 0.0; float zpos = -2.0; 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(); } void main(){ … glutKeyboardFunc(keyboard); … } void display(){ … glTranslatef(xpos,ypos,zpos); … }
Rotations • angle • angle of rotation, in degrees • x, y, z • x, y, and z coordinates of a vector, respectively • Normalized vector (If not, GL will normalize it)
Rotations The questions will be resolved in the CS380 lecture “Modeling Transformations“.
Rotations 30 degrees rotation based on a normalized vector (0, 0, 1) void display(){ … glTranslatef(xpos,ypos,zpos); glRotatef(30,0,0,1); … }
Tutorials 30 degrees 90 degrees 60 degrees • Rotate your teapot on X axis • e.g., 30, 60, and 90 degrees
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);
Scaling • x, y, z • scale factors along the x, y, and z axes, respectively
Scaling void display(){ … glLoadIdentity(); glTranslatef(0,0,-3); glScalef(2,1,1); … }
Review of Scaling void display(){ … glLoadIdentity(); glTranslatef(0,0,-3); glScalef(2,1,1); … } Model view matrix
Review of Scaling void display(){ … glLoadIdentity(); glTranslatef(0,0,-3); glScalef(2,1,1); … } Model view matrix
Review of Scaling void display(){ … glLoadIdentity(); glTranslatef(0,0,-3); glScalef(2,1,1); … } Model view matrix
Next time • Viewing Transformation in OpenGL