다각형 내부를 채우는 함수인 glShadeMode()를 이용하여, 사각형 내부를 보간에 의한 채움으로 구현해보았다.

 

#include <GL/glut.h>

void MyDisplay() {
glClear(GL_COLOR_BUFFER_BIT);
glShadeModel(GL_SMOOTH); //선형보간 설정 함수
glBegin(GL_POLYGON);
glColor3f(0.0, 1.0, 0.0);  //초록색
glVertex3f(-0.5, -0.5, 0.0);

glColor3f(1.0, 1.0, 0.0);  //노란색
glVertex3f(0.5, -0.5, 0.0);

glColor3f(1.0, 0.0, 1.0);  //보라색
glVertex3f(0.5, 0.5, 0.0);

glColor3f(1.0, 0.0, 0.0);  //빨간색
glVertex3f(-0.5, 0.5, 0.0);
glEnd();
glFlush();
}

int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA);
glutInitWindowSize(500, 500);
glutInitWindowPosition(0, 0);
glutCreateWindow("Linear Interpolation");

glClearColor(1.0, 1.0, 1.0, 1.0);
glutDisplayFunc(MyDisplay);
glutMainLoop();

return 0;
}

'OpenGL' 카테고리의 다른 글

[OpenGL] 미니 프로젝트  (0) 2019.07.17
[OpenGL] 4. 메뉴 콜백  (0) 2019.07.16
[OpenGL] 3. 키보드 콜백  (0) 2019.07.10
[OpenGL] 2. 마우스 콜백  (0) 2019.07.05
[OpenGL] 1. 삼각형 그리기  (0) 2019.07.05

학기 중 배웠던 내용을 바탕으로 미니 프로젝트를 제작해보았다. 전체적인 내용은 여러 개의 teapot들이 놀이공원의 기구처럼 돌아가는 것이고, 여기에 주전자의 모양이나 배경색을 변경할 수 있도록 구현하였다. 그리고 이 프로젝트의 목표는 '학기 중 배웠던 기능들을 빠짐없이 구현하기'로 잡았다. 

 

기본적인 화면 구성의 모습은 다음과 같다.

 

기본 화면

지금부터 프로젝트에서 구현한 기능들에 대해서 설명하겠다.

 

첫 번째, 윈도우의 크기가 변하더라도 화면의 오브젝트들에는 영향을 끼치지 않도록 화면 왜곡 제거 기능을 구현했다.

기본 화면 (왼쪽)          /          화면 크기가 변경된 모습 (오른쪽)

두 번째, 실제 놀이기구처럼 모든 teapot들이 함께 움직이도록 구현하였다. 이는 '계층 구조 모델링'을 이용하여 모든 오브젝트들이 동시에 움직이도록 할 수 있었다.

 

세 번째, teapot의 움직임은 키보드 콜백과 타이머 콜백을 이용하여 구현하였다. 같은 기능이지만, 각각의 루트로 기능을 실행하기 위해서는 키보드와 메뉴를 통해 할 수 있도록 해놓았기 때문에 겹침을 없게 하였다.

 

네 번째, 화면의 색상을 변경할 수 있도록 하였다. 이것은 마우스 콜백을 이용하여 구현하였다. 또한 IsBlue라는 boolean형의 변수를 이용하여, true일 경우에 (=왼쪽 마우스 버튼이 눌림) 베경이 하늘색으로 바뀌고, false일 경우에 (=눌리지 않은 경우)기본 옵션인 하얀색으로 설정되도록 하였다.

 

다음은 더 많은 기능을 구현하기 위해 메뉴 기능을 구현하였다. 메인 메뉴의 구성은 밑의 이미지와 같고, Exit항목을 제외한 나머지는 서브메뉴가 있다. 서브메뉴는 teapot을 자동으로 움직이게 하는 기능과 형태를 변경하는 기능을 수행한다.

