Vector Matrix Plane
http://dis.dankook.ac.kr/lectures/cg10/entry/Vector-Matrix-Plane-Class
OpenGL Transformation 예제
http://dis.dankook.ac.kr/lectures/cg10/entry/OpenGL-Transformation
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);
}
lab2
lab2 (including animation with glutTimerFunc)1544103579.cppglutTimerFunc
http://www.opengl.org/resources/faq/technical/glut.htm#glot0027
single buffer vs double buffer
OpenGL single buffer vs double buffer – draw geometry primitives
http://www.opengl.org/resources/code/samples/glut_examples/examples/sb2db.c
OpenGL single buffer vs double buffer – draw a square3177778429.cpp
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
OpenGL/GLUT text & sierpinski gasket
OPENGL bitmap text (using glutBitmapCharacter) & stroke text (using glutStrokeCharacter)
http://dis.dankook.ac.kr/lectures/cg07/entry/OPENGL-bitmap-stroke-text
Sierpinski gasket
http://dis.dankook.ac.kr/lectures/cg07/entry/시어핀스키-가스켓Sierpinski-gasket
OPENGL geometry primitives & attribute
OPENGL geometry primitives and attribute
http://dis.dankook.ac.kr/lectures/cg08/entry/OPENGL-geometry-primitives-attribute-example
OPENGL geometry primitives (circle, cube, cylinder, sphere, square)
http://dis.dankook.ac.kr/lectures/cg08/entry/OPENGL-geometry-primitives