일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 정렬
- UML관련
- enumasByue
- map
- UE_LOG
- 애셋로드
- 프로그래머스
- moreeffectiveC++
- UE4 커스텀로그
- UELOG
- 알고리즘
- C++
- 델리게이트
- unorder_map
- 강참조
- 데이터애셋
- 크리티컬섹션
- stl
- C++최적화
- dataasset
- 언리얼가비지컬렉터
- 약참조
- 언리얼엔진구조체
- 선택정렬
- 람다사용정렬
- BFS
- 스마트포인터
- 람다
- 정렬알고리즘
- 자료구조
- Today
- Total
기억을 위한 기록들
[3D 게임수학] 4. 선형 변환(Linear Transformation) 본문
* 이 글은 개인노트와 같아서 계속해서 수정되고 있습니다. *
선형 변환은 일반적으로 하나의 벡터 공간을 다른 벡터 공간으로 변환하는 함수라고 할 수 있다.
선형 변환을 정의하는 두 특성이 변환 후에도 벡터 공간의 조건을 그대로 만족하기 때문이라는 것도 설명 하였다.
선형 변환 T가 벡터공간 V를 다른 벡터 공간 W로 변환한다고 하자.
그럼 수학적으로는 아래와 같이 표현 할 수 있다.
T:V->W
이전에도 그랬던 어떤 벡터든 그 공간의 기저 벡터들의 선형 조합으로 표현할 수 있다.
hyo-ue4study.tistory.com/222?category=878136
그리고 위에서 작성한 부분 중
위 선형함수들을 순서대로 적용하면 선형 변환을 적용하는것과 같다.
재미있는 것은 선형 변환을 수행할 때 기저 벡터들을 먼저 선형 변환을 해놓고 나면 남은 건 단지 변환하고자 하는 벡터의 선형조합에 쓰인 스칼라 값들과 새롭게 변환된 기저 벡터들과의 선형 조합이 전부라는 것이다.
크기 변환(Scaling)
벡터의 두가지 성질, 크기와 방향 중 크기를 바꾸는 것으로 예를들어 벡터 공간 V를 고정 시킨 후 오른쪽으로 늘렸다고 가정해보자.
화살표가 동북쪽 방향으로 1:1 비율로 뻗어가면 45도로 뻗어가면서 눕혀진 모습으로 변경된다.
오른쪽으로 늘린 벡터는 다시 동일하게 반대방향으로 힘을 가하면 원래 벡터로 복원할 수 있다.
그러면 눕혀진 벡터들은 모두 제자리로 돌아올 것이다. 선형 변환이라는 개념은 사실 복잡한 내용은 없다. 다만 주의할 점이 한 가지 있다. 선형 변환의 결과는 항상 다시 벡터 공간을 이룬다는 것이다.
앞서서 벡터는 시각화 할 수 없지만 원점을 기준으로 선을 그리는 것으로 형상화하자고 하였다. 따라서 힘을 가해 선형 변환을 시킨 결과는 원점을 벗어날 수 없다는 것이다.
개념적으로 특별할 게 없는 선형 변환은 게임 그래픽에서 굉장한 의미를 가진다.
선형 변환의 효율적인 계산을 위해 수학자들은 행렬이라는 것을 고안했는데, 이 행렬이 있었기에 실시간으로 움직이는 게임 제작이 가능하게 된 것이다.
그리고 행렬을 같이 쓰면은 주대각성분이 임의의 수가 되고 나머지 성분은 모두 0인 행렬을 만들면 그것이 바로 크기변환을 표현하는 행렬이 되는 것이다.
임의의 벡터v를 크기변환 을 통해 w 행렬로 나타낸다고 하면 아래와 같다.
위 a,b,c의 값이 모두 같으면 x,y,z축에 대해서 같은 비율로 크기 변환하고, 이렇게 하는 것을 균등 크기 변환(uniform scaling)이라고한다. 그게 아니고 각 축에 적용되는 비율이 동일하지 않다면, 비균등 크기변환(non-uniform scaling)이라고한다.
반대로 역행렬은 벡터의 각 성분에 곱해진 값의 역수를 다시 곱하면 그만이다.
이렇듯 주대각선분이 원래수의 역수가 되고 나머지가 0인 행렬이 원래 크기변환 행렬의 역행렬이다.
그리고 이전에 작성한 글에도 특수한 경우 몇가지가 있다.
좌표축 기준 회전 변환(Rotation)
어떤 벡터를 회전한다고 하면 반드시 두 가지 요소를 이야기 해야한다.
1. 얼마만큼 회전할 것인가(회전의 양)
2. 무엇을 기준으로 회전할 것인가(회전의 축)
ex) z축 기준으로 30도 회전으로 표현
3. 회전의 방향(시계방향or반시계방향)
방향은 좌표계에 따라 변한다. 오른손 좌표계인지, 왼손 좌표계인지에 따라
임의의 축을 기준으로 회전 변환을 행렬로 나타낼 수 있다.
임의의 벡터a를 기준으로 각 a만큼 벡터 v를 회전시킨다고 하고, 이때 벡터 v 자신을 벡터 a에 투영시킨 벡터와 투영시킨 벡터를 v로부터 뺴서 나오는 벡터 perp를 표현할 수 있다.
'그래픽스(Graphics) > Game Math' 카테고리의 다른 글
[3D 게임수학] 5. 아핀공간(Affine Space) (0) | 2021.03.17 |
---|---|
라디안(radian)이란? (0) | 2021.03.05 |
평균/분산/표춘편차 구하기/ O(1)/ C++ (0) | 2021.03.01 |
[3D 게임수학] 3. 행렬(Matrix) (0) | 2021.02.25 |
[3D 게임수학] 2. 벡터(Vector) (0) | 2021.02.15 |