앞 포스팅에서, 기본적인 점, 선 그리고 다각형을 그려보았다. 그럼 원은 어떻게 그릴 수 있을까?
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을 나눠줌으로서 라디안으로 바꿔준다.
둘째, 중점이 원점이 아닌 원을 그려보자.
double cx = 0.2; double cy = 0.1; glVertex2f(x + cx, y + cy);
셋째, 안이 비어있는 원을 그려보자.
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 |