학교에서 선형대수 관련 수업을 두개나 들었는데... 기억이 안 난다 ㅎㅎ
닉네임을 eigen으로 했는데 기술면접에서 eigen vector도 제대로 설명을 못했다 ㅋㅋㅋㅋㅋ
선형변환이란?
선형 변환은 벡터를 다루는 일종의 규칙으로 두가지 성질을 가진다.
첫 번째는 '가산성'이라고 해서, 두 벡터를 더한 다음에 그 변환을 적용하는 거나, 각각의 벡터에 변환을 적용한 다음에 결과를 더하는 거나 같다는 것이다. 예를 들어, 두 개의 화살표가 있을 때, 이걸 먼저 합치고 나서 방향을 바꾸는 것과 각각의 화살표 방향을 바꾼 다음에 합치는 것이 같은 결과를 가져온다.
두 번째 성질은 '동차성', 이건 벡터에 어떤 숫자를 곱한 다음에 변환을 적용하는 것과, 변환을 적용한 다음에 같은 숫자를 곱하는 것이 같은 결과를 낸다. 예를 들어, 어떤 화살표를 두 배로 늘린 다음에 방향을 바꾸는 것과, 화살표의 방향을 먼저 바꾼 다음에 길이를 두 배로 늘리는 것이 똑같은 결과를 가져온다.
Affine Transform
Scaling, Rotation은 Linear transform(선형변환)이다.
Translation은 선형변환 범주에 들어가지 않는다.
위 세가지 변환은 Affine Transform 범주에 들어간다.
Translation과 Rotation을 적용시킨 변환 행렬은 다음과 같다

.
그 행렬에 Scaling을 추가하면 다음과 같다.
그런데 이 두 경우를 놓고 보면 공통점이 하나 있다. 마지막 행은 0 0 1 로 보장이 되어있다는 것이다.
변환을 1000번 10000번 적용해도 세번째 행은 항상 같다는 것이다.
따라서 세번째 행은 앞으로 무시할 수 있다.

마지막 행을 무시하고 그 중에 처음의 2x2 부분을 L이라고 약칭한다.
그 다음에 나머지 두 개의 원소로 구성된 세번째 컬럼을 t라고 약칭한다.
[L, t]
L은 이름이 암시하는 것처럼 Linear Transform이 결합된 것이다.
그런데 이곳엔 입력으로 주어진 Translation이 못들어간다.
예시는 다음과 같다.
세번째 컬럼 t는 선형변환 요소들이 대입이 될 수가 있다.

예제를 보자.
만들어졌을때 L과 t는 다음과 같다.
입력으로 주어진 선형변환 중 유일한 것은 Rotation이므로 그대로 카피가 된 것을 알 수가 있다.

그렇다면 순서를 바꾸어 Translation을 먼저 적용하고 Rotation을 나중에 적용한다면 어떻게 될까?
입력으로 주어진 것중에 선형변환은 동일하게 Rotation하나이다.
따라서 그대로 카피가 된 것을 알 수 있다.
하지만 t는 달라졌다.


Affine Transform은 행렬의 형태로 [L | t] 로 표현된다는 것을 알았다.
그렇다면 이것을 어떻게 해석을 할까?
단일한 행렬이 주어졌을때 이것을 두단계로 변환을 나누어 생각할 수 있다.
- 어떤 물체의 [L | t] 가 적용이 된다는 것은 L을 먼저 적용하는 것이다. 즉 그 물체를 선형변환 시키는 것이다.
- 그 다음 선형변환된 물체를 t를 이용하여 translation시키는 것이다.
예제에 동일하게 적용해보면 이전의 결과와 같다는 것을 알 수 있다.
결론은 Affine 변환은 항상 [L | t] 의 형태이며 작동방식은 L이 먼저 적용되고 t를 적용시키는 두 단계로 나누어 설명할 수 있다는 것이다.


Rigid Motion
[L | t] 에서 Scaling을 잠시 무시하고 Rotation과 Translation만 생각해보자.
두 변환을 적용했을 때 물체의 모양은 변하지않는다. 오로치 위치와 방향만 변한다.
이때 이것을 Rigid body Motion이라고 한다.
단단한 물체에 적용되는 모션이라는 것이며 물체의 모양이 변하지 않는 것이다.
유니티의 RigidBody 컴포넌트가 생각나서 반가웠다. ㅎㅎ
어떤 물체에 Translation을 적용하고 Rotation을 적용하고 Rotation을 적용하고… 이렇게 100개가 들어오든 1000개가 들어오든 결론은 항상 [L | t] 다.
그런데 여기서 Scaling은 배제가 되었으니 [R | t] 로 표현한다.
[L | t] 와 비슷하게[R | t]의 R은 모든 Rotation이 결합된 2x2 행렬이다.
결국 하나의 [R | t] 가 되며 2x3행렬이다.
R이 먼저 적용이되고 t가 적용되는 것이다.
Rp + t
3D Rotation
3차원에서의 Scaling 을 이야기하면 Scaling Factor Sz가 당연히 추가되고 3차원 벡터에 적용될 것이다. z도 Sz만큼 커지게 된다.
하지만 회전은 조금 생각해볼 부분이 있다.

2차원 회전은 항상 점 중심이었지만 3차원 회전은 점을 중심으로 회전하기엔 무한하게 많은 가능성이 있기 때문이다.
3차원 회전은 축을 중심으로 하는 회전을 다루기에 축이 필요하다. 따라서 세가지의 각각 회전행렬이 정의된다.
Z축을 중심으로 하는 회전을 먼저 살펴보자.
2차원 회전때 사용했던 그림의 축을 추가하면된다.
2차원에서는 x,y좌표까지만 있었지만 z가 추가되는것이다.

다음은 X축을 중심으로 하는 회전은?


3D Translation
2차원과 마찬가지로 3차원의 Translation은 4x4 인 Identity Matrix의 네번째 컬럼에 변위벡터를 넣으면 된다.
그렇다면 4x4행렬이 정의된다.
앞서 Scaling과 Rotation이 3x3행렬이었기 때문에 확장이 필요해진다.


다음 포스팅에서 이러한 변환들이 사용되는 예시들을 정리해보도록 하겠습니다.
참고
opengl es를 이용한 3차원 컴퓨터 그래픽스 입문
'Computer Graphics' 카테고리의 다른 글
컴퓨터 그래픽스 - Rasterizer(2), ViewPort (1) | 2024.01.16 |
---|---|
컴퓨터 그래픽스 - Rasterizer(1) (0) | 2024.01.13 |
컴퓨터 그래픽스(4) - World Transform (1) | 2024.01.10 |
컴퓨터 그래픽스(2) - Transform composition (0) | 2024.01.07 |
컴퓨터 그래픽스(1) - 모델링 (5) | 2024.01.06 |
댓글