[UNSEEN 테스트 대비] 게임에서의 벡터, 행렬, 내적, 외적의 활용, 회전의 표현
벡터 (Vector)
크기와 방향을 가진 양을 나타내는 수학적 개념
스칼라(Scalar)
크기만을 가지고 방향이 없는 양을 의미
벡터와 반대되는 개념으로 단순히 크기만을 가지고 있다.
벡터의 정규화
- 해당 벡터의 크기를 1로 만들어주는 과정
- 벡터의 크기가 1이 되면 방향은 유지한 채 크기를 표준화 할 수 있다
- 방향 벡터, 단위 벡터라고도 불린다.
게임 개발에서 벡터는 다양한 용도로 사용되는데, 주로 위치, 방향, 속도 등을 나타내기 위해 사용됩니다.
힘의 크기 (Magnitude)
힘의 방향 (Direction)
벡터의 내적
A⊙B = |A||B| Cosθ
θ 는 A와 B 벡터의 사이각이다.
두 단위 벡터가 평행하면 절대값은 1이다. (같은 방향이거나, 반대 방향)
두 벡터 사이각은 내적공식을 통해 구할 수 있다.
1. 시야 판별(앞뒤 판별)
두 벡터가 이루는 내적 부호를 통해 목표물이 캐릭터의 앞에 있는지 뒤에 있는지 판별 가능하다.
그림을 참고하면 Cos 함수는 (-90, 90) 영역에 대해 양의 부호를 가지고, -90, 90 에서는 0, 나머지 범위에서는 음의 부호를 가진다.
따라서 벡터의 내적을 해 보았을 때 θ 값이 양수이면 목표물이 캐릭터의 앞에 있는 것이고, 음수이면 뒤에 있는 것이라고 판별할 수 있다.
2. 시야각 판별
u를 캐릭터의 정면 단위벡터라고 하고 v 를 캐릭터에서 목표물로 향하는 단위 벡터라고 하자.
이때 u 와 v 의 내적을 통해 나오는 각도 값이 cos θ/2 보다 작아야 시야 내에 있다고 말할 수 있다.
3. 투영(정사영) 벡터
어떤 벡터를 다른 벡터에 투영한 결과 벡터를 계산할 때 사용 (성능적인 측면에서 이점이 있다.)
컴퓨터에서 사인 이나 코사인 값을 직접 계산하는 것은 큰 연산 비용을 요구한다.
하지만 내적을 사용하면 컴퓨터가 가장 빠르고 잘 할 수 있는 곱셈과 덧셈의 연산 문제로 귀결된다. 따라서 코사인 함수가 나오는 공식은 모두 내적으로 변경하는 것이 바람직하다.
벡터의 외적
두 벡터를 가지고 다른 벡터를 만드는 연산이다. 새롭게 만들어진 벡터는 원래 존재하던 두 벡터 모두에게 수직이 된다.
벡터의 외적 수식
a x b = [(ay·bz – az·by), (az·bx – ax·bz), (ax·by – ay·bx)]
새로운 벡터의 성분들은 해당 성분을 제외한 값들의 나머지 값을들 교차해서 곱한 뒤 서로를 뺀 값이다. (빼는 순서는 바꾸면 안 된다.)
1. 법선벡터를 구할 때
이렇게 계산해서 나온 새로운 벡터는 두 벡터를 통해 만들어진 평면에 수직인 벡터이다. (평면의 법선벡터)
2. 평행 여부 판단
두 벡터가 서로 평행하다면 두 벡터의 외적으로 나온 벡터의 크기는 0이 된다.
3. 카메라 행렬을 구할 때
카메라를 원점으로 카메라가 보는 방향 벡터와 게임 세계에서 천장이나 하늘을 가리키는 상향 벡터를 가지고 카메라 좌표계를 만들어야 한다.
4. 왼쪽 오른쪽 판별
캐릭터의 직진 방향 벡터 v 와 목표물까지의 벡터 w 를 외적해 나온 법선벡터에 월드 좌표계의 up 벡터를 내적했을 때, 양수가 나오면 A의 왼쪽에 있다고 판단하고, 음수가 나오면 오른쪽에 있다고 판단한다.
||a x b|| = ||a|| × ||b|| x sinθ
사인그래프 상에서 0 ~ 180 까지 양수이고 180~ 360 (혹은 -0~ -180) 까지는 음수이다.
따라서 외적공식을 통해 v 와 w 를 외적했을때 A의 왼쪽에 있는 경우에는 sin 값이 양수가 나오기 때문에 법선벡터와 up벡터의 방향이 같아서 양수가 나온다.
반대로 sin 값이 음수일 때는 법선벡터의 방향과 up벡터의 방향이 다르기 때문에 음수가 나온다.
이를 통해 왼쪽 오른쪽을 판별할 수 있다.
부록
스칼라 삼중곱을 통해 세 벡터가 이루는 평행육면체의 부피를 구할 수 있다.
행렬
행과 열로 이루어져 있는 것
스칼라들을 사각형 모양으로 배치해 둔 것
두 벡터가 평행하지 않다면 각 벡터는 기저 벡터가 되고, 기저 벡터의 개수에 따라 차원 공간을 형성한다.
위와 같이 찌그러진 공간을 만들어 낼 수 있다. (선형 변환)
벡터를 사용했을 때는 따로따로 계산 해주어야 하는데 행렬을 통해 한 번에 계산했다.
-> 행렬은 결합 법칙이 성립하므로 한 번에 선형 변환이 가능하다.
- 복잡한 선형 변환식을 일일이 계산하지않아도 된다
- 행렬로 정리된 간편한 식의 곱셈 전개를 통해 원하는 선형 변환을 빠르게 구현할 수 있다.
이렇나 특징은 계산 과정을 많이 줄여주는 효과를 가져올 수 있어서, 게임에서 행렬이 필수적으로 쓰인다. 예를 들어, 게임 개발에서는 다음 5가지 변환을 주로 하게 된다.
- 크기 (Scale)
- 회전 (Rotation)
- 이동 (Translation)
- 뷰 (View) : 카메라의 시점을 나타낼 때 사용되는행렬
- 투영(Projection) : 3차원 공간을 2차원 상의 공간에 투영하는 역할
만약 어떠한 캐릭터가 10만 개의 점으로 이루어져 있다면, 이를 연산하여 모니터에 보여주기까지 위의 5가지 과정을 거치기에 50만번의 연산이 발생한다.
P ( V ( T ( R ( S * v))))
그런데 위와 같은 5가지 변환들이 항상 고정되어 있다면, PVTRS 를 미리 계산해 행렬로 생성한 후, 이를 사용하면 동일한 결과를 만들어주는 연산이 되므로 10만번으로 해결할 수 있다.
회전의 표현
게임에서 어떠한 물체를 회전시키는 가장 일반적인 방법은 오일러 각도를 사용하는 것이다.
- 오일러 각도
- 쿼터니언
- 회전 행렬
- 방향 벡터
- 축-각도 (잘 안씀)
오일러 각도
3차원 공간 좌표계의 세 축인 x, y, z 축을 기준으로 순서대로 회전시키는 방식.
오일러 각에서 사용되는 세 개의 축은 서로 종속인 관계를 갖는다. 예를 들어 x 축을 회전하면 y축과 z축이 회전하고, y축을 회전하면 x, z 축이 회전한다.
오일러 각도를 사용하면 직관적이고 이해하기 쉽다.
한 축을 회전할때마다 다른 축에 종속적으로 회전 하기 때문에 짐벌락 문제를 가지고 있다.
짐벌락 이란?
아래 그림처럼 고리가 세개가 있고 회전한다고 하자. 그럼 우연히 두 개 이상의 고리가 겹치게 되면 한 축의 회전각이 소실되게 된다. 이것이 짐벌락 이다.
아래 gif 에서 축이 겹쳐지면 회전각이 어떻게 소실되는지를 확인할 수 있다.
쿼터니언
4개의 구성 요소 ( x, y, z, w) 를 사용하여 회전을 단위 벡터와 스칼라로 나타내는 방식.
장점
- 짐벌락이 발생하지 않는다.
- 회전 보간에 효율적이다.
- 하나의 스칼라와 세 개의 벡터로 구성되어 있어 매트릭스보다 메모리 효율적이다.
단점
- 직관적으로 이해하기 어렵다
언리얼엔진에서는 오일러 각도, 쿼터니언을 활용해 회전을 표현한다.
정확한 각 회전이 필요할 때는 FQuat을 사용하고, 일반적인 선형 보간 등에는 FRotator를 사용한다고 생각하면 될 듯 하다.
출처
https://plug-in-baby.tistory.com/178
[UE5] Quat(쿼터니언) / Rotator (로테이터)
FQuat 쿼터니언은 3차원 공간에서 회전을 표현할 때 사용하는 수학적 도구이다. 쿼터니언의 장점 1. Gimbal Lock 방지 : 오일러 각도를 사용하여 각을 표현할 때 생기는 짐벌락을 방지할
plug-in-baby.tistory.com
https://luv-n-interest.tistory.com/720
벡터(Vector) - 3(외적, Cross product) [게임수학]
이번에는 외적에 대해서 조금 알아보려고 한다. 내적이랑 비슷하겠지 생각하면 정답 다를 거 없다. 알아보자 ** Outer Product라고도 부르는데 이는 벡터곱이 아닌 텐서곱을 의미한다. 결과값이 행
luv-n-interest.tistory.com
https://hyo-ue4study.tistory.com/226
[3D 게임수학] 2. 벡터(Vector)
* 이 글은 개인노트와 같아서 계속해서 수정되고 있습니다. * 아일랜드의 수학자 해밀턴이 1843년, 13년의 연구 끝에 쿼터니언을 발견, 그가 1846년에 발표한 논문에서 쿼터니언의 실수부를 '스칼라
hyo-ue4study.tistory.com
https://m.blog.naver.com/cdw0424/221661348758
게임 수학 - 행렬(1), 게임에서 행렬이란? 벡터 덩어리?
가장 하기 싫었고 가장 이해하기 힘들었던 행렬에 대해 정리해 보려고 한다. 게임 개발에서 행렬은 무엇이...
blog.naver.com
https://daekyoulibrary.tistory.com/entry/%EA%B2%8C%EC%9E%84-%EC%88%98%ED%95%99-8-
[게임 수학] #8 | 행렬(Matrix)
인프런 강의를 듣고 공부한 글입니다. 1. 행렬(Matrix)벡터가 하나의 행 또는 열만을 표현할 수 있는 것에 비해, 행렬은 행 벡터(Row vector) 혹은 열 벡터(Column vector)들을 활용하여 2차원으로 구성이
daekyoulibrary.tistory.com