wisdiom 아니고 wisdom

[실습 12] 원의 경로를 따라 이동/회전하는 애니메이션 구현 (미완성) 본문

👩‍💻/OpenGL

[실습 12] 원의 경로를 따라 이동/회전하는 애니메이션 구현 (미완성)

글로랴 2021. 6. 30. 20:30

 

#include <gl/glut.h>
#include <math.h>
#include <stdio.h>



void DrawSecne();
void Reshape(int w, int h);
void TimerFunction(int value);
void Keyboard(unsigned char key, int x, int y);



bool isSquare = false;
bool isMove = false;

​

float angleZ = 0;
float sizeX = 1.0;
float sizeY = 1.0;

​

static int fps = 500;
int w, h;

​

int main()
{
 glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
 glutInitWindowPosition(100, 100);
 glutInitWindowSize(800, 600);
 glutCreateWindow("practice_12");
 glutDisplayFunc(DrawSecne);
 glutKeyboardFunc(Keyboard);
 glutTimerFunc(fps, TimerFunction, 1);
 glutReshapeFunc(Reshape);
 glutMainLoop();
}

​

void DrawSecne()
{
 glClear(GL_COLOR_BUFFER_BIT);
 
 //초기화
 glLoadIdentity();

 //좌표축
 glBegin(GL_LINES);
 glVertex3f(-100.0, 0.0, 0.0);
 glVertex3f(100.0, 0.0, 0.0);
 glVertex3f(0.0, -100.0, 0.0);
 glVertex3f(0.0, 100.0, 0.0);
 glEnd();

 // 원 궤도
 glBegin(GL_LINE_LOOP);
 for (int degree = 0; degree < 360; degree += 1)
 {
  float radian = (float)degree * 3.141592f / 180.f;
  glVertex2f(cos(radian) * 50, sin(radian) * 50);
 }
 glEnd();

 glMatrixMode(GL_MODELVIEW);

 //사각형
 if (isSquare == true)
 {
  glPushMatrix();
   glTranslatef(0.0f, 50.0f, 0.0f);
   glTranslatef(0.0f, -50.0f, 0.0f);
   glScalef(sizeX, sizeY, 1.0f);
   glRotatef(angleZ, 0.0f, 0.0f, 1.0f); //z축회전
   glRectf(-7.0f, 35.0f, 7.0f, 65.0f);
  glPopMatrix();

  if (isMove == true)
  {
   glPushMatrix();
    
  }
 }
 else
 {
  // 삼각형
  glPushMatrix();
   glTranslatef(0.0f, 50.0f, 0.0f);
   glTranslatef(0.0f, -50.0f, 0.0f);
   glScalef(sizeX, sizeY, 1.0f);
   glRotatef(angleZ, 0.0f, 0.0f, 1.0f);//z축회전
    glBegin(GL_TRIANGLES);
     glVertex2f(7.0, 35.0);
     glVertex2f(-7.0, 35.0);
     glVertex2f(0.0, 65.0);
    glEnd();
  glPopMatrix();
 }
 
 glutSwapBuffers();
}

​

void Reshape(int w, int h)
{
 glViewport(0, 0, w, h);
 glMatrixMode(GL_PROJECTION);
 glLoadIdentity();
 glOrtho(-100.0, 100.0, -100.0, 100.0, -100.0, 100.0);
 glMatrixMode(GL_MODELVIEW);
}

​

void TimerFunction(int value)
{
 glutPostRedisplay();
 angleZ += 10;
 if (sizeX == 1)
 {
  sizeX += 0.2;
  sizeY += 0.2;
 }
 else
 {
  sizeX = 1;
  sizeY = 1;
 }
 glutTimerFunc(fps, TimerFunction, 1);
}

​

void Keyboard(unsigned char key, int x, int y)
{
 switch (key)
 {
 case 'q': //사각형
  isSquare = true;
  break;
 case 't': //삼각형
  isSquare = false;
  break;
 case 'd': //그냥 이동
  isMove = true;
 default:
  break;
 }
}

📍 도형 종류 - 삼각형, 사각형

📍 키보드 명령어에 따른 경로 - 사인 곡선, 회오리, 지그재그, 경로 그리기

반응형
Comments