'OpenGL'에 해당되는 글 14건

투영은 3차원 물체를 2차원 화면으로 사상(맵핑)하기 위한 작업으로 가시변환(Viewing Transformation)이라고도 한다.

1. 평행 투영
물체로 부터 무한대의 거리에 시점이 있다하고, 투상선을 나란히 가져가는 방법. 아무리 멀리 있어도 같은 크기로 표시 된다.

2. 원근 투영
물체로부터 유한한 거이에 시점이 있다고 간주하고 모든 투상선이 시점에서 출발하여 방사선 모양으로 퍼져나가는 방법이다.
사람의 눈이 물체를 포착하는 것처럼 멀리 있는 물체는 작게 보인다.

투영을 할떄는 항상 투영 범위를 제한 해야 한다. 투영 범위를 가시부피 라고 하고, 시점에 가까운 쪽을 전방 절단면, 멀리 떨어진 면을 후방 절단면 이라 한다. 전방,후방 절단면에 의해 그 밖에 있는 물체는 보이지 않는다.


OpenGL에서는 투영을 설정 하려면 먼저 glMatrixMode(GL_PROJECTION)으로 행렬을 투영행렬로 바꿔 줘야한다. 만약 평행 투영을 하려면 OpenGL에서는 glOrtho라는 함수를 사용해서 평행 투영을 지원한다. 그리고 원근 투영은 OpenGL에서 제공하는
 glFrustum함수와 GLU에서 제공하는 gluPerspective함수 2가지중 하나를 사용 할수 있다.

void glOrtho( GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far);
제일 왼쪽부터 왼쪽, 오른쪽, 아래쪽, 위쪽, 앞쪽, 뒤쪽으로 넘겨받은 파라미터로 육면체를 만들어 평행투영을 시킨다.

void glFrustum( GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far);
제일 왼쪽부터 왼쪽, 오른쪽, 아래쪽, 위쪽, 앞쪽, 뒤쪽으로 넘겨받은 파라미터로 육면체를 만들어 원근투영을 시킨다.

void gluPerspective( GLdouble fov, GLdouble aspect, GLdouble near, GLdouble far);
fov는 투영을 시키는 시야 각이고, aspect는 뷰 윈도우의 종횡비이고, near과 far은 전방 후방 절단면이다.

주의할점은 near, far은 항상 양의 값을 가줘야 한다.

뷰포트 변환
뷰포트 변환 이란 정규화 장치좌표계에서 화면 좌표계로 가는 작업이다.

OpenGl에서는 glViewport라는 함수를 사용해 뷰포트를 설정 할 수 있다.

void glViewport(GLint left, GLint bottom, GLsizei width, GLsizei height);
left, bottom은 좌하단의 좌표 이고 이것을 기준으로 폭을 width, 높이를 height만큼의 사각형을 정희 한다.





'라이브러리 > OpenGL' 카테고리의 다른 글

프래그먼트와 GL의 버퍼  (0) 2009.06.12
텍스쳐  (0) 2009.04.03
에일리어싱과 앤티-에일리어싱  (0) 2009.04.03
가시성 판단  (0) 2009.03.31
조명과 음영  (0) 2009.03.24
OpenGL의 모델변환 및 행렬스택  (0) 2009.03.22
기하 변환  (0) 2009.03.22
3차원 물체의 표현  (0) 2009.03.22
디스플레이 리스트  (0) 2009.03.22
정점배열  (0) 2009.03.22
Posted by crownog
,
OpenGL에서 모든 변환은 변환행렬로 대신한다. 예를 들어 모델변환은 모델행렬로, 시점변환은 뷰행렬로, 투영변환은 투영행렬등으로 사용한다.

OpenGL에서는 모델변환행렬뷰변환행렬을 합쳐서 모델뷰변환행렬로 사용하게 되어있다. 원래는 뷰행렬과 모델행렬이 곱해져 모델뷰를 이루지만 물체를 보기위해 카메라를 옮기는거나 물체를 옮기는 거나 최종 결과 모습은 동일 하기 때문이다.

변환을 할려면 행렬을 지정해주어야 하는대 OpenGL에서 glMatrixMode라는 함수를 사용해 지정해 줄 수 있다. 그리고 glLoadIdentity라는 함수를 실행하여 CTM을 항등행렬로 초기화 해준다. 초기화 해주지 않으면 그 전 행렬을 그대로 가지고 있기 때문에 원하는 결과와 다르게 나올수도 있으므로 상황떄라 적절히 사용해 주어야한다.

OpenGL에서는 이라는 것을 이용하여 CTM을 변환 시키는 방법이 크게 3가지로 사용된다.

