본문 바로가기

컴퓨터 그래픽스

컴퓨터 그래픽스 기초 - Vertex representation, Affine transform([KUOCW] 한정현 교수님 강의)

이 포스팅은 [KUOCW] 한정현 교수님 강의 3장 - 모델링, 4장 - 좌표계와 변환 내용 중 중요하다 생각한 부분을 정리했습니다.

선형대수학의 기초적인 지식이 요구됩니다.

1장 - 서론과 2장 - 수학기초는 넘어가겠습니다.


3강

  • Polygon Mesh

함수로 나타낸 구체(왼쪽)와 Polygon mesh로 나타낸 구체(오른쪽)

위의 사진은 구체를 나타내는 두 가지 표현법을 보여줍니다. 왼쪽은 함수를 이용해 나타낸 Implicit representation이고, 오른쪽은 polygon mesh로 나타낸 Explicit representation입니다. 이 중에서 컴퓨터 그래픽스에서는 polygon mesh를 사용하는데, 그 이유는 GPU가 polygon mesh를 사용하는데 최적화 되어있기 때문입니다.

 

또한 삼각형의 mesh가 가장 많이 사용되는 형태의 mesh이며, 보통 꼭지점(vertices)들의 갯수의 약 두 배에 해당하는 삼각형 mesh가 있습니다. OpenGL에서는 삼각형 mesh만 지원하므로 다른 툴에서(Maya, 3Dmax) 사각형 같은 mesh를 사용해서 만든 polygon의 경우 삼격형 mesh로의 변환이 필요합니다.

Levels of detail

그리고, 위와 같이 얼마나 많은 mesh를 이용해 object(여기서 구체나 주전자, 보통은 특정 물체를 뜻합니다.)를 나타내냐는 Levels of detail, LOD라는 말로 표현되고, mesh가 많이지는 것을 refinement, 반대로 적어지는 것을 simplicfication이라고 합니다. object는 refinement할수록 resolution(해상도)가 높다고 말하고 실제의 object와 비슷해지지만 계산량이 증가합니다. 이렇듯, refinement와 simplicfication은 trade off 관계에 있습니다.


polygon 정보를 담는 법

polygon mesh로 나타낸 explicit representation법은 위의 그림에 오른쪽같이 array에 정보가 담깁니다. 왼쪽같이 표현하지 않는 이유는 vertex정보에는 사진에 나온 좌표 말고도 더 많은 정보가 들어가야해서 많은 bit가 요구되기 때문에 오른쪽 같이 index array를 사용해 겹치는 vertex를 나타내는 것이 효율적이기 때문입니다.


 

  • Surface Normal

Surfuce Normal

Surface Normal은 어떤 mesh에 표면에 수직이되는 Normal Vector입니다. 위의 사진같이 외적으로 나타내지며, 그 중간과 오른쪽에 나타난거 같이 나열된 vertex의 순서에 따라 그 방향이 바뀝니다. 컴퓨터 그래픽스에서는 이 Normal Vector의 방향이 object의 바깥쪽을 향하는 것이 원칙으로 되어있습니다.  

 

  • Vertex Normal

Surface Normal과 달리 Vertex Normal은 구하기가 쉽지 않은데요. 컴퓨터 그래픽스에서는 해당 vertex를 공유하는 mesh의 Surface Normal의 평균으로 Vertex Normal을 정의합니다. 이 Vertex Normal은 Vertex를 나타내는 정보로써 반드시 들어가야하는 정보에 해당합니다.

Vertex Normal

 


4강

  • Scaling and Rotation

선형대수학을 배우셨다면 행렬을 통한 Scaling과 Rotation을 아실텐데요. 강의에서 나온 아래 그림에 수식과 예시가 잘 되어있어 언급만 하고 넘어가겠습니다. 이 두 가지 개념은 object를 변환할때 쓰이는 개념으로 Linear transform에 해당합니다.

2D에서의 scaling과 rotation

  • Translation

덧셈으로 나타낸 Translation

