Category Archives: OpenGL

OpenGL Transformation



// OpenGL 행렬는 column-order이고, 벡터와 행렬의 곱은 Post-multiply 방식 사용

void display(void)
{
 glClear(GL_COLOR_BUFFER_BIT);
   
 glColor3f(1.0, 0.0, 1.0);
 glutWireCube(1);

 // p’= R T p (red) => translate, and then rotate
 glPushMatrix();
 glRotatef(45.0, 0.0, 0.0, 1.0);
 glTranslatef(1.5, 0.0, 0.0);
 glColor3f(1.0, 0.0, 0.0);
 glutWireCube(1);
 
glPopMatrix();

 // p’= T R p (green) => rotate, and then translate
 glPushMatrix();
 
glTranslatef(1.5, 0.0, 0.0);
 glRotatef(45.0, 0.0, 0.0, 1.0);
 
glColor3f(0.0, 1.0, 0.0);
 glutWireCube(1);
 glPopMatrix();

 // p’= T R S p (blue) => scale, and then rotate, and then translate

 glPushMatrix();
 
glTranslatef(1.5, 0.0, 0.0);
 glRotatef(45.0, 0.0, 0.0, 1.0);
 glScalef(0.5, 0.7, 1.0);
 glColor3f(0.0, 0.0, 1.0);
 glutWireCube(1);
 glPopMatrix();



 matrix4x4 M1, M2, M3, R, T, S;
 R.rotate(45.0, ‘z’);
 T.translate(vector3(1.5, 0.0, 0.0));
 S.scale(vector3(0.5, 0.7, 1.0));


 // p’= R T p (red) => translate, and then rotate
 M1 = R * T;
 glPushMatrix();
 
glMultMatrixf( M1.matrix() );
 glColor3f(1.0, 0.0, 0.0);
 glutWireCube(1);
 glPopMatrix();


 // p’= T R p (green) => rotate, and then translate
 
M2 = T * R;
 glPushMatrix();
 
glMultMatrixf( M2.matrix() );
 glColor3f(0.0, 1.0, 0.0);
 glutWireCube(1);
 glPopMatrix();


 // p’= T R S p (blue) => scale, and then rotate, and then translate
 M3 = T * R * S;
 glPushMatrix();
 
glMultMatrixf( M3.matrix() );
 glColor3f(0.0, 0.0, 1.0);
 glutWireCube(1);
 glPopMatrix();


 glutSwapBuffers();
}




사용자 삽입 이미지

OpenGL Picking




pick1.cpp (selection mode)
     -display 함수에서는 정상적으로 객체를 그린다.
     -mouse 함수에서 마우스의 위치값(x,y)를 가지고
          -glSelectBuffer로 네임스택 버퍼를 지정한다.
          -glRenderMode를 GL_SELECT로 지정하여 선택모드로 전환한다.
          -glInitNames으로 네임스택을 초기화한다.
          -gluPickMatrix를 사용하여 뷰볼륨을 지정한 후
          -glPushName/glPopName 또는 glLoadName을 사용하여 네임스택이름을 지정하여
           객체를 그리면, picking 연산이 가능해진다.
          -glRenderMode를 GL_RENDER로 바꾸면, hit record가 네임스택 버퍼에 저장된다.
          -네임스택 버퍼를 처리(processHits) 하여, 해당 객체 ID를 넘겨주어 Pick한다.
          http://www.lighthouse3d.com/opengl/picking/index.php?openglway3

pick2.cpp (bounding box)
     -display 함수에서는 정상적으로 객체를 그린다.
     -mouse 함수에서 마우스의 위치값(x,y)를 가지고
          -각 객체의 bounding box를 안에 들어왔는지 확인하여,
           해당 객체 ID를 넘겨주어 Pick한다.

pick3.cpp (back buffer)
    -display 함수에서는 정상적으로 객체를 그린다.
    -mouse 함수에서 마우스의 위치값(x,y)를 가지고
          -GL_DITHER 를 비활성화한후, 각 객체마다 color code된 그림을 그린다.
          -glReadPixel 로 마우스 위치의 pixel 색을 받아와서 해당 객체의 color와 비교하여,
           해당 객체 ID를 넘겨주어 Pick한다..

OpenGL Display List

눈사람을 36개 그렸을 때, 렌더링 속도에 큰 차이가 없음
Display List 사용한 경우 Frame Rate이 59.94 정도 나옴
Display List를 사용하지 않은 경우 Frame Rate이 59.98 정도 나옴사용자 삽입 이미지
눈사람을 3600개 그렸을 때, 렌더링 속도에 차이가 보임
Display List 사용한 경우 Frame Rate이 13.0 정도 나옴
Display List를 사용하지 않은 경우 Frame Rate이 2.77 정도 나옴사용자 삽입 이미지



GLuint createDL()
{
GLuint snowManDL,loopDL;
snowManDL = glGenLists(1);
loopDL = glGenLists(1);


glNewList(snowManDL,GL_COMPILE);
drawSnowMan();
EndList();


glNewList(loopDL,GL_COMPILE);
for(int i = -30; i < 30; i++) {
    for(int j= -30; j < 30; j++) {
        glPushMatrix();
        glTranslatef(i*10.0,0,j * 10.0);
        glCallList(snowManDL);  
        glPopMatrix();
    }
}
glEndList();


return(loopDL);
}

OpenGL/GLUT Interaction

OpenGL keyboard, mouse, menu interaction
http://dis.dankook.ac.kr/lectures/cg08/entry/OPENGL-interaction

OpenGL single/double buffering, reshape, displaylist, picking
http://dis.dankook.ac.kr/lectures/cg08/entry/OPENGL-display-list-picking

OpenGL Picking Tutorial using Name Stack & Color Coding
http://www.lighthouse3d.com/opengl/picking/


OpenGL Picking Tutorial using Name Stack
http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=32

Teapot (using Display List)
http://www.songho.ca/opengl/gl_displaylist.html


Snowman (using Display List)
http://www.lighthouse3d.com/opengl/displaylists/

Box (using Display List)
http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=12