자동 움직임은 IsAuto라는 Boolean형 변수를 사용하였는데, false를 디폴트로 하여 메뉴 항목을 선택하지 않았을 경우에는 정지된 상태를 유지하게 하였다. 또한 teapot의 형태는 Wire나 Solid를 선택할 수 있게 하였고, 각 메뉴를 선택했을 시 변경이 되도록 IsWire라는 Boolean형 변수를 이용하였다.

 

메인 메뉴
2가지 서브 메뉴

마지막으로 현재 teapot의 형태가 무엇인지 출력하는 문자열을 구현하였다. 이는 티스토리의 '멈춤보단 천천히라도'의 글을 참고하였다. 자세한 주소는 다음과 같다. https://webnautes.tistory.com/1092

 

OpenGL 강좌 - 정사각형 그리기

OpenGL 프로그래밍을 위한 준비과정은 다음 포스팅을 참고하세요. [그래픽스&컴퓨터비전/Augmented Reality] - OpenGL( freeGLUT ) 을 Visual Studio 2015에 연동하기 [그래픽스&컴퓨터비전/Augmented Reality] -..

webnautes.tistory.com

완성된 코드는 다음 cpp파일을 통해 확인할 수 있다.

Spin_Teapot.cpp
0.00MB

'OpenGL' 카테고리의 다른 글

[OpenGL] 5. 선형보간  (0) 2019.07.19
[OpenGL] 4. 메뉴 콜백  (0) 2019.07.16
[OpenGL] 3. 키보드 콜백  (0) 2019.07.10
[OpenGL] 2. 마우스 콜백  (0) 2019.07.05
[OpenGL] 1. 삼각형 그리기  (0) 2019.07.05

메인 메뉴
서브 메뉴
작은 원구와 환원체
큰 원구와 원환체

메뉴 콜백을 이용해보았다. 프로그램을 실행시켰을 때 바로 나오는 기본 화면은 작은 원구의 모습이다.

오른쪽 마우스를 클릭하면 메인 메뉴가 나오는데, 여기서 오브젝트의 모양과 크기를 변경할 수 있다. 변경하고 싶은 사항이 있으면 메뉴의 항목에 마우스를 두면 세부사항에 대한 서브 메뉴가 나타난다.

 

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

GLboolean IsSphere = true;
GLboolean IsSmall = true;

void MyDisplay() {
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0, 1.0, 1.0);
if ((IsSphere) && (IsSmall))
glutWireSphere(0.2, 15, 15); // 작은 원구
else if ((IsSphere) && (!IsSmall))
glutWireSphere(0.4, 15, 15); // 큰 원구
else if ((!IsSphere) && (IsSmall))
glutWireTorus(0.1, 0.3, 40, 20); // 작은 원환체
else glutWireTorus(0.2, 0.5, 40, 20); // 큰 원환체
glFlush();
}

void MyMainMenu (int entryID) {
if (entryID == 1)
exit(0);
glutPostRedisplay(); // 프로그램 종료
}

void MySubMenu_shape (int entryID) {
if (entryID == 1)
IsSphere = true; // 원구 그리기
else if (entryID == 2)
IsSphere = false; // 원환체 그리기
glutPostRedisplay();
}

void MySubMenu_size (int entryID) {
if (entryID == 1)
IsSmall = true; // 작은 크기로 그리기
else if (entryID == 2)
IsSmall = false; // 큰 크기로 그리기
glutPostRedisplay();
}

int main(int argc, char** argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB);
glutInitWindowSize(300, 300);
glutInitWindowPosition(0, 0);
glutCreateWindow("Menu Callback");

glClearColor(0.0, 0.0, 0.0, 1.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);

//Change Shape 서브 메뉴의 콜백 함수 등록
GLint MySubMenuID_shape = glutCreateMenu(MySubMenu_shape);
glutAddMenuEntry("Draw Sphere", 1);
glutAddMenuEntry("Draw Torus", 2);

