-
[OpenGL] 예제2_정육면체 그리기Programming Language/OpenGL 2017. 4. 11. 16:06반응형
glLoadIdentity,
glPushMatrix,
glPopMatrix,
glutSwapBuffers,
glMatrixMode,
glEnable,
glLineStipple,
glTranslatef,
glRotatef,
glScalef
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130/*glLoadIdentity,glPushMatrix,glPopMatrix,glutSwapBuffers,glMatrixMode,glEnable,glLineStipple,glTranslatef,glRotatef,glScalef*/#include <iostream>#include <gl/glut.h>void drawBox(){glColor3f(1, 0, 0);glBegin(GL_LINE_LOOP);glVertex3f(-1, -1, -1);glVertex3f(1, -1, -1);glVertex3f(1, 1, -1);glVertex3f(-1, 1, -1);glEnd();glColor3f(0, 1, 0);glBegin(GL_LINE_LOOP);glVertex3f(-1, -1, 1);glVertex3f(1, -1, 1);glVertex3f(1, 1, 1);glVertex3f(-1, 1, 1);glEnd();glColor3f(0, 0, 1);glBegin(GL_LINES);glVertex3f(-1, -1, -1);glVertex3f(-1, -1, 1);glVertex3f(1, -1, -1);glVertex3f(1, -1, 1);glVertex3f(1, 1, -1);glVertex3f(1, 1, 1);glVertex3f(-1, 1, -1);glVertex3f(-1, 1, 1);glEnd();}void display(){glClearColor(1, 1, 1, 1);glClear(GL_COLOR_BUFFER_BIT);glViewport(250, 0, 250, 250);glMatrixMode(GL_PROJECTION);/*glMatrixMode : specify which matrix is current matrix. (sets the current matrix mode)GL_PROJECTION : applies subsequent matrix operations to the projection matrix stack.GL_MODELVIEW : applies subsequent matrix operations to the modelview matrix stack.GL_MODELVIEW의 행렬을 곱하면 물체의 실제 위치를 지정할 수 있다.GL_PROJECTION의 행렬을 곱하면 최종적으로 어떻게 화면에 뿌릴 것인가를 결정할 수 있다. - ex. 직교투영, 원근투영예) 서로 다른 모드들은 각자에게 영향을 주지 않는다.glMatrixMode(GL_PROJECTION);glLoadIdentity(); // GL_PROJECTION matrix mode에 대한 행렬 초기화. modelview matrix를 초기화하지 않음.glMatrixMode(GL_MODELVIEW);glLoadIdentity();// GL_MODELVIEW matrix mode에 대한 행렬 초기화https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glMatrixMode.xmlhttp://sune.tistory.com/270*/glLoadIdentity();glOrtho(-1, 1, -1, 1, 0.1, 50);glMatrixMode(GL_MODELVIEW);glLoadIdentity();/* glLoadIdentity : replace the current matrix with the identity matrix.두개 이상의 물체를 좌표상에 나타낼 때, 첫 번째 물체를 그릴 때 사용되었던 변환행렬이 두 번째 물체를 그릴 때에도 계속 남아있게 된다.첫 번째 물체와는 다른 변환행렬을 사용해서 그리기 위해서는 행렬을 단위행렬로 초기화해 주어야 한다. 그러기 위해서 사용하는 함수가 glLoadIdentity()이다.단, glLoadIdentity()로 행렬을 초기화하면 예전의 변환행렬 값을 잃게 된다.예전의 변환행렬 값을 잃지 않기 위해 사용하는 것이 Matrix stack이다. 스택에 이전 행렬들을 glPushMatrix()로 저장하고, glPopMatrix()로 꺼낼 수 있다.http://nobilitycat.tistory.com/entry/glLoadIdentity-%ED%95%A8%EC%88%98*/glEnable(GL_LINE_STIPPLE);//enable or disable server-side GL capabilities. /* https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glEnable.xml */glLineStipple(1, 0xF0F0);//specify the line stipple pattern https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glLineStipple.xmlglPushMatrix();/*https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glPushMatrix.xmlhttp://www.gpgstudy.com/forum/viewtopic.php?t=3537*/glTranslatef(0, 0, -2);//정점의 이동glRotatef(180, 1, 1, 1);//회전 변환glScalef(0.5, 0.5, 0.5);//크기 변환 : 벡터의 크기를 늘리고 줄이는 것.drawBox();glPopMatrix();glutSwapBuffers();/*glutSwapBuffers : swaps the buffers of the current window if double buffered.double buffered mode : front buffer 내용이 화면에 나타내어지는 동안, 새로운 내용이 back buffer에 쓰여지고, back buffer에 기록이 다 되면 front buffer와 back buffer가 바뀐다.glutSwapBuffers는 back buffer과 front buffer를 swapping하는 것.An implicit glFlush is done by glutSwapBuffers before it returns. Subsequent OpenGL commands can be issued immediately after calling glutSwapBuffers, but are not executed until the buffer exchange is completed.If the layer in use is not double buffered, glutSwapBuffers has no effect.https://www.opengl.org/resources/libraries/glut/spec3/node21.htmlhttp://kuroikuma.tistory.com/115*/glFinish();}int main(int argc, char** argv){glutInit(&argc, argv);glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);/*sets initial display mode. GLUT_DOUBLE : select a double buffered window.(front buffer & back buffer)https://www.opengl.org/resources/libraries/glut/spec3/node12.html*/glutInitWindowSize(500, 500);glutInitWindowPosition(0, 0);glutCreateWindow("cubecube");glutDisplayFunc(display);glutMainLoop();}/*modelview matrix와 projection matrix에 대해 더 알고싶다면 http://sune.tistory.com/270 참고.glPushMatrix, glPopMatrix에 대한 이해 : http://www.gpgstudy.com/forum/viewtopic.php?t=3537 참고.*/cs 반응형'Programming Language > OpenGL' 카테고리의 다른 글
[OpenGL]예제3_회전하는 정사면체, 애니메이션 (0) 2017.04.12 [OpenGL] Rasterization (0) 2017.04.11 [OpenGL] 예제1_화면에 도형 띄우기 (0) 2017.04.10 [Visual Studio] OpenGL 프로젝트 생성하기 (0) 2017.04.10 [OpenGL] glFrustum (0) 2017.03.28