[DirectX12]

게임수학 5. 좌표계 변환 행렬

럭키🍀 2022. 8. 3. 21:43

게임내에서 명시적으로 Scale, Rotation, Translation이 변할 경우 행렬로 연산하는 방법을 알아봤다. 

그런데 실제로 물체는 가만히 있고 좌표계가 변환되어서 벡터의 값이 변하는 경우도 있다.

 

좌표계 변환은 총 5단계에 걸쳐 일어난다.

로컬 스페이스라고 물체가 원래 모델링 되던 공간에서 인게임의 월드 좌표로 변환이 되고

인게임 세상을 배치한 다음에 카메라가 바라보고 있는 카메라 좌표계로 다시 변환이 된 후 

이걸 납작하게 투영좌표계로 변환 한 다음에 최종적으로 스크린 좌표계로 변환한다.

 

이 단계들을 이해하기 위해 오늘은 좌표계 변환에 사용되는 만능 공식, 좌표계 변환 행렬에 대해서 알아볼 것이다.

 

2차원의 좌표계 A가 있고 이 좌표계를 기준으로 M(x,y)이라는 점이 있다.

그리고 이 좌표계를 기준으로한 단위벡터 →u, →v이 있다. 즉, →u 은 x축 방향으로 1만큼 가면 (1,0), →v는 y축 방향으로 1만큼 가면 (0,1)이된다.

→AM은 x(→u) + y(→v)의 결과와 같다. →u 방향으로 x만큼 , →v방향으로 y만큼 이동한 점이 M이다.

 

 

그런데 어떤 이유에서 좌표 M은 변하지 않고 좌표계가 변하는 상황이 있다고 가정해보자. 원점이 A의 기준이였는데 B점이 새로운 원점이 되고 x축, y축도 기울게 되었다.

예를들어 A가 월드 상의 좌표계였는데 B가 카메라의 위치라고 하자. 그러면 카메라가 바라보는 위치를 기준으로 물체를 그려야한다. 그래서 좌표계의 변환이 일어나는 것이다.

 

좌표계가 편함으로써 새로운 B좌표계를 기준으로한 단위벡터→U, →V도 나오게 된다. 이때 새로운 좌표에서 M의 위치는 어떻게 표현 될까가 관심 사항이다.

M은 B좌표계 기준 대문자X, 대문자 Y만큼 떨어져있어서 →BM은 X(→U) + Y(→V)의 결과와 같다.

 →BM을 기존에 알고있던   →AM을 가지고 어떻게 구할 것인지 생각해보자.

A에서는 (x,y)였던 점이 B좌표계(X,Y)에서는 어떤 값일지 구하는 행렬을 유도하는 것이 목표이다.

개념적으로는 B기준에서 해석한 A를 M에다가 대입하면 될 것같은데 말이다.

 

우선 위는 약간 복잡해보이지만 분석하면 →AM 은 →AB+ →BM의 결과와 같다는 것에서 시작한다.

그리고 A좌표계의 단위벡터 →u, →v의 성분을 B좌표계를 기준으로 분리하면

각각 →u 는 →U방향으로 ux만큼, →V만큼 uy만큼 이동한 것이며  

→v는 →U방향으로 vx, →V방향으로 vy만큼 이동한 것이라고 설정한다.

 

*

만약 A좌표계가 원점(0, 0, 0)이면, 단위 벡터 u = [1, 0, 0], v = [0, 1, 0], w = [0, 0, 1]일 텐데

이런 기준이 되는 단위 벡터를 B좌표계의 시점에서 자신의 단위 벡터를 기준으로 표현하면

각각 U = [ux, uy, uz], V = [vx, vy, vz], W= [wx, wy, wz]라는 말이다.

 

이때 ux, uy, uz같은 성분들은 B좌표계를 기준으로 A 좌표계의 단위 벡터 u의 각각의 성분으로 표현한 값이다.

그리고 Qx, Qy, Qz는 B좌표계 중심점을 기준으로한 A좌표계의 중심점의 위치를 의미한다.

*

 

그러면 →AM을 x(→u) + y(→v)에서 (x*ux + y*vx) →U + (x*uy + y*vy) →V라고 유도할 수 있다.

→AM = →AB +→BM 에서 →AB를 좌변으로 이항하면 →AM - →AB = →BM 이 된다.

또 벡터의 특성상 -(→AB) == →BA 이므로 

→BM = →AM - →AB = →AM + →BA가 되고 여기서 →AM은 위의  x(→u) + y(→v)에서 (x*ux + y*vx) →U + (x*uy + y*vy) →V를 대입하고 →BA는 Qx( →U) + Qy( →V)라고 하면 위 식의 마지막 행처럼 나오게 된다.

 

 

참고로 →BA는 Qx( →U) + Qy( →V)라고 하는것은 왼쪽 그림처럼 B좌표계의 원점에서 A좌표계의 원점까지 B좌표계기준 Qx, Qy만큼 떨어져있다고 또 성분을 분석한 것이다.  

만약에 A좌표계와 B좌표계 사이에 위치 이동이 없고 기울기만 변하게 된다면 Qx,Qy는 0이되는 값이다.

 

 

 

 

 

하여튼 위 공식을 적용하기 위해 행렬 연산을 유도해보면 아래와 같이 정리할 수 있다.

 

A좌표계 기준으로 한 점에 있던걸 벡터 →v로 표현했는데 여기에  행렬 M을 곱하면 B좌표계 기준의 위치 벡터 →V를 구할 수 있게 된 것이다.

 

이 때 좌표계 변환 행렬 M을 더 분석해 보자면 각각 첫번째 행은 right벡터(x축), 두번째 행은 up벡터(y축), 세번째 행은 look벡터(z축)이 된다. 즉, 캐릭터를 앞으로 이동시키기 위해 앞으로 가는 방향을 구할 때는 룩 벡터값(wx, wy, wz)만 가져와도 된다.

 

 벡터 →v의 마지막 성분이 1일 수도 있고 0일 수도 있는데 이는 결과에 Qx, Qy, Qz값을 더하거나 더하지 않게되는데 영향을 미치게된다. 그리고 값을 더한다는것은 이동변환이 있었다는 의미이다.

 만약 왼쪽처럼 마지막 성분이 0이라면 이동변환이 없었으므로 A좌표계에서 B좌표계로 변환할 때 회전만 이루어졌다는 뜻이 된다.

그래서 만약 그림처럼 한점이 A좌표계 기준 (1,1)인 지점이엇다면 B좌표계(약 45도 기울어짐)로 대략 (√2,0) 이 될 것이라고 예상 할 수 있다.

 

그리고 위 그림처럼 좌표계 변환 행렬 M의 성분을 외우면 편리하다!

세 행은 각각 B좌표계 기준으로 A좌표계의 x,y,z축 단위 벡터들의 성분을 분석한 것들이고 마지막 행은 이동에 관련된것으로 B좌표게 기준 A좌표계 원점의 좌표라고!