벡터 공간 -> 변환을 배운 것처럼
아핀 공간 -> 변환을 배워보자.
우리가 실제로 게임에서 다룰 모델들은 아핀 공간에 존재한다.
왜 벡터가 아니라 아핀 공간에서 다루느냐?
아핀 공간에는 방향과 크기만 존재하는 것이 아니라 "위치"라는 것이 존재한다.
게임에서 역시 "위치"란 것에 벗어날 수 없기에 실제로 사용을 하려면 아핀 변환이 필요하다.
알아보자
우리는 선형변환 - 크기 변환, 방향 변환을 배웠다.
아핀 공간에서는 어떻게 적용된다는 말일까?
어떤 모델이든 아핀 공간에 있는 모델들은 점들의 집합이라고 했다.
그 점들이 어떤 식으로 있느냐가 모델을 만든다고 했다.
++Vertex가 모여 모델을 이룬다.
** 점들의 개수에 따라 모델의 질이 달라진다.
그 점 중에서도 모델을 위치시키기 위해서 다른 점이 하나 더 필요하다.
바로 중심점이라는 것이다.
중심점을 기준으로 나머지 점의 위치를 상대적으로 표현한다.
이 큐브에서는 중심점을 원점에 위치해 놓았다.
원점에서 각 점으로 향하는 8개의 벡터가 있다고 하자.
만약 크기를 어떤 축으로 늘리고 싶다...?
그러면 8개의 벡터에 해당 축에 해당하는 크기 변환 행렬을 적용한다.
그렇게 되면 8개 벡터에 대한 새로운 벡터가 나오고
다시 벡터의 끝 점이 원점의 기준에 의해 바뀔 것이다.
그럼 이러한 큐브를 만들어낼 수 있다.
++ x축을 2배로 늘렸다.
벡터를 크기 변환한 것이 점을 크기 변환한 것 같이 된 것이다.
모델의 중심점이 원점에 있을 때
모델의 크기 변환은 모델을 이루는 점들을 벡터처럼 생각하고 적용하면 그렇게 된다.
회전변환도 동일하게 벡터에다 회전 변환을 적용하면 점이 회전한 것처럼 보이게 된다.
아니.. 근데 중심점이 원점이라는 보장이 어딨냐????
라고 생각할 수 있다.
맞다. 중심점이 어떻게 맨날 원점이겠나
중심이 원점이 아닌채로 회전을 하면 어떻게 나오는데??
이렇게 나온다.
뭐야?? 완전 다르잖아??
만약 크기변환도 원점이 아니라면???
아 뭐야
엄청 다르잖아
다시 말해서, 아핀 공간에 존재하는 모델의 크기, 방향 변환할 때
중심점의 위치에 따라 달라진 결과를 보였다.
**아핀 공간에서 변환할 때 쓰인 벡터들을 우리는 선형변환하여 점을 변환하는 것처럼 썼지만
중심점이 원점이 아니면 결과가 달라졌다.
어떻게 해야할까??
즉, 원하는 결과를 얻으려면 모델을 변환 이전이든 이후든 위치를 옮겨서 변환시킬 필요가 있다는 것이다.
-> 이것이 바로 위치 변환이다.
??? 위치 변환이 뭔데??
위치 변환은 간단하다.
단순히 어떤 점을 옮긴다고 생각하면 된다.
점 P를 D 만큼 옮긴다고 하자.
P'의 위치는 정말 자명하게도 저렇게 계산이 가능하다.
열벡터를 사용한다면(행렬)
이렇게 나타낼 수 있다.
당연한 말을 하는 것 같지만
맞다.
더 중요한 사실이 있다.
사실 위치변환은 선형변환이 아니다!!
때문에 선형 변환이 아니기 때문에 행렬의 곱셈으로 표현할 수 없어서
다른 변환들과의 조합을 이루지는 못한다.
선형성이 깨지기 때문이다.
M이 선형 변환 조합이라면 A는 위치 변환이다.
뭔가 덧셈이 맘에 들지 않을 수 있다.
사실 변환이란게 하나의 변환으로 조합을 해서 간단하고 연산의 수도 적어지게 하는 것이 목적이었는데..?
위치변환이란 놈이 끼어들어서 망쳐버렸다.
위치변환의 된 것에 다시 변환을 적용한다고 생각해보자.
항이 몇개가 될 것 같나??
무지하게 많아진다.
이것은 간단하지도 않고 복잡하기만한 연산이다.
** 만약 행렬의 곱셈으로 표현된다면 항의 수가 많아지지는 않을텐데 라고 생각하면 굿굿
그래서 위치변환도 행렬의 곱셈으로 표현하고자 한다.
++ 아까 안된다고 했잖아???
-> 사실 가능하다. 다만 현재 공간에서 차원을 하나 더 늘려야 한다.
이것이 무슨소리냐??
우리는 3차원밖에 못알아들으니까.
설명하기 위해서
2차원을 3차원으로 늘리는 것으로 예를 들어보자
위에 보여주는 면(2차원)은 z = 1인 평면이다.
점 P들은 z=1 평면 상에 있는 점들이다.
그래서 x,y 평면 상의 점같지만 실제로는 z=1값을 가지고 공간에 있는 점이다.
이 점들을 원점에서 각 점들로 향하는 벡터들처럼 생각해보자
그리고 열벡터 행렬로 만들어보자
P에서 P'로 어떻게 가느냐??
++ T라는 행렬을 곱하면 그렇게 된다고 하자.
그래서 풀어보면??
아니.. 미지수가 이렇게 많네 ㅎ
하지만 항들을 살펴보자 어떻게 해야 우항의 값을 가질지 생각해보자
첫 번째 줄만 봐도
Px는 살리고 Py는 죽이고 상수 살리고
오...
나머지도 이렇게 구하면 된다.
결국 우리가 위치변환을 행렬로 구하기 위해 한 T 행렬을 구해버렸다.
이 변환은 3차원 공간의 선형 변환 중 밀기 변환(shearing)이라고 한다고 한다.
-> 한 축의 값을 다른 축의 값에 비례해서 변환하는 것
??? 뭔소리래 ?????
이것도 2차원으로 줄여서 생각해보자
이게 밀기 변환이라는데..?
x성분 값을 y성분에 비례 계수 m을 곱한 것을 더해서 변환하는 것을 말한다고 한다.
그럼 다시 3차원으로 돌아가서
x,y,z 축 중 한 축을 기준으로 그 축의 성분 값과 비례해서 남은 두 개의 축을 변환하는거구나..? 라고 생각할 수 있다.
예를 보면 이건 z 축 고정이구나 생각할 것이다.
아.. 이게 T랑 같다고???
행렬의 곱으로 나타내면 진짜 같아보인다.
??? T에는 저런거 없는데???
**우리가 z = 1 로한 이유가 있다.
z에 1을 대입해보자
T가 나와부렀다.
우리는 분명 평면 상에서의 이동(2차원)을 했지만
이는 3차원 공간으로 확장한 것과 같아졌다.
** 2차원 공간의 위치 변환 = 3차원 공간의 밀기 변환
그럼.. 3차원 공간의 위치 변환은 4차원 공간의 밀기 변환이 되는 것인가??
맞다.
결국 우리는 3D에서 위치 변환을 다뤄야 한다.
앞의 2차원으로 한 것은 그냥 이해하기 쉬우라고 했다.
그럼.. z = 1이라는 고정값을 두어서 2차원으로 바꾼 것처럼
4차원 할 때도 그냥 고정값 1 추가시켜도 되는건가??
그렇다.
해보자
4번째 값은 1로 고정을 해두고 위치 변환을 생각해보자.
우리는 이미 연산을 앞에서 해서 알다시피
위와 같은 결과가 나올 것을 안다.
역시 위치 변환이 행렬의 곱으로 나타내졌다.
우리는 이제부터 위치 변환도 행렬의 곱으로 표현할 수 있게 되었다.
-> 즉, 다른 선형 변환과 조합이 가능해졌다.
하지만 위치 변환이 4차원, 4 by 4 matrix가 되어버렸으니까
연산을 위해서는 다른 선형 변환들도 4차원으로 바꿔주어야 연산이 가능해진다.
** 이렇게 3차원 공간의 아핀 변환을 4차원 공간의 선형 변환 행렬로 만들었다.
이를 아핀 변환 행렬이라고 부른다.
산 넘어 산이긴 한데...
다 왔다.
다 비슷비슷해서 쉽게 이해가 된다.
먼저 크기 변환, Scale
뭐 이건 예상했던 대로..ㅎ
다음은 회전 변환, Rotation
딱히 다를게 없다.
뭐 다른 선형 변환들도 이렇게 확장해서 아핀 변환 행렬로 나타낼 수 있다.
와... 이제 정말 우리가 위치를 가지고도 변환할 수 있구나!! 라고 생각할 수 있다.
이렇게 길게 설명하면 앞에 것 까먹는다.
이쯤해두고 요약하고 다음 글에서 이용해보자
-3차원 공간은 아핀 공간이다.
-점들을 변환하는 것은 아핀 변환이다.
-점을 변환할 때 점 자체를 변환하지 않고 원점에서 그 점을 향하는 벡터를 선형 변환한다.
-그 값이 점을 변환한 값과 같아진다.
- 모든 아핀 변환은 차원이 하나 확장된 공간의 선형 변환으로 바꿀 수 있다.
-아핀 변환 행렬을 적용하려면 차원을 하나 확장해야 한다. (x,y,z,w) (단 w = 1)
-행렬의 결과에서 (x,y,z,w) 중 w를 빼면 변환이 적용된 (x,y,z)가 나온다.
다음에 더 자세히 알아보자
'Game Development, 게임개발 > 게임 수학,물리' 카테고리의 다른 글
게임 물리 - 라디안의 이용 (0) | 2021.08.19 |
---|---|
게임 물리 - 등속 직선 운동 (0) | 2021.08.19 |
아핀 공간, Affine Space - 3 [게임수학] (0) | 2021.04.01 |
아핀 공간, Affine Space - 2 [게임수학] (0) | 2021.03.31 |
아핀 공간, Affine Space [게임수학] (0) | 2021.03.31 |