glBegin(GL_TRIANGLE_FAN) 함수를 사용해서 원을 그려봅시다.
#define GL_SILENCE_DEPRECATION //버전 오류 해결
#include <stdlib.h>
#include <stdio.h>
#include <OpenGL/gl.h> //mac Xcode에서 OpenGL을 사용하기 위한 헤더파일
#include <OpenGl/glu.h> //mac Xcode에서 OpenGL을 사용하기 위한 헤더파일
#include <GLUT/glut.h> //mac Xcode에서 OpenGL을 사용하기 위한 헤더파일
#include <math.h> //수학 개념을 사용하기 위한 헤더파일
void init(void){
glClearColor(1.0, 1.0, 1.0, 1.0); //배경을 흰색으로 설정
}
void draw_circle(){
glColor3f(1.0, 1.0, 0.0); //노란색 원을 그리기 위함.
glBegin(GL_TRIANGLE_FAN);
float radius = 0.36f; //반지름
int segment = 100; //100개의 삼각형을 만들겠다.
//삼각형 생성
for (int i = 0; i <= segment; i++) {
float angle = 2.0f * 3.141592 * i / segment;
float x = 0.0f + radius * cosf(angle); //x 좌표
float y = 0.0f + radius * sinf(angle); //y 좌표
glVertex2f(x, y); //생성
}
glEnd();
}
void display(){
glClear(GL_COLOR_BUFFER_BIT); //현재 버퍼를 지우고 설정된 배경색으로 새로 그림
draw_circle(); //원 생성함수
glFlush();
}
int main(int argc, char** argv){
glutInit(&argc, argv);
glutInitWindowSize(600, 600);
glutInitWindowPosition(100, 100);
glutCreateWindow("원 그리기");
init();
glutDisplayFunc(display);
glutMainLoop();
return 0;
}
원을 그리기 위해서는
void draw_circle(){
glColor3f(1.0, 1.0, 0.0); //노란색 원을 그리기 위함.
glBegin(GL_TRIANGLE_FAN);
float radius = 0.36f; //반지름
int segment = 100; //100개의 삼각형을 만들겠다.
//삼각형 생성
for (int i = 0; i <= segment; i++) {
float angle = 2.0f * 3.141592 * i / segment;
float x = 0.0f + radius * cosf(angle); //x 좌표
float y = 0.0f + radius * sinf(angle); //y 좌표
glVertex2f(x, y); //생성
}
glEnd();
}
이 함수가 가장 중요하다. GL_TRIANGLE_FAN
의 설명은 전 post를 참고하면 되지만, 한 정점을 기준으로 두 정점을 이용해서 삼각형을 이어 생성하는 방법이다.
원의 중심 정점은 (0.0f , 0.0f) 로 설정했다. 그럼 window 화면 가운데 원이 생길 것이다.
반지름은 0.36f 로 할 것이며, segment
는 원을 구성할 삼각형의 갯수이다. 100개의 삼각형을 이용해서 원을 그릴 것이다.
각도를 설정하고 x, y 좌표를 설정한 다음 glVertex2f
를 이용해서 삼각형을 생성한다.
void reshape(int w, int h){
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if (w <= h) {
gluOrtho2D(-1.0, 1.0, -1.0 * (GLfloat)h / (GLfloat)w, 1.0 * (GLfloat)h/ (GLfloat)w); // 화면 비율에 맞게 투영
}
else {
gluOrtho2D(-1.0 * (GLfloat)w / (GLfloat)h, 1.0 * (GLfloat)w / (GLfloat)h, -1.0, 1.0); // 화면 비율에 맞게 투영
}
}
reshape
함수를 만들지 않는다면 window 화면의 크기를 움직이면 원에서 타원형으로 바뀌는 것을 알 수 있다. 하지만 윈도우 크기를 정사각형이 아닌 직사각형으로 바꿔도 원의 상태를 유지하게 하기 위해서는 위의 reshape 함수를 만들어서 추가해주면 된다. 화면 비율에 맞게 도형의 모형을 유지해주는 함수이다.