👩‍💻/OpenGL

[실습 11] 화면에 사인, 코사인, 스프링, 직사각형 그리기

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

 

#include <iostream>
#include <GL/glut.h>
#include <math.h>
#include <time.h>



#define PI 3.14



float angleX = 0;
float angleY = 0;
float angleZ = 0;
float scaleX = 0;
float scaleY = 0;
float transX = 0;

float aniX = 0;
float aniY = 0;
float direction = 1; // 오른쪽이라 가정

int startX = 0;
int startY = 0;
int startZ = 0;
int startAni = 0;

​

GLvoid Reshape(int w, int h) {
 glViewport(0, 0, w, h);
 glMatrixMode(GL_PROJECTION);
 glLoadIdentity();
 //glOrtho(0.0, w, 0.0, h, -400.0, 400.0);
 glMatrixMode(GL_MODELVIEW);
}

​

void drawFunc() {
 float x = -0.5f;
 float degree = 0;
 glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
 glClear(GL_COLOR_BUFFER_BIT);
 glMatrixMode(GL_MODELVIEW);

 glPushMatrix();

 glBegin(GL_LINES); // 십자선
 {
  glVertex2f(-1.0, 0.0);
  glVertex2f(1.0, 0.0);
  glVertex2f(0.0, -10.0);
  glVertex2f(0.0, 1.0);
 }
 glEnd();


 glPushMatrix();
 {
  glRotatef(angleY, 0.0f, 1.0f, 0.0f); // y축 회전
  glRotatef(angleZ, 0.0f, 0.0f, 1.0f); // z축 회전

  glTranslated(0.0f + transX + aniX, 0.2f + aniY, 0.0f);
  glRotatef(angleX, 1.0f, 0.0f, 0.0f); // x축 회전
  glScalef(1.0f + scaleX, 1.0f + scaleY, 1.0f); // 확대

  glBegin(GL_LINE_STRIP);
  {
   glColor3f(1.0, 0.0, 1.0);
   for (int i = 0; i < 100; i++) {
    x += 0.01;
    degree += 0.2;
    glVertex2f(x, cos(degree)*0.1);
   }
  }
  glEnd();
 }
 glPopMatrix();


 glPushMatrix(); // 사인
 {
  glRotatef(angleY, 0.0f, 1.0f, 0.0f); // y축 회전
  glRotatef(angleZ, 0.0f, 0.0f, 1.0f); // z축 회전

  glTranslated(0.0f + transX, 0.6f, 0.0f);
  glRotatef(angleX, 1.0f, 0.0f, 0.0f); // x축 회전
  glScalef(1.0f + scaleX, 1.0f + scaleY, 1.0f); // 확대

  glBegin(GL_LINE_STRIP);
  {
   x = -0.5f;
   degree = 0;
   for (int i = 0; i < 100; i++) {
    x += 0.01;
    degree += 0.2;
    glVertex2f(x, sin(degree)*0.1);
   }
  }
  glEnd();
 }
 glPopMatrix();

 glPushMatrix();
 {
  glRotatef(angleY, 0.0f, 1.0f, 0.0f); // y축 회전
  glRotatef(angleZ, 0.0f, 0.0f, 1.0f); // z축 회전

  glTranslated(0.0f + transX, -0.2f, 0.0f);
  glRotatef(angleX, 1.0f, 0.0f, 0.0f); // x축 회전
  glScalef(1.0f + scaleX, 1.0f + scaleY, 1.0f); // 확대

  glBegin(GL_LINE_STRIP); // 스프링
  {
   x = -0.5f;
   degree = 0;
   for (int i = 0; i < 700; i++) {
    glColor3f(1.0 - i*0.002, 0.0, 1.0);
    degree += 0.1;
    float sX = cos(degree)*0.1;
    float sY = sin(degree)*0.1;
    glVertex2f(x + sX + i*0.0015, sY);
   }
  }
  glEnd();
 }
 glPopMatrix();

 glPushMatrix(); // 사각형
 {
  glRotatef(angleY, 0.0f, 1.0f, 0.0f); // y축 회전
  glRotatef(angleZ, 0.0f, 0.0f, 1.0f); // z축 회전

  glTranslated(0.0f + transX, -0.55f, 0.0f);
  glRotatef(angleX, 1.0f, 0.0f, 0.0f); // x축 회전
  glScalef(1.0f + scaleX, 1.0f + scaleY, 1.0f); // 확대
  glBegin(GL_QUADS);
  {
   glColor3f(1.0, 1.0, 1.0);
   x = -0.55f;
   float y = 0.0f;
   for (float i = 0; i < 1.2; i += 0.2) {
    glVertex2f(x - 0.05 + i, y + 0.05);
    glVertex2f(x - 0.05 + i, y - 0.05);
    glVertex2f(x + 0.05 + i, y - 0.05);
    glVertex2f(x + 0.05 + i, y + 0.05);
   }
  }
  glEnd();

 }
 glPopMatrix();

 glLoadIdentity();

 glFlush();
}

