State Machine과 CTM(current state matrix)
OpenGL의 Transformation Function 들을 자유롭게 다루기 위해서는 OpenGL이 State Machine이라는 것을 꼭 이해해야 한다.
무슨 말이냐면, polygon의 위치에 관한 state를 나타내는 행렬인 CTM에 (1,1,1)만큼 이동하도록 코딩하면, 그다음부터 그려지는 모든 polygon들은 본래 위치에서 (1,1,1)만큼 전부 이동되어서 그려진다는 것이다.
즉, CTM에 앞으로 그려질 도형의 위치에 관한 행렬들을 모두 곱해 놓고, 그다음부터 필요한 도형을 그리는 방식이다.
행렬스택
그렇다면 만약 원점에서 x축으로 1만큼 이동후, 180도 회전하고, y축으로 1만큼 이동해야 한다면, CTM에 x축 이동, 180도회전, y축이동 3가지 함수를 곱해주고 그 이후에 polygon들을 그리면 된다.
그런데 이때 x축이동, 180도 회전을 한 위치에서 다른 polygon을 그리고 싶다면 어떻게 해야 할까?
y축 이동을 반대 방향으로 할 수도 있지만, 만약 여러 개의 이동이 중첩되어 있다면 반대 연산으로 돌아가기가 힘들다.
이런 상황을 위해 OpenGL에서는 state를 저장할 수 있는 Stack을 제공한다.
자료구조를 배울 때 말하는 그 Stack이다.
OpenGL에는 아래와 같은 4개의 state를 저장하는 stack이 있다.
- Modelview matrix stack(GL_MODELVIEW)
- Projection matrix stack(GL_PROJECTION)
- Texture matrix stack(GL_PROJECTION)
- Color matrix stack(GL_COLOR)
위의 4가지 Stack 중 위치를 나타내는 Modelview matrix stack을 CTM(current trasformation matrix)이라고 한다.
(사실 과제를 하면서 CTM을 제외한 다른 스택을 건드릴 일이 없었다.)
2개의 함수로 Stack을 사용할 수 있다.
glPopMatrix()
Pop함수로 stack의 맨 위 state를 CTM으로 가져온다.
원래 CTM은 덮어쓰기 되어 사라진다.
glPushMatrix()
현재 CTM의 state를 Stack에 Push 한다.
현재 CTM은 변화 없이 그대로 있다.
자 그러면 위의 예제에서는 x축 이동, 180도 회전 후 glPushMatrix()를 해서 state를 저장해놓고 y축 이동 후 작업을 한 후 glPopMatrix()를 해서 이전 상태로 바로 돌아가서 필요한 작업을 하면 되는 것이다.
그래서 다음 글은 CTM과 Stack을 사용하여 Hierarchical구조를 가지는 물체의 이동을 구현하는 과제를 설명할 것이다.
OpenGL Tranformation Functions
3D좌표계 상에서 동차 좌표계를 사용하기 때문에 CTM은 4*4 행렬이다._
이때 (x, y, z)만큼 translate 하려면
이런 형태의 4_4 행렬을 곱해주어야 한다.
마찬가지로 회전, 확대 등등에서도 각 변환에 맞는 4*4 행렬을 곱해주어야 한다.
편리하게도 OpenGL의 라이브러리 함수를 사용하면 4*4 행렬을 만들지 않고 해당 parameter만큼 원하는 변환을 할 수 있다.
glLoadIdentity()
CTM을 초기화하는 함수.glMultMatrixf(M.T)
CTM에 matrix M을 곱해주는 함수 M.T (Transpose)를 곱해주어야 함.glScalef(x, y, z)
x, y, z만큼 크기를 변환하는 함수glRotatef(angle, x, y, z)
x축 회전은 glRotatef(angle,1,0,0) 이렇게glTranslatef(x, y, z)
x, y, z만큼 위치를 이동하는 함수
당연히 그래픽스 과목을 수강할 때는 해당 라이브러리 함수뿐만 아니라, 해당 함수를 4*4 행렬로 나타 낼 수 있어야 한다.
'Computer Graphics' 카테고리의 다른 글
[그래픽스] #5 Hierarchical Modeling (1) | 2019.12.07 |
---|---|
[그래픽스] #3 OpenGL - 아핀변환, 동차좌표계 (0) | 2019.12.07 |
[그래픽스] #2 OpenGL - Polygon그리기 (0) | 2019.12.07 |
[그래픽스] #1 모듈 설명 및 설치 (0) | 2019.12.07 |
[그래픽스] #0 Intro (0) | 2019.12.07 |
최근댓글