(OpenGL은 열우선순위 배열을 사용 하므로 배열로 데이터를 넘겨주고 할때는 2차원 배열이아닌 1차원 배열로 선언 하는 것이 좋다. 왜냐하면 우리가 프로그래밍에쓰는 배열은 행우선 순위 이므로 순서가 달라려 원하는 결과와는 다른 결과가 나올 수 있기때문이다.)
1. glLoadMatrix 라는 함수를 사용 해서 배열을 넘겨 CTM을 그 배열 값으로 채울 수 있다. 이 함수는 넘겨받을 배열의 데이터 형을 GLfloat과 GLdouble을 지원 하며 위의 함수명마지막에 데이터 형에 따라 f 또는 d를 명시해 주어야 한다.

2. glMultMatrix 라는 함수는 CTM에 파라미터로 넘겨주는 배열 M을 곱하는 함수이다. 이 곱셈은 후위곰셈으로 CTM = CTM * M 이므로 행렬의 곱셈은 교환 법칙이 성립하지 않으므로 주의를 요한다. 이 함수도 1과 같이GLfloat과GLdouble을 사용 가능하므로 함수명 마지막에 f 또는 d를 명시해주어야 한다.

3. 마지막으로 OpenGL에서 제공하는 이동, 회전, 크기조절등의 함수를 이용하는 것이다. 이 방법을 이용할때 주의할 점은 OpenGL 에서는 변환을 Stack을 이용해 전역 좌표를 기준으로 변환을 하기 때문에 물체를 이동후 회전을 하고 싶으면 OpenGL에서는 회전후 이동을 해야 원하는 결과를 얻을 수 있다.

(끝에 d가 붙는건 넘겨받을 파라미터가 GLdouble f는 GLfloat형을 뜻한다.)

회전
glRotated, glRotatef( angle, x축, y축, z축)
이 함수는 모델 좌표계를 젼역 좌표계로 부터 angle만큼 반 시계방향으로 회전 시킨다. angle의 단위는 도(Degree)이고 그 다음은 전역 좌표계의 어느 축을 기준으로 회전을 할껀지 정하고 회전할 축의 값을 1로 준다.(주의! 모델좌표계가 기준이 아니다)

이동
glTranslated,glTranslatef( x축, y축, z축)
이 함수는 모델 좌표계를 전역 좌표계로부터 X,Y,Z축 방향으로 x,y,z 만큼 이동 시킨다.

크기 조절
glScaled, glScaledf(x, y, z);
이 함수는 모델 좌표계의 X,Y,Z축의 눈금이 전역 좌표계 눈금의 x,y,z 배만큼 되도록 크기를 조절한다. 이 함수를 사용시 주의 해야할 점은 기본 크기가 1 이기 때문에 하나의 축만 조절할때 나머지는 0이 아닌 1을 줘야 한다.
(만약 위함수를 사용해서 전역 좌표계 한 눈금이 0.1cm이고 x가 2일 때 모델 좌표계의 한 눈금은 0.2cm가 되어 좌표는 똑같이
1이지만 0.1cm가 아닌 0.2cm를 가기 때문에 크기는 2배가 된다.)

행렬 스택
OpenGL에서는 CTM을 설정한 후 그려지는 모든 물체는 CTM의해 3차원 공간에 그려지게 된다. 그러기 때문에 어느 한 곳에서 CTM을 변환 하면 다른 모든 물체도 영향을 받는다. 그래서 OpenGL에서는 행렬 스택이라는것을 이용해 CTM에 변화를 주지 않으면서 변환을 할수 있게 해준다.

행렬 스택의 실행방식은 이름에도 있듯이 스택을 이용해 CTM을 스택에 저장 하고 꺼내는 방식이다.
먼저 glPushMatrix라는 함수를 사용하면 CTM스택에 저장 한다. 그러면 스택에는 변환하기 전의 CTM이 저장되어있고 CTM의 복사본이 CTM으로 설정 되어있다. 그 후부터 나오는 모든 변환 및 렌더링은 CTM의 복사본에 일어난다. 그리고 glPopMatrix라는 함수를 사용하여 변환하기 전에 저장한 CTM을 불러와 CTM으로 복원한다.
(스택에 저장할수 있는 행렬의 갯수는 하드웨어 마다 다르지만 모델뷰는 최소 32개, 투상은 최소 2개이다)

void glMatrixMode(GLenum mode);
mode에는 GL_MODELVIEW, GL_PROJECTION, GL_TEXTURE 등 을 사용할 수 있다. 이 함수를 사용하면 지정한 행렬을 현재 행렬로 설정 한다.

void glLoadIdentity(void)
CTM을 항등행렬로 초기화 시킨다.

void glLoadMatrixd(const GLdouble *m),void glLoadMatrixf(const GLfloat *m)
CTM의 값들을 m의 값들로 바꾼다.

void glMultMatrixd(const GLdouble *m),void glMultMatrixf(const GLfloat *m)
CTM과 m을 곱한 후 곱한 값을 CTM에 넣는다.

void glPushMatrix(void);
CTM을 스택의 데이터가 없는 곳에서 제일 아래쪽에 저장한다.

void glPopMatrix(void);
스택에 저장되어 있는 제일 위의 CTM 저장본을 꺼내서 CTM으로 설정한다.

