좌표계 변환
좌표계의 축, 즉 기저를 x, y, z 라 할 때 한 지점 p 의 좌표 표현 (px,py,pz) 은 아래와 같이 쓸 수 있습니다.
⎣⎢⎡ x y z ⎦⎥⎤⎣⎢⎡pxpypz⎦⎥⎤=p
공간상의 지점 p 는 그 위치는 변하지 않고 좌표축에 따라 좌표 표현이 달라집니다. 새로운 좌표계의 축을 u, v, w 이라 할 때 아래와 같이 쓸 수 있습니다.
⎣⎢⎡ u v w ⎦⎥⎤⎣⎢⎡pupvpw⎦⎥⎤=⎣⎢⎡ x y z ⎦⎥⎤⎣⎢⎡pxpypz⎦⎥⎤=p
만약 좌표축 x, y, z 에 대한 좌표 표현 px, py, pz 로 부터 좌표축 u, v, w 에 대한 좌표 표현 pu, pv, pw 를 얻고자 한다면 행렬 ⎣⎢⎡ u v w ⎦⎥⎤ 의 역행렬을 이용합니다.
⎣⎢⎡pupvpw⎦⎥⎤=⎣⎢⎡ u v w ⎦⎥⎤−1⎣⎢⎡ x y z ⎦⎥⎤⎣⎢⎡pxpypz⎦⎥⎤
이 때 행렬 U=⎣⎢⎡ u v w ⎦⎥⎤ 의 열벡터들은 좌표축, 즉 직교기저이고 각 열벡터를 정규화(normalized) 한다면 U−1=UT 이 성립합니다.
카메라 좌표계 유도
물체의 위치를 표현할 때 기준으로 삼는 좌표계를 월드 좌표계라 합니다. 가장 흔하게는 x=(1,0,0), y=(0,1,0), z=(0,0,1) 을 축으로 가지고 행렬로 ⎣⎢⎡100010001⎦⎥⎤ 로 표현할 수 있는 좌표계가 있습니다.
카메라 좌표계는 카메라의 초점을 기준으로 하는 좌표계입니다. 카메라의 초점이 원점이 되고 이에 대해 물체의 좌표 표현이 정해집니다. 카메라 좌표계의 z 축의 방향은 사람의 눈이 모니터를 바라보는 방향과 같습니다. 아래 그림은 월드 좌표계의 축 xw, yw, zw 과 카메라 좌표계의 축 xc, yc, zc, 물체의 위치 P 를 보여주고 있습니다. 카메라 좌표계의 축 xc, yc, zc 은 월드 좌표계 상 표현되는 단위 벡터입니다.
월드 좌표계상 물체의 위치 Pw 가 카메라를 기준으로 어떤 위치에 놓이는지를 생각하면 좌표계 변환의 이해가 쉽습니다. 월드 좌표계의 원점을 Ow 라 하고 월드 좌표계상 카메라의 위치를 Cw 라 할 때 아래 그림은 물체의 위치를 −OwCw 만큼 이동시킨 결과 입니다.
이후 월드 좌표계의 축을 아래와 같이 카메라 좌표계의 각 축의 방향과 일치하도록 회전시키면 물체의 좌표는 카메라 좌표계상 위치 Pc 가 됩니다.
카메라 좌표계 변환은 간단하게 한번의 평행이동과 회전으로 이루어 집니다. 이제 위의 과정을 하나의 행렬식으로 표현해 보겠습니다. 카메라 좌표축을 행렬 C 라 하고 월드 좌표계를 행렬 W 라 하면 다음이 항상 성립합니다.
CPc=WPw
간단하게 아래와 같이 카메라 좌표축의 역행렬을 양변에 곱해 물체의 카메라 좌표상 위치를 구할 수 있다고 착각할 수 있습니다.
Pc=C−1WPw
우리가 간과한 것은 행렬 C 와 W 가 열벡터로 가지고 있는 좌표축이 벡터일 뿐이고 벡터의 시작점, 즉 원점에 대한 정보는 가지고 있지 않다는 것입니다. 원점을 고려하지 않았으므로 위 식은 카메라의 위치가 월드 좌표계의 원점일 때만 성립합니다. 카메라 좌표계 변환을 적용하기 위해서 월드 좌표계에 대한 물체의 위치를 −OwCw 만큼 평행이동시켜 줍니다. 평행이동을 위해 4벡터 행렬을 이용하겠습니다.
CPc=W⎣⎢⎢⎢⎡100001000010−cx−cy−cz1⎦⎥⎥⎥⎤Pw
물체의 위치를 −OwCw 만큼 평행이동 시킨 것은 카메라 위치를 월드 좌표계의 원점으로 이동시킨 것과 같습니다. 따라서 평행이동한 물체의 위치에 대해 C−1 을 곱하면 물체의 카메라 좌표상 위치를 알 수 있습니다.
Pc=C−1W⎣⎢⎢⎢⎡100001000010−cx−cy−cz1⎦⎥⎥⎥⎤Pw
C−1=CT 이므로 아래와 같이 다시 쓸 수 있습니다.
Pc=CTW⎣⎢⎢⎢⎡100001000010−cx−cy−cz1⎦⎥⎥⎥⎤Pw=⎣⎢⎢⎢⎡ 0xcyczc0 00001⎦⎥⎥⎥⎤⎣⎢⎢⎢⎡1000010000100001⎦⎥⎥⎥⎤⎣⎢⎢⎢⎡100001000010−cx−cy−cz1⎦⎥⎥⎥⎤Pw=⎣⎢⎢⎢⎡ 0xcyczc0 00001⎦⎥⎥⎥⎤⎣⎢⎢⎢⎡100001000010−cx−cy−cz1⎦⎥⎥⎥⎤Pw
예시로 월드 좌표계 위의 점 P(1,2,3) 을 카메라 좌표계로 변환해 보겠습니다. 카메라의 위치는 C(4,1,1) 이라 하고 카메라 좌표축은 xc=(0,1,0), yc=(0,0,−1), zc=(−1,0,0) 이라 하겠습니다.
카메라 좌표계 변환 행렬식에 대입하면 다음과 같습니다. 행렬 T 는 평행이동 행렬입니다.
Pc=C−1TPw=⎣⎢⎢⎢⎡00−1010000−1000001⎦⎥⎥⎥⎤⎣⎢⎢⎢⎡100001000010−4−1−11⎦⎥⎥⎥⎤⎣⎢⎢⎢⎡1231⎦⎥⎥⎥⎤=⎣⎢⎢⎢⎡00−1010000−1000001⎦⎥⎥⎥⎤⎣⎢⎢⎢⎡−3121⎦⎥⎥⎥⎤=⎣⎢⎢⎢⎡1−231⎦⎥⎥⎥⎤
카메라 좌표계 축
월드 좌표계 상 카메라의 위치는 주어지는 정보입니다. 하지만 카메라 좌표축은 카메라의 위치와 카메라가 바라보는 지점 (focus)를 고려해 직접 찾아야 합니다. focus 는 게임 캐릭터가 바라보는 방향(1인칭 시점), 공중에서 캐릭터를 바라보는 방향 등 (전지적 시점) 정하기 나름입니다. 이 글에서는 편의상 물체 P 의 위치를 focus 라 하겠습니다. zc 축은 카메라가 focus 를 바라보는 방향, 즉 CP 입니다.
카메라가 아래 그림과 같이 좌우로 기울어지지 않고 focus 를 바라본다고 하겠습니다.
이 때 카메라 좌표축 중 xc 축은 카메라 좌표축 zc 와 월드 좌표축 zw 의 외적 zc×zw 입니다. 벡터 zc 의 시작점을 월드 좌표계 상 원점에 가져다 놓고 오른손 법칙을 쓰면 쉽게 이해할 수 있습니다. 만약 카메라가 좌우로 기울어졌다면 벡터 xc 를 zc 를 축으로 원하는 각도만큼 회전시키면 됩니다. 이는 로드리게스 회전 또는 쿼터니언 회전으로 구현할 수 있습니다.
yc 축은 zc×xc 입니다. 모든 축을 정규화 시켜 아래 식에 대입하면 카메라 좌표계 변환을 위한 식이 완성됩니다.
Pc=⎣⎢⎢⎢⎡ 0xcyczc0 00001⎦⎥⎥⎥⎤⎣⎢⎢⎢⎡100001000010−cx−cy−cz1⎦⎥⎥⎥⎤Pw
출처 및 참고