//Change Size 서브 메뉴의 콜백 함수 등록
GLint MySubMenuID_size = glutCreateMenu(MySubMenu_size);
glutAddMenuEntry("Small One", 1);
glutAddMenuEntry("Big One", 2);

GLint MyMainMenuID = glutCreateMenu(MyMainMenu);
glutAddSubMenu("Change Shape", MySubMenuID_shape);
glutAddSubMenu("Change Size", MySubMenuID_size);
glutAddMenuEntry("Exit", 1);

glutAttachMenu(GLUT_RIGHT_BUTTON);
glutDisplayFunc(MyDisplay);
glutMainLoop();

return 0;
}

'OpenGL' 카테고리의 다른 글

[OpenGL] 5. 선형보간  (0) 2019.07.19
[OpenGL] 미니 프로젝트  (0) 2019.07.17
[OpenGL] 3. 키보드 콜백  (0) 2019.07.10
[OpenGL] 2. 마우스 콜백  (0) 2019.07.05
[OpenGL] 1. 삼각형 그리기  (0) 2019.07.05

기본 화면

키보드 콜백을 이용해보았다. 방향키로 회색 사각형 오브젝트를 이동시키고, ESC키를 누르면 프로그램을 종료할 수 있도록 구현했다.

 

#include  <iostream>
#include <gl/glut.h>

double trans_left = 0, trans_up = 0;      //오브젝트 이동을 위한 변수 (좌우/위아래)

 

//디스플레이 콜백함수 
void MyDisplay() {
glClear(GL_COLOR_BUFFER_BIT); 
glColor3f(0.5, 0.5, 0.5);
glBegin(GL_POLYGON); 
glVertex3f(-0.5 + trans_left, -0.5 + trans_up, 0.0);
glVertex3f(0.5 + trans_left, -0.5 + trans_up, 0.0);
glVertex3f(0.5 + trans_left, 0.5 + trans_up, 0.0);
glVertex3f(-0.5 + trans_left, 0.5 + trans_up, 0.0);
glEnd();
glFlush();
}

void MyReshape (int NewWidth, int NewHeight) {
glViewport(0, 0, NewWidth, NewHeight);
GLfloat WidthFactor = (GLfloat)NewWidth / (GLfloat)300;
GLfloat HeightFactor = (GLfloat)NewHeight / (GLfloat)300;
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-1.0 * WidthFactor, 1.0 * WidthFactor,
-1.0 *HeightFactor, 1.0 * HeightFactor, -1.0, -1.0);
}

void MyKeyboard (unsigned char KeyPressed, int X,int Y) {
switch (KeyPressed) {
case 27:
exit(0);
break;
}
}

void MySpecialKey(int Key,int X, int Y)
{
switch (Key) {
case GLUT_KEY_LEFT:     //왼쪽 키
trans_left = trans_left - 0.1;
glutPostRedisplay();
break;
case GLUT_KEY_RIGHT:     //오른쪽 키
trans_left = trans_left + 0.1;
glutPostRedisplay();
break;
case GLUT_KEY_UP:      //위 키
trans_up = trans_up + 0.1;
glutPostRedisplay();
break;
case GLUT_KEY_DOWN:      //아래 키
trans_up = trans_up - 0.1;
glutPostRedisplay();
break;
}
}

int main(int argc, char** argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB);
glutInitWindowSize(300, 300);
glutInitWindowPosition(0, 0);
glutCreateWindow("Keyboard Callback");
glClearColor(1.0, 1.0, 1.0, 1.0);      // 배경색 
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);


glutDisplayFunc(MyDisplay);
// ESC 키에 대한 이벤트
glutKeyboardFunc(MyKeyboard);
//방향 키에 대한 이벤트
glutSpecialFunc(MySpecialKey);
glutMainLoop();

return 0;
}

'OpenGL' 카테고리의 다른 글

[OpenGL] 5. 선형보간  (0) 2019.07.19
[OpenGL] 미니 프로젝트  (0) 2019.07.17
[OpenGL] 4. 메뉴 콜백  (0) 2019.07.16
[OpenGL] 2. 마우스 콜백  (0) 2019.07.05
[OpenGL] 1. 삼각형 그리기  (0) 2019.07.05