'라이브러리 > OpenGL' 카테고리의 다른 글

텍스쳐  (0) 2009.04.03
에일리어싱과 앤티-에일리어싱  (0) 2009.04.03
가시성 판단  (0) 2009.03.31
조명과 음영  (0) 2009.03.24
OpenGL의 투영과 뷰포트 변환  (0) 2009.03.24
기하 변환  (0) 2009.03.22
3차원 물체의 표현  (0) 2009.03.22
디스플레이 리스트  (0) 2009.03.22
정점배열  (0) 2009.03.22
GLUT 모델링  (0) 2009.03.21
Posted by crownog
,
우리가 컴퓨터에서 3차원 물체를 표현할때는 크게 두가지가 있다. 하나는 물체의 겉 표면만 표현하는 것이고 다른 하나는 내부까지 포함해서 표현 하는 것이다.
그중 많이 사용되는것은 겉표면만 표현하는 방법이다. 이른바 경계면 표현이라불리는 이방법은 평면 다각형의 집합으로 나타낸다.

3D 모델링 데이터 에서 면을 구성하고 있는 평면 다각형 하나하나를 메쉬, 표면 메쉬, 다각형 메쉬, 표면 다각형, 또는 단순히 다각형이라 부른다. 일반적으로 메쉬에 사용되는 다각형은 주로 사각형 또는 삼각형을 사용한다.


'라이브러리 > OpenGL' 카테고리의 다른 글

가시성 판단  (0) 2009.03.31
조명과 음영  (0) 2009.03.24
OpenGL의 투영과 뷰포트 변환  (0) 2009.03.24
OpenGL의 모델변환 및 행렬스택  (0) 2009.03.22
기하 변환  (0) 2009.03.22
디스플레이 리스트  (0) 2009.03.22
정점배열  (0) 2009.03.22
GLUT 모델링  (0) 2009.03.21
OpenGL의 좌표계, 뷰포트  (0) 2009.03.21
파이프라인과 상태변수  (0) 2009.03.21
Posted by crownog
,

디스플레이 리스트 
변경되지 않는 일련의 명령어들을 컴파일하여 빠른 속도의 렌더링을 위해 사용한는 방법

OpenGL 함수의 실행모드는 두가지로 분류 된다.


1. 직접모드
물체를 화면에 그림과 동시에 물체 생성과 관련된 모든 정보를 파기해 버린다. 따라스 그 물체를 다시 그리려면 모든 코드를 처음부터 다시 실행해야 한다.

2. 보류모드
정의된 물체 정보를 그대로 유지하고 재사용한다. 이미 정의된 물체를 컴파일 된형태로 재 사용함으로써 빠른 속도를 보장한다. OpenGL의 보류모드는 디스플레이 리스트에 의해 이루어진다.

디스플레이 리스트를 선언하기 위해서는 먼저 glGenLists함수를 호출하고 리턴값을 저장해둔다.
그리고 glNewList 함수와 glEndList내부에 사용할 명령어들을 정의 한다.
마지막으로 렌더링함수에서 glCallList함수를 호출 해줌으로써 실행된다.
그러나 디스플레이 리스트의 내용은 한 번 정의되면 일부만 수정이 불가능하게 되므로 수정을 원한다면 전체를 다시 생성해야 한다.

GLuint glGenLists(GLsizei range);
이 함수는 사용 안된 디스플레이 리스트중 첫번째의 아이디를돌려 준다. range는 원하는 아이디의 갯수 이며 어려개를 할당할려면 다음과 같이 한다.
GLuint list1, list2
list1 = glGenLists(2);
list2 = list1+1;

glNewList(GLuint list, GLenum mode);
이 함수는 이제 나오는 명령들을 리스트로 만든다. list는 glGenLists에서 넘겨받은 ID값이다.
mode는 2가지가 있는대 하나는 컴파일만 시키는 GL_COMPILE과 컴파일을 함과 동시에 명령을 즉시 실행하는 GL_COMPILE_AND_EXECUTE가 있다.

void glEndList(void);
이 함수는 리스트로 만들 명령어가 끝났음을 의미한다

void glCallList(GLuint list);
이 함수는 glNewList함수로 컴파일한 리스트를 실행하는 함수이다. list에는 ID값을 넘겨준다.



'라이브러리 > OpenGL' 카테고리의 다른 글

조명과 음영  (0) 2009.03.24
OpenGL의 투영과 뷰포트 변환  (0) 2009.03.24
OpenGL의 모델변환 및 행렬스택  (0) 2009.03.22
기하 변환  (0) 2009.03.22
3차원 물체의 표현  (0) 2009.03.22
정점배열  (0) 2009.03.22
GLUT 모델링  (0) 2009.03.21
OpenGL의 좌표계, 뷰포트  (0) 2009.03.21
파이프라인과 상태변수  (0) 2009.03.21
OpenGL의 설계원리  (0) 2009.03.21
Posted by crownog
,