최상단 광고

2012년 4월 9일 월요일

[펌] 탄젠트 공간


0. 들어가며
드디어 게으름을 떨치고 tangent space 에 대해서 정리해 봅니다.
이사도 했고 좀 더 여유가 생길 것 같습니다. 이제 좀 열심히 해 볼까 합니다.
픽셀 당 조명을 다루면서 탄젠트 공간에 대해 다루겠다고 이야기했었습니다.
저도 잘 모르지만 한 번 정리해 보도록 하겠습니다.
1. What is tangent space?
만약 우리가 구(sphere)인 메시를 가지고 있고 각 정점의 법선을 알고 있다고 할 때, 이것을 (텍스처) 평면상에 펼친다면 어떨까요. 각 점에서는 수직인 벡터들이었지만 평면에서 볼때는 위쪽을 가리키지 않고 서로 다른 방향을 가리키게 될 것입니다.

하지만 일관성을 위해서 평면으로 펼친 모든 normal 벡터가 위쪽을 바라보게 만든다면 어떻게 될까요. 그렇게 되면 각 점의 normal 벡터를 수직축으로 하는 좌표계가 생성이 됩니다.
normal(법선) 벡터는 어떠한 면에 수직인 벡터이며, bi-normal(종법선) 벡터는 이 normal 에 수직인 벡터입니다. 어떤 벡터 A, B, N 이 있을 때 T X B = N 인 관계의 두 벡터 A, B 를 접선이라고 합니다. X 는 외적기호구요. 이때 B 를 bi-normal 이라고 하면 T 를 tangent 라고 할 수 있습니다. 즉 T 와 B 는 같은 평면상에 존재하는 벡터라는 것을 알 수 있습니다.
즉 tangent space 라는 것은 오브젝트 공간에 있는 어떤 점의 normal 을 수직축으로 하는 공간이라고 할 수 있습니다.
탄젠트 공간을 개념도로 표현해 보면 아래와 같습니다.

A 라는 그림이 그려진 텍스처를 메시에 입혔을 때, 어떤 텍셀의 normal N 은 U 및 V 방향의 벡터와 위와 같은 관계를 가집니다. 이 그림을 보면 외적( Cross )을 연상하실 수 있을 것입니다. 위의 tangent space 에서는 normal 이 항상 점에 있어서 수직인 방향( y )을 가리킨다고 언급했습니다. 관계를 나타내자면 U X V = N 입니다. 위에서 접선을 언급했는데 U 나 V 가 T 나 B 의 역할을 하게 되는 것입니다.
2. How to calculate tangent space
이제 실제로 이를 계산하는 방법에 대해서 살펴 보도록 하겠습니다. 우리는 오브젝트 공간에서 XYZ 를 축으로 하는 좌표계를 생성합니다. 하지만 위에서 언급했듯이 텍스처 공간에서는 이를 UVN 을 축으로 하는 좌표계로 변환하게 됩니다.
2.1. Plane equation
오브젝트 공간에 어떤 삼각형이 있다고 가정합니다. 그 삼각형의 한 점 Q( px, py, pz ) 가 있고 P0( x0, y0, z0 ) 라는 점의 좌표를 안다고 가정합니다. 그리고 N( a, b, c ) 를 안다고 가정합니다.

Q -> P0 를 P' 라고 할 때, P' 와 N 은 수직입니다. 이것이 의미하는 바는 둘을 내적한 결과가 0 이 나온다는 것입니다. 그렇다면 다음과 같은 평면 방정식을 유도할 수 있습니다.
dot( P', N ) = 0 -------------------------------- 1)
p' = ( ( x0 - x ), ( y0 - y ), ( z0 - z ) ) -------------------------------- 2)
N = ( a, b, c ) -------------------------------- 3)
dot( P', N ) = ( x0 - x )a + ( y0 - y )b + ( z0 - z )c -------------------------------- 2), 3) 에 의해
-( ax + by + cz ) + ( ax0 + by0 + cz0 ) = 0 -------------------------------- 1) 에 의해
ax + by + cz - ( ax0 + by0 + cz0 ) = 0 -------------------------------- 양변에 -1 곱함
a, b, c, x0, y0, z0 을 알고 있으므로 - ( ax0 + by0 + cz0 ) 은 상수이며 이를 D라 표현합니다.
ax + by + cz + D = 0 --------------------------------- 결론)
이 평면 방정식은 오브젝트 공간의 XYZ 축을 이용해 평면 위에서의 어떤 점의 좌표를 표현한 것입니다.
'평면' 이라는 단어를 통해서 약간이 느낌이 오실 겁니다. 우리는 오브젝트 공간의 어떤 벡터( normal )를 탄젠트(텍스처) 공간으로 옮기려고 하고 있습니다. 그렇다면 XYZ 관계 축으로 구성된 공간을 UNV 관계 축으로 구성된 공간으로 표현해야 한다는 것을 알 수 있습니다.
2.2. Drive a 3x3 matrix for tangent space
이제 개념적으로 탄젠트 공간이라는 것이 대충 이해가 가실테지만 문제는 여기부터입니다. 우리는 텍스처( normal map ) 에 normal 을 저장하게 됩니다. 이 때 그 값을 기울기( gradient )라는 용어로 표현을 많이 합니다. 기울기값은 당연히 오브젝트 공간의 normal 을 탄젠트 공간의 normal 로 저장한 값을 의미합니다.

위의 그림에서 P 는 오브젝트 공간에서의 정점이며, C 는 각 정점에 해당하는 텍스처 공간의 점들이라고 가정합시다.
다음과 같은 전제를 해 보겠습니다.
E0 : C0 에서 C1 으로 가는 벡터, 모서리 0
E1 : C0 에서 C2 로 가는 벡터, 모서리 1
우리가 위에서 계속 이야기한 것은 바로 y 축이 항상 위쪽을 바라보고 있다는 것입니다. 즉 y 값을 알고 있다는 것이죠. 그렇다면 E0 과 E1 을 사용하여 외적 계산을 하면 점 C0 의 노멀 벡터, 즉 Y 축 방향 벡터를 구할 수 있어야 함을 의미합니다.
E0 를 ( E0.u, E0.y, E0.v ) 라고 가정한다
E1 을 ( E1.u, E1.y, E1.v ) 라고 가정한다.

댓글 없음: