'My story'에 해당되는 글 44건

투영은 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
,
기하변환이란 그래픽에서 물체의 이동, 회전, 크기조절 등의 작업들을 일컫는 말로 또는 변환이라고 한다.

1. 이동
탄력이 없는 단단한 물체를 이동하면 물체를 구성하는 모든 정점은 동일한 양만큼 움직이게 된다.

2.회전
물체를 회전을 시킬때는 아래의 공식을 적용한다.

X축을 기준의로 Y,Z평면의 회전


Y축을 기준의로 X,Z평면의 회전


Z축을 기준의로 X,Y평면의 회전

3. 크기조절
좌표계의 원점을 기준으로 물체의 크기를 변환 하는 것으로, 모든 배율이 같은 경우 균등 크기조절, 하나라도 다르면 차등 크기조절 이라한다.

4. 전단
물체를 한쪽 방향으로 밀어낸 것을 전단이라 한다. 이것은 물체 자체를 변형 시킨다. 

물체를 변환 시킬때 이동후 회전이나 회전후 이동등 순서에 따라 위치가 다르므로 순서에 유의 하여야 한다.



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

에일리어싱과 앤티-에일리어싱  (0) 2009.04.03
가시성 판단  (0) 2009.03.31
조명과 음영  (0) 2009.03.24
OpenGL의 투영과 뷰포트 변환  (0) 2009.03.24
OpenGL의 모델변환 및 행렬스택  (0) 2009.03.22
3차원 물체의 표현  (0) 2009.03.22
디스플레이 리스트  (0) 2009.03.22
정점배열  (0) 2009.03.22
GLUT 모델링  (0) 2009.03.21
OpenGL의 좌표계, 뷰포트  (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
,