1. 오일러 - 짐벌락이 있다.

* 짐벌락 - 축들은 종속적이라 회전 하다 축이 같게되면 회전하지 못하는 짐벌락이 발생한다.


2. 행렬

 회전 변환은 가독성이 좋지 않고 저장공간을 많이 차지한다.


3. 사원수

 회전 변환을 결합할 수 있다는 것과 사원수 곱을 통해 점과 벡터를 회전 변환할 수 있다. LERP, SLERP를 이용해서 회전 변환을 보간할 수 있다.


4. 기타 수학 개념

 평면 방정식 = Ax + By + Cz + D = 0

 여기서 A, B, C는 법선 벡터가 된다. 그리고 A, B, C가 정규화 되있다면 D는 평면과 원점사이의 거리가 된다. d 가 양수이면 법선 벡터가 원점을 향하고 음수이면 법선 벡트는 원점에서 멀어지는 방향이다.

 즉 평면은 법선벡터와 원점과의 거리만 있으면 표현할 수 있다.


5. SIMD single instruction multiple data / SSE Streaming SIMD Extension 

  CPU가 기계어 하나로 병렬 연산 하는 것으로 게임 엔진의 수학 라이브러리에서 널리 쓰인다. 자주 쓰이는 연산을 엄청 빠르게 할 수 있다.


6. 난수

 * 메르센 트위스터

  ⓐ 2^19937 - 1 이라는 긴 주기를 갖게 고안됬다.

  ⓑ 매우 높은 동일 분포 차원을 갖는다. 즉 생성된 난수들 사이에 연관성이 거의 없다.

  ⓒ 여러가지 무작위성 테스트를 통과했다

  ⓓ 빠르다.

'게임 엔진 아키텍처 > 4장 게임에 사용되는 수학' 카테고리의 다른 글

사원수  (0) 2016.05.26
행렬  (0) 2016.05.26
벡터  (0) 2016.05.25
posted by 알쿠미

회전변환에 행렬이 최선이 아닌 이유

  * 회전 변환에서는 피치, 요, 롤이 세가지 변수밖에 없는데, 이 것을 표현하기 위해 9개의 부동소수가 필요하다. 낭비다.

  * 벡터를 회전 변환하려면 행렬 곱셈을 해야하는데, 여기에는 3번의 내적 계산 즉 9번의 곱셈과 6번의 덧셈이 필요하다.

  * 두 회전 변환 사이의 주간 회전 변환을 구해야 할 때 행렬로는 중간 지점을 찾기가 힘들다.


1. 3D 회전 변환을 나타내는 단위 길이 사원수

 q = [qv qs] [asin(θ/2) cos(θ/2)]


2. 사원수 연산

 두 사원수가 있을 때 곱셈은 두 사원수의 회전을 합친 것이다.


 pq = [ (psqv + qspv + pv X qv) (psqs - pv*qv) ]


3. 결레와 역

 사원수의 역은 q^(-1) 이라고 쓰고 그 의미는 원래의 값과 곱하면 스칼라 값 1이 되는 사원수를 뜻한다.

 qq^(-1) = 0i + 0j + 0k +1

 켤레 사원수 = [ -qv qs ]

 사원수의 역 = 켤레 사원수 / 크기 절대값의 제곱


 사원수 곱셈에서

 (qp) 의 켤레 사원수는 반대 순서로 둘의 켤레사원수를 곱한것이며 사원수의 역도 반대 순서로 둘의 역을 곱한 것이다.


4. 사원수의 벡터를 이용한 회전

 벡터 v를 사원수로 바꿔쓰면 v = [ vx vy vz 0 ] 이다.

 이것을 회전한 결과는 v' = qvq^(-1) 단위길이라면 역대신 켤레가 들어가도 된다.

 

 회전을 여러번 할때의 사원수 계산은

 q3q2q1vq1^(-1)q2^(-1)q3^(-1)

 

5. 사원수의 계산으로 보간이 가능하다

하지만 회전에서 보간을 하려면 완전하지 선형보간 LERP를 써야하는데 구면 선형 보간 SLERP를 쓰기엔 너무 느리다.


 


'게임 엔진 아키텍처 > 4장 게임에 사용되는 수학' 카테고리의 다른 글

회전 변환 표현간 비교 / 기타 수학 개념  (0) 2016.05.26
행렬  (0) 2016.05.26
벡터  (0) 2016.05.25
posted by 알쿠미

행렬

행렬은 교환 법칙이 성립 하지 않는다. AB != AB


1. 단위 행렬 - 대각선 성분만 1이고 나머지는 0인 벡터


2. 역행렬 - AA' = A'A = 단위행렬

(모든 행렬에 역행렬이 있는 것은 아니다.)

하지만 모든 아핀행렬(회전, 평행이동,스케일, 층밀림 변환으로만 이뤄진 행렬)은 역행렬이 존재한다.

가우스 소거법이나 LU분해법을 이용하면 역행렬이 존재하는 경우에는 역행렬을 찾을 수있다.


3. 전치 행렬

