👩💻/OpenGL
[실습 17] 계층적으로 움직이는 크레인 만들기
글로랴
2021. 6. 30. 20:38
📌 이동하는 육면체 위에 작은 물체를 올리고 그 위에 긴 팔을 만든다.
- 맨 아래의 몸체는 좌우로 이동
- Y축으로 회전 가능
- 위 몸체와 팔도 같이 회전
📌 중간의 작은 물체는 X축 회전, Y축 회전 (양/음 방향으로)
- 회전 중심은 몸체의 아래 부분
- 맨 위의 긴팔도 같이 회전된다.
📌 맨 위의 긴팔은 X축 회전, Z축 회전 (양/음 방향으로)
- 회전 중심은 긴팔의 아래 부분
#include <GL/glut.h>
#include <stdlib.h>
void drawscene();
void Reshape(int w, int h);
void Keyboard(unsigned char key, int x, int y);
//void Timerfunction(int value);
static GLfloat bottomX = 0.0f;
static GLfloat bottom_angleY = 0.0f;
static GLfloat Middle_angleX = 0.0f;
static GLfloat Middle_angleY = 0.0f;
static GLfloat Top_angleX = 0.0f;
static GLfloat Top_angleZ = 0.0f;
const int fps = 100;
int main()
{
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
glutInitWindowPosition(300, 100);
glutInitWindowSize(800, 600);
glutCreateWindow("컴그_실습17");
glutKeyboardFunc(Keyboard);
glutDisplayFunc(drawscene);
glutReshapeFunc(Reshape);
//glutTimerFunc(fps, Timerfunction, 1);
glutMainLoop();
}
void Reshape(int w, int h)
{
// 뷰포트 변환 설정
glViewport(0, 0, w, h);
// 투영 행렬 스택 재설정
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
// 원근투영
gluPerspective(80.0f, w / h, 1.0, 600.0); // 원근 거리
glTranslatef(0.0, 0.0, -195.0); // 어느 정도 거리에서 볼 것인가. (아마 카메라..?)
//모델 뷰 행렬 스택 재설정
//glMatrixMode(GL_MODELVIEW);
// 카메라 *관측 변환: 카메라의 위치 설정 (필요한 경우, 다른 곳에 설정 가능)
gluLookAt(0.0, 1.0, 0.0, 0.0, 0.0, -1.0, 0.0, 1.0, 0.0);
glViewport(0, 0, w, h);
}
void Keyboard(unsigned char key, int x, int y)
{
switch (key)
{
case 't':
Top_angleX += 1.0;
break;
case 'T':
Top_angleX -= 1.0;
case 'z':
Top_angleZ += 1.0f;
break;
case 'Z':
Middle_angleX = 0.0f;
Top_angleZ -= 1.0f;
case 'x':
Middle_angleX += 1.0;
break;
case 'X':
Middle_angleX -= 1.0;
break;
case 'm':
Middle_angleY += 1.0f;
break;
case 'M':
Middle_angleY -= 1.0f;
break;
case 'a':
bottomX += 1.0;
break;
case 'd':
bottomX -= 1.0;
break;
case 'y':
bottom_angleY += 1.0;
break;
case 'i': //초기화
bottomX = 0.0f;
bottom_angleY = 0.0f;
Middle_angleX = 0.0f;
Middle_angleY = 0.0f;
Top_angleX = 0.0f;
Top_angleZ = 0.0f;
glLoadIdentity();
break;
default:
break;
}
Reshape(800, 600);
glutPostRedisplay();
}
void drawscene()
{
glClearColor(1.0f, 1.0f, 1.0f, 1.0f); // 바탕색 흰 색
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// 초기화
// --- XZ축 바닥
glColor3f(1.0, 1.0, 0.0);
glBegin(GL_POLYGON);
glVertex3f(-100.0, -50.0, 100.0);
glVertex3f(100.0, -50.0, 100.0);
glVertex3f(100.0, -50.0, -100.0);
glVertex3f(-100.0, -50.0, -100.0);
glEnd();
// 크레인
glPushMatrix();
{
glColor3f(1.0f, 0.0f, 0.0f);
glTranslatef(0.0, -50.0, 0.0);
glTranslatef(bottomX, 0.0, 0.0);
glRotatef(bottom_angleY, 0.0, 1.0, 0.0);
glScalef(2.0, 1.0, 2.0);
glutSolidCube(20);
glPushMatrix();
{
glColor3f(0.0f, 1.0f, 0.0f);
glTranslatef(0.0, 30.0, 0.0);
glScalef(0.5, 4.0, 0.5);
glRotatef(Middle_angleX, 1.0, 0.0, 0.0);
glRotatef(Middle_angleY, 0.0, 1.0, 0.0);
glutSolidCube(10);
glPushMatrix();
{
glColor3f(0.0f, 1.0f, 1.0f);
glTranslatef(0.0, 8.5, 0.0);
glScalef(0.3, 0.7, 0.3);
glRotatef(Top_angleX, 1.0, 0.0, 0.0);
glRotatef(Top_angleZ, 0.0, 0.0, 1.0);
glutSolidCube(10);
}
glPopMatrix();
}
glPopMatrix();
}
glPopMatrix();
glutSwapBuffers();
}
반응형