👩💻/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();
}
📍 색 - 그라데이션
📍 명령어 - 회전, 확대/축소, 좌/우측 이동, 애니메이션 시작/종료, 제자리로 리셋, 프로그램 종료
반응형