전치 행렬은 대각선기준으로 행렬을 뒤집어 놓은 것이다. 즉, 원래 행렬의 행은 열이되고 열은 행이 되는 것이다.

 ex) 순수한 회전변환 행렬의 역행렬 = 전치행렬이라 자주 이용된다.

(ABC)t = CtBtAt


4. 동차 좌표

3차원 행렬로 3차원 회전은 표현할 수 있지만 평행이동은 표현할 수 없기에 n+1 행렬로 표현한다.


5. 방향 벡터 변환

동차 좌표에서 점의 w값은 1로 해두고 선의 w값은 0으로 해둔다.

즉, 3차원의 순수 방향 벡트는 4차원 동차 좌표에서는 무한대에 있는 점과 같은 역할을 한다.


6. 기본단위 변환 행렬

  ⓐ 평행 이동 _41, _42, _43

  ⓑ 회전 변환

    - x 축 회전은 _22 = cos, _32 = sin, _23 = -sin, _33 = cos

    - y 축 회전은 _11 = cos, _31 = -sin, _13 = sin, _33 = cos

    - z 측 회전은 _11 = cos, _21 = sin, _12 = -sin, _22 = cos

   * 회전 행렬의 3*3 부분의 1은 항상 회전하는 축에 해당하는 성분에 곱해지고 사인과 코사인은 그렇지 않다.

  * y축에 대한 행렬은 다른 행렬에 비교할 때 전치 행렬 같은 모양을 하고 있다.

  * 회전 변환의 역은 전치 행렬과 같다. cos(-θ) = cos(θ) 이고 sin(-θ) = -sin(θ)이기 따라서 각도의 부호를 바꾸면 사인 값은 위치를 서로 바꾼 것과 같고 코사인 값은 변하지 않는다.

  ⓒ 스케일 변환 _11, _22, _33



'게임 엔진 아키텍처 > 4장 게임에 사용되는 수학' 카테고리의 다른 글

회전 변환 표현간 비교 / 기타 수학 개념  (0) 2016.05.26
사원수  (0) 2016.05.26
벡터  (0) 2016.05.25
posted by 알쿠미

벡터

1. 벡터 연산


방향 + 방향 = 방향

방향 - 방향 = 방향

점 + 방향 = 점

점 - 점 =  방향

점 + 점 = 성립되지 않음

2. 벡터 크기 = 피타고라스의 정리를 이용하면 구할 수 있다.


3. 정규화와 단위 벡터

벡터 / 벡터 크기


4. 법선 벡터 ( 어떤 평면에 수직인 벡터를 법선 벡터라고 한다.)

 - 어떤 면과 그 면에 비치는 빛의 상대적인 각도를 계산하는데 사용된다.


5. 벡터 내적과 투영

 * 벡터 내적( Dot Product , 스칼라 곱)

 * 벡터 외적( Cross Product, 벡터 곱)


a*b = abx + aby + abz = d 스칼라 값 = IaIIbI cos()

a*b = b*a , sa*b = s(a*b)


6. 벡터 투영

벡터가 단위 벡터 일때, 어떤 벡터 a와 u의 내적은 a를 u방향의 무한히 긴 선에 투영한 크기가 된다.


7 내적으로 알아낼 수 있는것

 내적을 이용하면 두 벡터가 평행인지, 수직인지를 알 수 있고, 두 벡터가 가리키는 방향이 비슷한지 아니면 반대인지를 알 수 있다.

 - 평행이면서 같은 방향 벡터 (a * b) = IaIIbI = ab 이면 평행이면서 같은 방향벡터

 - 평행이면서 같은 방향 벡터 (a * b) = IaIIbI = -ab 이면 평행이면서 반대 방향벡터

 - 수직인 벡터는 (a * b) = 0 (두 벡터가 이루는 각이 90도)

 - 같은 방향인 벡터 (a * b) > 0 ( 두 벡터가 이루는 각이 90도 미만)

 - 다른 방향 벡터 ( a * b) < 0 ( 두 벡터가 이루는 각이 90도 보다 크다)


기타 내적의 활용

 - 평면과 점의 거리

 평면에 임의점 q를 잡고 거리를 알고자 하는 점과 벡터를 만들어서 평면의 법선 벡터에 투영하면 된다.


8. 벡터 외적

 두 벡터 외적의 결과는 두 개의 벡터와 수직인 벡터이다. 3차원에서가능

aXb = [(aybz - azby), (azbx - axbz), (axby- aybx)]


외적 벡터의 크기는 두 벡터의 크기 곱하기 두벡터 각도의 sin값이다.


외적 벡터의 방향은 손 좌표계를 따른다.


9. 외적의 활용

 두 벡터의 수직인 벡터, 평면에 수직인 벡터, 토크 N = r X F다.


10. 점과 벡터의 선형 보간

 L = LERP(A, B, k) = (1-k)A + kB

두개의 알려진 지점 사이의 중간 값을 계산 하는 수리연산


'게임 엔진 아키텍처 > 4장 게임에 사용되는 수학' 카테고리의 다른 글

회전 변환 표현간 비교 / 기타 수학 개념  (0) 2016.05.26
사원수  (0) 2016.05.26
행렬  (0) 2016.05.26
posted by 알쿠미