'OpenGL'에 해당되는 글 3건

  1. 2016.09.21 OpenGL 원 그리기 1
  2. 2016.09.19 OpenGL 점, 선, 삼각형, 사각형 그리기
  3. 2016.09.06 OpenGL freeglut Visual Studio 설치 방법 2

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 딕스트라
,

가장 간단한 도형 그리기


Visual Studio에 OpenGL 환경 설치 글 ( http://blog.amaorche.com/20 )의 예제소스코드를 다시 보자.

#include "gl/glut.h" void display() { glBegin(GL_POLYGON); glVertex2f(-0.5f, -0.5f); glVertex2f(0.5f, -0.5f); glVertex2f(0.5f, 0.5f); glVertex2f(-0.5f, 0.5f); glEnd(); glFinish(); } int main(int argc, char** argv) { glutInit(&argc, argv); glutCreateWindow("OpenGL"); glutDisplayFunc(display); // 여기서 그릴 함수를 넣어준다. glutMainLoop(); return 0; }

코드는 display 함수와 main 함수로 이루어져 있다.


먼저 main 함수를 보면, glut을 접두사로 붙이는 함수들이 있다. 

먼저 초기화 함수인 glutInit()을 해주고, 

새 창을 만드는 glutCreateWindow()를 해준다. 함수 전달인자에 있는 "OpenGL"은 새로 만들어지는 창 이름이다.


그 다음, 실제로 그리는 함수인 glutDisplayFunc()에서 우리가 필요한 그림을 그릴 수 있다. 함수 전달인자로, 그림을 그리는 함수를 넣어준다. 소스코드에서는 main 함수 위의 display 함수를 전달인자로 넘겨준다.


자, 그럼 다시 display 함수를 보자. 모든 함수 앞에는 gl이라는 접두사가 붙는다.


void display() {
	glBegin(GL_POLYGON);
	glVertex2f(-0.5f, -0.5f);
	glVertex2f(0.5f, -0.5f);
	glVertex2f(0.5f, 0.5f);
	glVertex2f(-0.5f, 0.5f);
	glEnd();
	glFinish();
}


간단하게 순차적으로 설명하자면, 이미 그려져 있는 것이 있다면 Clear로 깨끗하게 지운다. 그다음 Begin으로 시작하여 End까지, 그리고자 하는 도형 정보를 넣는다. 위 예제에서는 다각형을 그리는데, 


(-0.5,-0.5)

(0.5,-0.5)

(0.5,0.5)

(-0.5,0.5)


를 꼭지점으로 가지는 다각형(사각형)을 그린다.


여기서 다른 모양을 그리고 싶으면, Begin의 전달인자에 그리고자 하는 도형을 정하고 각 꼭지점 위치정보를 glVertex(x좌표,y좌표) 형태로 추가한다. 이때, openGL 창 정중앙이 (0,0)이다. 기본 도형의 glBegin 전달인자와 꼭지점 개수 조건은 다음과 같다.


점 : GL_POINTS , 꼭지점 개수조건 없음

선 : GL_LINES, 꼭지점 은 짝수개 있어야 함. 연결되지 않은 점은 그리지 않음

삼각형 : GL_TRIANGLES, 꼭지점은 3배수로 있어야 함. 3배수가 안되는 나머지 1~2개의 점은 그리지 않음

사각형 : GL_QUADS, 꼭지점은 4배수로 있어야 함, 4배수가 안되는 나머지 1~3개의 점은 그리지 않음

다각형 : GL_POLYGON 꼭지점은 2개 이상 (최소 삼각형을 그릴 수 있어야 함)



점 그리기


점은 Begin ~ End 사이에 있는 Vertex 수 만큼 그릴 수 있다. 점 크기를 조절하려면 glPointSize 함수를 사용하면 된다. 전달인자에 점 지름을 float로 넣을 수 있다.


glPointSize(10.0);
glBegin(GL_POINTS);
glVertex2f(-0.5f, -0.5f);
glVertex2f(0.5f, -0.5f);
glVertex2f(0.5f, 0.5f);
glVertex2f(-0.5f, 0.5f);
glEnd();
glFinish();




선 그리기


선은 GL_LINES 으로 그릴 수 있다. 꼭지점은 꼭 2배수로 있어야 한다. 홀수이면, 마지막 꼭지점은 무시된다. 선 두께를 조절하려면 glPointSize 함수를 사용하면 된다. 전달인자에 두께 픽셀 크기를 float로 넣을 수 있다.


glLineWidth(10.0);
glBegin(GL_LINES);
glVertex2f(-0.5f, -0.5f);
glVertex2f(0.5f, -0.5f);
glVertex2f(0.5f, 0.5f);
glVertex2f(-0.5f, 0.5f);
glEnd();
glFinish();








삼각형 그리기


삼각형은 GL_TRIANGLES 로 그릴 수 있다. 꼭지점은 3개가 꼭 있어야 한다. 순차적으로 3개씩 짝지어 내려갔을 때 남는 1개 또는 2개의 꼭지점은 그리지 않는다.


 	
glBegin(GL_TRIANGLES);
glVertex2f(-0.5f, -0.5f);
glVertex2f(0.5f, -0.5f);
glVertex2f(0.5f, 0.5f);
glEnd();



사각형 그리기


사각형은 GL_QUADS로 그릴 수 있다. 꼭지점은 4개가 있어야 하고, 마찬가지로 마지막 3개 이하의 꼭지점은 무시된다. 또한, 점의 방향 (반시계 또는 시계)을 유지해야 한다. 

	
glBegin(GL_QUADS);
glVertex2f(-0.5f, -0.5f);
glVertex2f(0.5f, -0.5f);
glVertex2f(0.5f, 0.5f);
glVertex2f(-0.5f, 0.5f);
glEnd();
glFinish(); 



다각형 그리기


기타 다각형은 GL_POLYGON으로 그릴 수 있다. 꼭지점은 최소 3개 이상이 있어야 한다.


glBegin(GL_POLYGON);
glVertex2f(-0.5f, -0.5f);
glVertex2f(0.5f, -0.5f);
glVertex2f(0.5f, 0.0f);
glVertex2f(0.0f, 0.5f);
glVertex2f(-0.5f, 0.0f);
glEnd();
glFinish();



'OpenGL' 카테고리의 다른 글

OpenGL 원 그리기  (1) 2016.09.21
OpenGL freeglut Visual Studio 설치 방법  (2) 2016.09.06
Posted by 딕스트라
,

C++에서 점, 선 면 등 도형을 그리거나, 창 조절, 키보드나 마우스 입력등을 처리할 때 GLUT(OpenGL Utility Toolkit) 라이브러리를 사용한다. 하지만 GLUT는 오픈소스도 아니고, 옛날에 업데이트가 중단되었다.


따라서 최근까지 업데이트 되어오고 있는 freeglut라는 오픈소스 GLUT 라이브러리를 사용하는 것이 더 좋다.

(가장 최근버전이, 2015년 3월 7일에 릴리즈된 freeglut 3.0.0 버전이다.)


Visual Studio에서 freeglut을 사용하기 위해선 간단한 설정을 해주어야 한다.


설치 환경은 i7-2600K, Microsoft Windows 8.1, Visual Studio 2015이다.







먼저,  Visual Studio를 켜 새 프로젝트를 만든다.


물론 C++ 탭에서, 콘솔 응용 프로그램으로 해야한다.



추가 옵션에 빈 프로젝트에 체크해준다.



소스파일도 추가해 준다.



다음, freeglut 파일을 다운받는다.


Visual studio에서 사용하므로, MSVC Package를 받으면 된다.


링크 : http://www.transmissionzero.co.uk/software/freeglut-devel/




다운 받으면 다음과 같은 bin, include, lib 폴더가 있다.


우리가 필요한 폴더와 파일은 총 3개이다.


그중 폴더는 include, lib폴더이다.

필요한 파일은 bin 폴더 안의 freeglut.dll 이다.




다시, 프로젝트로 돌아와서 솔루션 오른쪽으로 클릭해서, 파일탐색기에서 폴더 열기를 누른다.




그렇게 나온 폴더에서, 프로젝트 이름으로 된 폴더에 들어간다. (즉, 소스 파일이 있는 폴더)


주의! 파일 탐색기에서 폴더 열기해서 바로 나오는 폴더 이름도 프로젝트 이름이고, 우리가 들어가고자 하는 폴더도 프로젝트 이름이므로 헷갈리기 쉽다. 


아래 사진 처럼, 프로젝트 이름이 폴더 주소에 두번 나오는지 한번 더 확인하는게 좋다.



다운받은 freeglut 폴더에서 include, lib폴더와 bin폴더의 freeglut.dll을 복사한다.


이렇게 하면, 파일은 다 준비되었다.



다시, Visual Studio로 돌아온다.



프로젝트 탭에 속성을 누른다.



C/C++에 추가 포함 디렉터리에 ./include 를 넣어준다.



다음, 링커 탭으로 가서 일반에 추가 라이브러리 디렉터리에 ./lib 을 넣어준다.





마지막으로, 링커 탭, 입력에 추가 종속성에 기존 내용 앞 혹은 뒤에 opengl32.lib;glu32.lib;freeglut.lib; 을 넣어준다. 


여기서 ; 는 파일간의 구분자이다.



그렇게 한 다음, 예제 소스를 복사하여 컴파일한다.






이렇게 파란 상자가 나오면 된다.


이렇게 하면 OpenGL freeglut을 Visual Studio에서 사용하는 준비가 다 끝난 것이다.




예제소스



 
#include "gl/glut.h"
void display() {
	glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
	glClear	(GL_COLOR_BUFFER_BIT);
	glColor3f(0.0f, 0.0f, 1.0f);
	glBegin
		(GL_POLYGON);
	glVertex2f(-0.5f,-0.5f);
	glVertex2f(0.5f,-0.5f);
	glVertex2f(0.5f, 0.5f);
	glVertex2f(-0.5f, 0.5f);
	glEnd();
	glFinish();
}
int main(int argc, char** argv)
{
	glutInit(&argc, argv);
	glutCreateWindow
		("OpenGL");
	glutDisplayFunc(display);
	glutMainLoop();
	return 0;
}


'OpenGL' 카테고리의 다른 글

OpenGL 원 그리기  (1) 2016.09.21
OpenGL 점, 선, 삼각형, 사각형 그리기  (0) 2016.09.19
Posted by 딕스트라
,