Translation은 위와 같이 object를 자른 위치로 옮길 때 사용하는 변환입니다. 이는 Linear transform이 아니기 때문에 행렬 연산으로 표현할 수 없지만, homogenous coordinate을 이용하여 임의의 한 축을 추가 해주는 방법으로 아래 그림과 같이 Translation 연산도 행렬로 나타냅니다.

행렬 곱으로 나타낸 Translation

이렇게 homogenous coordinate을 사용해도 Scaling과 Rotation 또한 3x3 행렬에 모두 아래와 같이 표현 가능합니다.

homogenous coordinate을 사용한 Scaling과 Rotation


 

  • Affine transform

위에 언급한 Scaling과 Rotation 그리고 Translation을 모두 합쳐 Affine transform이라고 지칭합니다. Scaling과 Rotation 그리고 Translation은 위에서 나타낸 homogenous coordinate을 이용한 3x3행렬로 합쳐질 수 있습니다. 아래의 그림은 Rotation과 Translation이 하나의 3x3행렬로 나타내 질 수 있음을 보여줍니다. 이때 나중에 나온 변환이 행렬 연산 특성상 왼쪽에 붙게 되는 것을 알 수 있습니다.

하나의 3x3행렬로 나타낸 Affine transform 연산들

또한 행렬 연산의 특성상 특수한 경우가 아닌 경우 AB == BA가 잘 성립하지 않습니다. 따라서 보통의 경우 Affine transform 연산또한 그 순서가 바뀌면 일치하지 않습니다. 아래의 경우도 TR != RT 입니다. 그리고 Rotation과 Translation만을 이용한 연산을 rigid motion이라고 합니다. 이때 rigid는 "강체"라는 뜻으로 그 부피가 변하지 않음을 뜻한다고 보면 될거 같습니다.


 

  • 3D affine transform

3D에서의 Scaling과 Translation

3D에서의 Scaling과 Translation은 위와 같이 2D에서와 매우 유사한 형태를 보여줍니다. 하지만 rotation은 그 축에 따라 회전하는 방향이 바뀌게됩니다. z축으로 회전하는 변환 행렬은 2D 변환과 비슷하지만 다른 축으로의 회전 변환은 아래와 같이 표현 됩니다. 그 개념은 같지만 표현되는 모양이 다른 것이죠. 아래 그림을 보면 y축으로의 회전변환 행렬은 초록색 박스으로 x축으로의 회전변환 행렬은 빨간색 박스로 나타난 것을 확인 할 수 있습니다.

y축으로의 회전 변환(위)과 x축으로의 회전 변환(아래)

2D에서와 같이 3D에서도 역시 Affine transform은 아래와 같이 하나의 4x4 행렬에 나타낼 수 있고 변환의 순서를 바꾸게 되면 보통 일치하지 않습니다. 아래 그림은 아까와 같이 Rotation과 Translation의 변환 행렬을 하나로 합쳐서 계산해도(맨 아랫줄) 따로따로 했을 때와 그 값이 같다는 것을 보여줍니다.

하나의 4x4행렬로 나타낸 3D Affine transform 연산들

또 다른 표기는 4x4 Affine transform 행렬에서 아래 그림에 빨간색으로 표시된 3x3 행렬을 Linear transform을 뜻하는 L행렬 그리고 파란색 1x3행렬은 Translation을 뜻하는 t행렬로 나타냅니다. 이때 맨 마지막은 homogenous coordinate을 사용하기 위해 임의로 추가한 행이므로 제외합니다.

 


 

  • World space(월드 좌표계)와 Object space(물체 좌표계)

지금까지의 변환행렬은 Object space(물체 좌표계)에서 일어난 일이였습니다. 즉 각 물체에 대한 좌표계의 변환이였습니다. 하지만 우리는 한 물체만이 아니라 여러물체를 이용한 더 복합적인 작업을 목표로 해야하죠. 그래서 알아야 하는 개념은 World space(월드 좌표계)입니다. 지금까지의 변환 행렬을 설명하면서 든 예시에서는 Object space 기준이였죠. 어떤 변환을 통해서든 Object가 움직이는 것에 따라 좌표계 또한 변환되었습니다.

