wisdiom 아니고 wisdom

[실습 17] 계층적으로 움직이는 크레인 만들기 본문

👩‍💻/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();
} 
반응형
Comments