[OpenGL] 원그리기

심주흔·2024년 4월 13일
0

컴퓨터그래픽스

목록 보기
7/7
post-thumbnail

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를 이용해서 삼각형을 생성한다.

🍑 reshape 함수까지 한다면?

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 함수를 만들어서 추가해주면 된다. 화면 비율에 맞게 도형의 모형을 유지해주는 함수이다.

profile
이봐... 해보기는 했어?

0개의 댓글