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에서는 모델변환행렬과 뷰변환행렬을 합쳐서 모델뷰변환행렬로 사용하게 되어있다. 원래는 뷰행렬과 모델행렬이 곱해져 모델뷰를 이루지만 물체를 보기위해 카메라를 옮기는거나 물체를 옮기는 거나 최종 결과 모습은 동일 하기 때문이다.
변환을 할려면 행렬을 지정해주어야 하는대 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 |