결과 화면 1
결과 화면 2

마우스 콜백을 이용해 드래그를 하면 사각형을 그릴 수 있도록 구현하였다.

 

#include <GL/glut.h>

GLint TopLeftX, TopLeftY, BottomRightX, BottomRightY;

void MyDisplay() {
glViewport(0, 0, 500, 500);
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0, 1.0, 1.0);
glBegin(GL_POLYGON);
glVertex3f(TopLeftX/500.0, (500-TopLeftY)/500.0, 0.0);
glVertex3f(TopLeftX/500.0, (500-BottomRightY)/500.0, 0.0);
glVertex3f(BottomRightX/500.0, (500-BottomRightY)/500.0, 0.0);
glVertex3f(BottomRightX/500.0, (500-TopLeftY)/500.0, 0.0);
glEnd();
glFlush();
}

void MyMouseClick(GLint Button, GLint State, GLint X, GLint Y) {
if (Button== GLUT_LEFT_BUTTON && State == GLUT_DOWN) {
TopLeftX = X;
TopLeftY = Y;
}
}

void MyMouseMove (GLint X, GLint Y) {
BottomRightX = X;
BottomRightY = Y;
glutPostRedisplay();
}

int main(int argc, char** argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB);
glutInitWindowSize(500, 500);
glutInitWindowPosition(0, 0);
glutCreateWindow("Mouse Callback");

glClearColor(0.0, 0.0, 0.0, 1.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);

glutDisplayFunc(MyDisplay);
//마우스 콜백 함수 등록
glutMouseFunc(MyMouseClick);
glutMotionFunc(MyMouseMove);
glutMainLoop();

return 0;
}

'OpenGL' 카테고리의 다른 글

[OpenGL] 5. 선형보간  (0) 2019.07.19
[OpenGL] 미니 프로젝트  (0) 2019.07.17
[OpenGL] 4. 메뉴 콜백  (0) 2019.07.16
[OpenGL] 3. 키보드 콜백  (0) 2019.07.10
[OpenGL] 1. 삼각형 그리기  (0) 2019.07.05

결과 화면

검은색 바탕에 빨간 삼각형을 그려보았다.

삼각형은 glColor3f()으로 색상을 정하였고, glVertex3f()으로 모양을 표현하였다. 또한, 바탕은 glClearColor()의 매개변수를 0.0, 0.0, 0.0로 지정해 검은색을 나타내었다.


코드는 다음과 같다.

 

#include <gl/glut.h>

 

void MyDisplay() {

glClear(GL_COLOR_BUFFER_BIT);

glViewport(0, 0, 300, 300);

glColor3f(1.0, 0.0, 0.0);                    // 삼각형 그리기

glBegin(GL_POLYGON);

glVertex3f(-0.5, -0.5, 0.0);

glVertex3f(0.5, -0.5, 0.0);

glVertex3f(0.0, 0.5, 0.0);

glEnd();

glFlush();

}

 

int main(int argc, char** argv) {

glutInit(&argc, argv);

glutInitDisplayMode(GLUT_RGB);

glutInitWindowSize(300, 300);

glutInitWindowPosition(0, 0);

glutCreateWindow("Triangle");

 

glClearColor(0.0, 0.0, 0.0, 1.0);      // 배경색 지정

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);

 

glutDisplayFunc(MyDisplay);

glutMainLoop();

return 0;

}

'OpenGL' 카테고리의 다른 글

[OpenGL] 5. 선형보간  (0) 2019.07.19
[OpenGL] 미니 프로젝트  (0) 2019.07.17
[OpenGL] 4. 메뉴 콜백  (0) 2019.07.16
[OpenGL] 3. 키보드 콜백  (0) 2019.07.10
[OpenGL] 2. 마우스 콜백  (0) 2019.07.05

+ Recent posts