OpenGL - 정육면체 xyz축 회전
설명
정육면체를 'X'를 눌렀을때는 X축 회전, 'Y'를 눌렀을땐 Y축회전, 'Z'를 눌렀을때는 Z축 회전시킨다.
소스설명
앞의 소스와 중복되는 부분은 변경이 있기전까진 생략한다.
궁금하신분은 맨 앞의 게시물을 확인바랍니다.
2017/09/12 - [SW/OpenGL] - OpenGL - 사각형 회전, 색바꾸기
선언
static bool mouseLeftDown;//checking mouse click static float point[2][2]; void mouseButton(int button, int state, int x, int y); void mouseMotion(int x, int y); void keyboard(unsigned char key, int x, int y); void timer(int value); void quad(int a, int b, int c, int d); static bool R = true; static bool G = true; static bool B = true; static float theta; bool rot = true; int r, x_axis = 0, y_axis = 1, z_axis = 0;
점8개와 색8개
/// <summary> /// eight point to draw a cube /// </summary> GLfloat vertices[8][3] = { { -1, -1, 1 },{ -1, 1, 1 }, { 1, 1, 1 },{ 1, -1, 1 },{ -1, -1, -1 }, { -1, 1, -1 },{ 1, 1, -1 },{ 1, -1, -1 } }; /// <summary> /// eight color each points /// </summary> GLfloat colors[8][3] = { { 0, 0, 1 },{ 0, 1, 1 }, { 1, 1, 1 },{ 1, 0, 1 }, { 0, 0, 0 },{ 0, 1, 0 }, { 1, 1, 0 },{ 1, 0, 0 } };
colors는 r,g,b 값으로 색을 조합한다.
x,y,z 키에 대한 이벤트(x축, y축, z축)
void keyboard(unsigned char key, int x, int y) { switch (key) { case 'q' | 'Q': exit(0); break; case VK_ESCAPE: exit(0); break; case 1: exit(0); break; case 2: exit(0); break; case 'x' | 'X': { x_axis = 1; y_axis = 0; z_axis = 0; break; } case 'y' | 'Y': { x_axis = 0; y_axis = 1; z_axis = 0; break; } case 'z' | 'Z': { x_axis = 0; y_axis = 0; z_axis = 1; break; } default: break; } }
렌더링함수
void RenderScene(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0.5, 0.5, 0.5, 0, 0, 0, 0, 1, 0); //view point glRotatef(theta, x_axis, y_axis, z_axis);//rotate cube //draw a cube with 6 quadrature quad(0, 3, 2, 1); quad(2, 3, 7, 6); quad(3, 0, 4, 7); quad(1, 2, 6, 5); quad(4, 5, 6, 7); quad(5, 4, 0, 1); glEnd(); glutSwapBuffers(); }
사각형을 그린다 위의 함수에서 6개의 사각형을 그리는데 사용하는 함수 quad
void quad(int a, int b, int c, int d) { glBegin(GL_QUADS); glColor3fv(colors[a]); glVertex3fv(vertices[a]); glColor3fv(colors[b]); glVertex3fv(vertices[b]); glColor3fv(colors[c]); glVertex3fv(vertices[c]); glColor3fv(colors[d]); glVertex3fv(vertices[d]); }
마우스 클릭, 모션 함수 (마우스 왼쪽 클릭하면 회전방향이 바뀐다.)
void mouseButton(int button, int state, int x, int y) { //mouse left button click if (button == GLUT_LEFT_BUTTON) { if (state == GLUT_DOWN) { if (!mouseLeftDown) { if (rot) rot = false; else rot = true; } } else if (state == GLUT_UP) { if (mouseLeftDown) mouseLeftDown = false; } } //mouse right button click else if (button == GLUT_RIGHT_BUTTON) { if (state == GLUT_DOWN) { } else if (state = GLUT_UP) { } } glutPostRedisplay(); } void mouseMotion(int x, int y) { if (mouseLeftDown) { double viewport[4]; glGetDoublev(GL_VIEWPORT, viewport); point[1][0] = x / (float)viewport[2] * 500; point[1][1] = (viewport[3] - y) / (float)viewport[3] * 500; } glutPostRedisplay(); }
정육면체를 회전하기 위한 타이머
void timer(int value) { if (rot) { theta += 2.0; if (theta >= 360.0) theta -= 360.0; } else { theta -= 2.0; if (theta <= 360.0) theta += 360.0; } glutTimerFunc(1000 / 30, timer, 1); glutPostRedisplay(); }
초기화
void init(void) { theta = 0.0f; glutTimerFunc(10, timer, 1); } void SetupRc(void) { glClearColor(1.0f, 1.0f, 1.0f, 1.0f); glEnable(GL_DEPTH_TEST); }
결과
'SW > OpenGL' 카테고리의 다른 글
OpenGL - 쉐이딩(Shading, line, flat smooth) (0) | 2017.09.13 |
---|---|
OpenGL - 16개의 움직이는 랜덤 티팟 (0) | 2017.09.12 |
OpenGL - 로봇 팔 만들기 (0) | 2017.09.12 |
OpenGL - 3점을 찍어 삼각형 그리기 (0) | 2017.09.12 |
OpenGL - 사각형 회전, 색바꾸기 (0) | 2017.09.12 |