OpenGL 원 그리기

OpenGL 2016. 9. 21. 17:57

앞 포스팅에서, 기본적인 점, 선 그리고 다각형을 그려보았다. 그럼 원은 어떻게 그릴 수 있을까?


OpenGL에서 바로 원을 그리는 방법은 내가 알기론 없다. 따라서, OpenGL에서는 원을 다각형으로 그리는데, 변이 매우 많은 다각형을 그림으로써 원처럼 보이게 할 수 있다.



첫째, 삼각함수를 이용하여 중점이 원점인 원을 그려보자.

반지름이 r 인 원의 중심이 원점에 위치할 때 원 위에 있는 임의의 한점은 (rcosΘ, rsinΘ)으로 나타낼 수 있다. 이를 코드로 나타내면 다음과 같다.

 

#include "gl/glut.h" #include <math.h> void display_circle() { glClearColor(1.0f, 1.0f, 1.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); glColor3f(0.0f, 0.0f, 1.0f); double rad = 0.5; glBegin(GL_POLYGON); for(int i=0;i<360;i++) { double angle = i*3.141592 / 180; double x = rad*cos(angle); double y = rad*sin(angle); glVertex2f(x,y); } glEnd(); glFinish(); } int main(int argc, char** argv) { glutInit(&argc, argv); glutCreateWindow ("OpenGL"); glutDisplayFunc(display_circle); glutMainLoop(); return 0; }

display_circle이라는 함수를 먼저 보자. glClearColor와 glClear로 먼저 배경을 하얗게 해준다. 저번 포스팅에서는 이렇게 해주지 않아, 배경이 검정이었다. 


다음, 도형의 색을 glColor3f로 정의할 수 있다. glColor3f를 쪼개보면, glColor, 3, f로 나눌 수 있다. f는 float, 3은 3개, glColor은 색상, 즉 색상을 3개의 float으로 정의내린다는 것이다. 여기서 3개의 수는 빨강 초록 파랑인 RGB 코드를 0부터 1까지 조절할 수 있다.


반지름을 rad변수로 하고, 임의의 값 0.5로 해준다.


다음 다각형인 polygon으로 glBegin을 해주고, x와 y에 (rcosΘ, rsinΘ) 을 넣어주고 glVertex2f로 넣어준다.

여기서, glVertex2f도 glVertex, 2, f로 나눌 수 있다. 역시 두개의 float으로 꼭지점으로 정의내린다는 것이다.


C에서 cos, sin 삼각함수를 사용하기 위해 math.h를 넣는 것을 잊지말자. 또한 for문에서 i를 보면 0부터 360까지, 즉 각도임을 알 수 있다. 그러나 cos함수 안에 들어가는 angle 값은 라디안 값이기 때문에, 이를 angle 변수로 둬서 3.141592를 곱해주고 180을 나눠줌으로서 라디안으로 바꿔준다. 



둘째, 중점이 원점이 아닌 원을 그려보자.


이는 단순하다. 앞에서 구한 (rcosΘ, rsinΘ) 에 중점의 좌표 (cx,cy)를 더해주면 된다. 
double cx = 0.2;
double cy = 0.1;
glVertex2f(x + cx, y + cy);


셋째, 안이 비어있는 원을 그려보자.


앞의 두 예제에서는 glBegin(GL_POLYGON) 을 사용했기 때문에, 속이 차있는 원이였다. 그럼 속이 빈 원을 그리려면? GL_POLYGON 대신 GL_LINES을 사용하면 된다.

앞 포스팅에서, GL_LINES는 glVertex를 짝수개씩 써야 한다고 했었다. 이는, GL_LINES이 먼저 온 glVertex에서 다음 glVertex까지를 연결하는 선을 만들기 때문이다.

따라서 원을 그리려면, 0-1 1-2 2-3 3-4 ... 357-358 , 358-359 으로 선을 연결해 주어야 원이 연결되어있는 것처럼 보인다.

코드를 먼저 보자. display_circle을 조금 수정하였다.

void display_circle() { glClearColor(1.0f, 1.0f, 1.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); glColor3f(0.0f, 0.0f, 1.0f); double rad = 0.5; double x[360], y[360]; glBegin(GL_LINES); for (int i = 0; i < 360; i++) { double angle; angle = i*3.141592 / 180; x[i] = rad*cos(angle); y[i] = rad*sin(angle); } for (int i = 0; i < 359; i++){ glVertex2f(x[i],y[i]); glVertex2f(x[i+1],y[i+1]); } glEnd(); glFinish(); }

먼저, for문을 두개로 나눠 첫번째 x y 배열에 계산값을 미리 넣어두었다. 두번째 for문에서는 짝수개씩 되도록, i와 i+1로 선을 그리게 했다. 여기서, 두 for문의 끝나는 조건이 360과 359로 다르므로, 유의해야한다.



넷째, 안이 비어있는 원을 GL_LINE_STRIP을 이용하여 그려보자.

GL_LINE으로 그리려니, 뭔가 인덱스도 i, i+1로 해야하고 for문도 두번 써야 하고 배열도 써야하고, 조금 복잡하다. 그래서 나온게 GL_LINE_STRIP이다. 이는 GL_LINE처럼 꼭지점을 짝수개로 해줄 필요가 없다. glVertex로 추가하는 꼭지점들을 직전의 꼭지점과 바로 연결시켜준다. 즉 꼭지점을 추가하는 대로 전부 다 선으로 연결해준다.


void display_circle() { glClearColor(1.0f, 1.0f, 1.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); glColor3f(0.0f, 0.0f, 1.0f); double rad = 0.5; glBegin(GL_LINE_STRIP); for (int i = 0; i < 360; i++) { double angle,x,y; angle = i*3.141592 / 180; x = rad*cos(angle); y = rad*sin(angle); glVertex2f(x, y); } glEnd(); glFinish(); }



'OpenGL' 카테고리의 다른 글

OpenGL 점, 선, 삼각형, 사각형 그리기  (0) 2016.09.19
OpenGL freeglut Visual Studio 설치 방법  (2) 2016.09.06
Posted by 딕스트라
,