​

void Keyboard(unsigned char key, int x, int y) {
 switch (key) {
 case 'x':
  if (angleX) {
   angleX = 0;
  }
  else {
   startX = 1;
  }
  break;
 case 'y':
  if (angleY) {
   angleY = 0;
  }
  else {
   startY = 1;
  }
  break;
 case 'z':
  if (angleZ) {
   angleZ = 0;
  }
  else {
   startZ = 1;
  }
  break;
 case 'S':
  for (int i = 0; i < 10; i++) {
   scaleX += 0.05;
   scaleY += 0.05;
  }
  break;
 case 's':
  for (int i = 0; i < 10; i++) {
   scaleX -= 0.05;
   scaleY -= 0.05;
  }
  break;
 case 'A':
  startAni = 1;
  break;
 case 'a':
  startAni = 0;
  aniX = 0;
  aniY = 0;
  break;
 case 'i':
  angleX = 0;
  angleY = 0;
  angleZ = 0;
  scaleX = 0;
  scaleY = 0;
  transX = 0;
  startX = 0;
  startY = 0;
  startZ = 0;
  break;
 case 'q':
  exit(0);
  break;
 default:
  break;
 }
}

​
void KeyboardSpecial(int key, int x, int y) {
 switch (key) {
 case GLUT_KEY_LEFT:
  transX -= 0.1;
  break;
 case GLUT_KEY_RIGHT:
  transX += 0.1;
  break;
 default:
  break;
 }
}

void TimerFunction(int value) {
 glutPostRedisplay();

 if (startX == 1) {
  angleX += 1.0f;
  if (angleX == 360.0f) {
   startX = 0;
  }
 }
 if (startY == 1) {
  angleY += 1.0f;
  if (angleY == 360.0f) {
   startY = 0;
  }
 }
 if (startZ == 1) {
  angleZ += 1.0f;
  if (angleZ == 360.0f) {
   startZ = 0;
  }
 }

 if (startAni == 1) {
  if (aniY <= -0.8f) {
   direction = 1;
  }
  if (aniY >= 0.8f) {
   direction = -1;
  }
  aniX += 0.1f * direction;
  aniY += 0.1f * direction;
 }
 glutTimerFunc(50, TimerFunction, 1);
}



int main(int argc, char *argv[]) {
 glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
 glutInitWindowPosition(300, 0);
 glutInitWindowSize(650, 650);
 glutCreateWindow("컴그_실습 11");
 glutDisplayFunc(drawFunc);
 glutKeyboardFunc(Keyboard);
 glutSpecialFunc(KeyboardSpecial);

 glutTimerFunc(500, TimerFunction, 1);

 glutReshapeFunc(Reshape);

 glutMainLoop();
}

📍​ 색 - 그라데이션
📍 명령어 - 회전,  확대/축소,  좌/우측 이동,  애니메이션 시작/종료,  제자리로 리셋,  프로그램 종료

반응형