Game Development, 게임개발/게임 수학,물리

게임수학 - 동차좌표계, Homogeneous coordinates **

게임이 더 좋아 2021. 9. 5. 19:51
반응형
728x170

//21.12.22 업데이트

 

좌표계도 많은데

동차 좌표계라는 새로운 것이 튀어나왔다.

무엇인지 알아보자

 

사실 근본적인 정의보다

우리가 어떻게 이해해야하고

왜 이렇게 사용하는지를 중점에 두고 알아보자

 


 

3차원의 좌표는 (x,y,z) 3가지 성분으로 표현된다.

하지만 동차좌표에서는 여기에 무한원점이라는 개념을 추가시킨다.

-> 무한원점의 개념이 어려우면 아래와 같이 이해하자

-> 사실 4차원의 성분이 0이면 벡터, 1이면 점이라고 설명하는 경우도 많다.(대부분)

(이 말은 3개의 성분가지고는 벡터인지 점인지 알 수 없지만 4번째 차원의 정보로 구분하겠다는 말이다.)

 

??? 근데 굳이 벡터인지 점인지 구분해야하나????

 

이는 방향파악과 변환에 중요하기 때문인데..?

** 방향과 이동변환, 투영변환을 용이하게 하는 좌표계이다.

-> 왜 유용한지 아래에서 알아보자

 

우선 임의의 3차원 상의 점이 있다고 했을 때

축소,확대 또는 회전 또는 이동에 관해서 행렬로 표현할 수 있다는 것은 알 것이다.

 

하지만 위의 모든 연산이 행렬의 곱으로써 표현되는 것은 아니다.

특히 "이동"같은 경우는 벡터(행렬)의 덧셈으로 표현되는 것이지 곱셈으로 표현할 길이 보이지 않는다.

 

하지만 동차좌표가 되었을 때는 실제 3차원에서의 이동을 행렬곱셈으로 표현할 수 있다.

예를 들면 각 축으로 t만큼의 이동을 한다면 아래와 같이 표현 가능하다.

물론 동차좌표로 변한다고 해서 회전이나 크기변환이 쓸 수 없는 것은 아니다.

 


다음으로는 투영변환에 사용된다.

 

투영변환이란 차원을 낮추는 변환을 말한다.

일반적으로 3차원이 2차원이 되는 변환을 말한다.

 

여기서 방향을 구분해야하는 필요성이 나타난다.

사실 점이 어디에 위치하는 것이 중요한 것이 아니라

해당 점이 어느 방향에 있느냐가 중요하다.

 

??? 왜...??

 

예전의 기하와 벡터에서 정사영을 공부했다면 알다시피..

투영하는 것은 실제의 모든 것을 담아내지 않는다.

원기둥을 가로로 세워서 바로 정사영면과 수직으로 빛을 내리쬔다면

사각형이 나오게 된다.

원기둥의 밑면인 원에 관한 성질은 보이지도 않는다.

 

하나 더 그림을 보고가자

과연 어차피 나에겐 하나의 점만 보이는데 저것에 대해서 계산을 해야할까..?

 

 

예를 들어서 프로젝션(투영) 변환을 거치고 정규 뷰 볼륨으로 표현이 된다면

[Unity, 유니티/Basic, 기본] - Camera, 카메라에 대한 것들 [Unity]

 

 

해당 좌표계를 이제 스크린 좌표계 혹은 윈도우 좌표계로 변환한다.

단순히 z값 (깊이)를 뺀후 스크린의 크기에 맞게 변환하는 것이다.

 

**해당 z값은 그냥 버리는 것이 아니라. 

Z-buffer에 담아서 뷰 공간에서의 심도 테스트(depth test)에 이용된다.

 

 

 

사실 앞서 클립 좌표계에의 좌표에서는 x,y,z, 말고도 w라는 값을 가지는데

** 이 w를 원근분할에 쓰인다.

 

해당 값은 카메라와의 거리에 비례하며 멀수록 커진다.

 

 

원근 분할이란

x,y,z,w를 w로 나누는 것이다.

w는 항상 나눠진 값이 w겠지만 w가 크면 x,y,z가 작고, w가 작으면 x,y,z가 커진다.

 

즉, 정규 뷰 볼륨에서 원근법 시뮬레이션을 위해 이용되었다.

 

다시 말해서

동차 좌표계는 (x,y,z,w)의 4성분을 가진 4차원 좌표지만

실제로 쓰임은 2D로 변환할 때 쓰인다고 보면 된다.

 


 

아니 그렇다면 동차좌표계를 정확히 어디다 써먹는데??

 

직교 좌표계는 유클리드 기하학에 쓰였다.

동차 좌표계는 사영기하학, Projective geometry에 쓰인다.

 

사영기하학은 또 뭐지??

예를 들어 사영기하학에서는 평행선은 무한 원점(point at infinity) 에서 교차한다고 말한다.

즉, 투영 공간은 유클리드 공간에 무한 원점 집합을 추가한 공간이다.

 

**동차 좌표계를 써먹을 때

w가 0이면 나눈 결과는 무한이 된다.

따라서 나누기를 하지 않는 한 (x,y,z,0)은 직교좌표로는 표현할 수 없는

무한원점을 동차좌표로 표현할 수 있다는 것이다.

 

또한 무한 원점은 직사광으로 이용되기도 했는데

일반적으로 점광원은 표현할 때 (x,y,z,1)로 표현했고

직사광은 (x,y,z,0)으로 표현했다.

 

앞서 말한 클립 좌표계는 동차 좌표계의 4차원 벡터로 표현되므로

이를 좌표 변환하기 위환 행렬은 4 by 4 matrix다.

하지만 실제 게임 개발에서는 딱히 이러한 개념이 쓰인다기보다 계산을 하기 용이해서 쓰곤 한다.

-> 행렬의 곱셈으로 표현하지 못하던 연산이 동차좌표계를 이용했더니 곱셈연산이 가능해졌다.

 

 

728x90
반응형
그리드형