World space(월드 좌표계)와 Object space(물체 좌표계)

위의 그림에서는 물체들을 하나의 World space에 각각의 변환행렬을 통해 위치시킨 것이 겹치지 않게 위치시키는 것을 확인 할 수 있습니다. 이 World space는 각 object가 변환을 했다고 해서 좌표계가 같이 변화하지 않죠. 이렇게 각 object마다 좌표계가 있다는 것, 또한 World space라는 큰 좌표계가 있다는 것은 컴퓨터 그래픽스를 이해하는 큰 틀인거 같습니다.


 

  • Inverse transform

이번에는 변환 행렬의 역행렬을 알아보겠습니다. 여기서 scaling과 translation 변환는 아래의 수식과 같이 간단하게 이해될 수 있습니다. 아래 나타난 역 변환행렬은 각각의 변환행렬과 곱하면 단위 행렬인 I가 나옵니다.

Inverse translation(위)와 Inverse scaling아래

Inverse rotation은 아래 수식과 같습니다. Inverse rotation수식을 보시면 R^T, 즉 회전변환 행렬의 전치행렬이 그 역변환을 나타낸다는 것을 알 수 있습니다. 이때, 아래 그림에는 orthonoraml basis라고 나와 헷갈리실 수 있는데 회전변환 행렬은 서로 다른 column끼리 independent합나다. (설명이 없이 넘어가는데 해보니까 2D랑 3D 회전변환에 대해서는 맞습니다.) 따라서 아래와 같이 설명되는 것이죠.

Inverse rotation

회전변환 행렬의 전치행렬이 역행렬임을 이용한 특징이 있는데요. 아래 예시를 보겠습니다. 아래 그림은 주전자 object가 World space와 Object space가 일치하는 초기 상태에 있다가 R이라는 회전변환 행렬을 통해 90' 회전하는 것을 수식과 그림으로보여줍니다.

회전변환 행렬을 통해 90' 회전하는 주전자 object

이때, 위 그림 빨간 박스의 u,v 그리고 n으로 나타난 column vector를 잘 보시면 회전한 object의 좌표계가 World space에서 어디를 향해있는지 나타내는 회전한 object의 좌표계의 basis vector임을 알 수있습니다. 이는 현재 나타내고 있는 object의 좌표계가 World space의 어디를 향했는지 알 수 있으면 회전에 대한 정보를 알 수 있음을 뜻합니다. 이해를 돕기위해 약간의 풀이를 가져왔습니다. 아래와 같이 회전변환 행렬의 결과 가 있으면 그 A는 RI=A, 즉 R=A이므로 회전 변환 행렬 그 자체이고, 그 역행렬은 A의 전치행렬이죠.

당연하지만 A의 역행렬은 회전변환 행렬의 역행렬과 같습니다.

결과적으로, Object의 좌표계가 World space에서 어디를 향해있는지 알면 Object를 회전시킨 회전변환 행렬을 알 수 있고, 반대로 회전변환 행렬을 알면 Object의 좌표계가 World space에서 어디를 향할지 알 수 있습니다. 이는 x,y,z 축을 향한 회전이 아니라 다른 알기 어려운 방향으로의 회전에서 또한 적용이 됩니다.

Inverse rotation의 성질을 이용해 나타낸 Object의 좌표계와 회전 변환 행렬의 관계


 

강의에서 워낙 설명을 잘해주셔서 글로 다 전달하기가 어렵네요.

제 필력이 모자람이지만 수식도 그 풀이를 순서대로 보면서 하는것이 좋은데 텍스트로 나타내기가 쉽지 않네요.

 

읽으시고 도움이 되시길 바라겠습니다.

감사합니다.

 

References

강의: [KUOCW] 한정현 교수님 강의

https://www.youtube.com/channel/UCfyXTCv0QlZxG1S1rteGI7A

강의 자료: 한정현 교수님 연구실 홈페이지
http://media.korea.ac.kr/books/