MathJax

2014년 1월 29일 수요일

AABB 와 삼각형 충돌 (Intersecting AABB and triangle)

AABB와 삼각형 충돌에 SAT방법이 적용된다.

먼저 SAT를 알아보자.

SAT(Separating Axis Theorem)는
임의의 떨어져 있는 두 볼록 다면체 A, B에 대해 어떤 축이 존재하고
그 축으로 각 다면체를 투영하여 투영된 구간들이 겹쳐지지 않는다는 이론

A, B가 겹치지 않을 경우 다음 축들 중 하나에 대한 평행한 축에 의해 분리 된다.

1. A의 면 중 하나의 법선 벡터
2. B의 면 중 하나의 법선 벡터
3. A의 변과 B의 변에 동시에 수직인 축 (외적)

SAT 이용하여 총 13개 축을 TEST 한다.

1. AABB의 법선 벡터 (3개)
2. 삼각형의 법선 벡터 (1개)
3. AABB의 축과 삼각형 각 변과의 외적 (9개)

separating axis을 찾으면 바로 exit 그리고 교차 하지 않는다.
모든 separating axis 검사 후 축을 찾지 못하면 반드시 교차 한다.
효율적인 검사 순서는 3-> 1-> 2으로 진행한다.

3번 과정>
3. AABB의 축과 삼각형 각 변과의 외적 (9개)
삼각형의 3개 점






계산을 간단히 하기 위해 AABB의 중심이 원점이 되도록 이동 한다.
그 결과 삼각형의 점도 같이 이동 된다.
(AABB에 적용되는 월드 행렬의 역행렬을 사용하면 가능하다.)

OBB의 경우에는 반대로 회전 시켜 AABB로 만들어 계산 하면 된다.
(OBB의 월드행렬을 사용하여 원점으로 이동 후 AABB를 만들기 위해 회전시킨다.)

그리고 삼각형의 각 변은 다음과 같이 찾을 수 있다.








AABB를 원점, 축 형식으로 다시 표현한다.







AABB의 3개의 축



삼각형의 3개의 변



위의 각 3개의 축 과 3개의 변을 외적 하여 축 9개의 만들어 낸다.
그리고 이 9개의 축에 대해 투영을 시도 한다.













AABB의 반지름은 다음과 같이 나타낼 수 있다.
n: 반지름을 만들어 내는 축
ei: AABB 3개의 축 길이
ui: AABB 각 축
r: AABB의 반지름
(0 <= i <= 2)





예시로 9개의 축 중에 a00경우를 살펴 본다.AABB 반지름은 위의 식에 의해 만들어 진다.
이 식에서 축 n 대신에 a00을 사용한다.






이런 방법으로 9개 축에 AABB를 투영하여 반지름을 얻는다.
















이제 삼각형을 9개 축에 투영해 보자.
a00경우








이런 방법으로 9개 축에 삼각형을 투영하면











지금까지 결과를 보면 아래와 같은 패턴이 반복되는 것이 확인 된다.
p0, p2
p0, p1
p0, p1

그리고 삼각형의 경우는 각 축의 경우에서 투영된 값의 최소값과 최대값을 구하여 사용한다.




그런데 위에서 나왔던 패턴에 따라 최소, 최대 값을 구하면 2개의 항목만 사용하면 된다.

9개 축에 대해서 모두 정리하면
(각 축의 경우 마다 p0, p1, p2 값이 다르므로 주의)
















이제까지 9개 축에 투영된 AABB와 삼각형에 대해서 교차 여부를 확인할 차례이다.

위에서 AABB를 투영하여 얻은 값은 반지름 값이므로 지름은 아래 범위 값이 된다.
[-r, r]

그래서 9개 축에 대해 아래 식을 모두 만족하면 교차하지 않는 상태가 된다.





1번 과정>
1. AABB의 법선 벡터 (3개)

앞의 3번 과정에서 AABB는 중심을 (0, 0, 0)으로 가진 상태로 변환된 상태 이다.
교차 검사는 AABB와 AABB의 교차 검사 방법과 유사하게 진행 된다.


















AABB 각 축 거리의 절반
(e0, e1, e2)

그리고 아래 식을 x, y, z 축에 대해 모두 만족하면 교차 하지 않는 상태가 된다.






2번 과정>
2. 삼각형의 법선 벡터 (1개)

AABB와 평면 교차 검사 방법으로 확인 가능 하다.

















삼각형의 법선 벡터를 사용하여 AABB의 반지름(r)을 구한다.
그리고 삼각형이 만드는 평면과 AABB의 거리(s)를 구해서 비교 한다.


s>r

위의 식이 만족하면 교차 하지 않는 상태가 된다.

여기 까지 총 3개의 과정을 거쳐 검사를 하며
이 과정을 모두 통과 하면 AABB와 삼각형은 교차 상태가 된다.


참고자료
Essential Mathematics For Games And Interactive Applications
3D 게임 프로그래밍 & 컴퓨터 그래픽을 위한 수학 제2판
Real-Time Rendering 2판

2014년 1월 22일 수요일

박스(AABB, OBB)의 반지름 구하기 (Radius of AABB and OBB)

벡터 n에 투영한 박스(AABB, OBB)의 반지름 구하기

먼저 박스의 각 축을 다음과 표시한다.


각 축의 길이는 다음과 같이 표시한다.























그래서 박스의 포함된 점R은 다음식으로 나타낼 수 있다.






c: center of a box

따라서 박스의 외곽을 구성하는 8개의 점은 아래와 같이 된다.






박스의 반지름을 구하기 위해서는 반지름을 만들어낼 벡터n을 선택한 후
벡터n에 투영하여 구하면 된다.







이렇게 박스의 8개 점을 모두 투영하고 하나를 선택하여 사용한다.
투영된 길이 중에서 최대 값을 사용하여야 박스의 모든 점을 포함하는
최대 반지름값을 얻을 수 있게 된다.

그럼 위 식에서 최대 반지름을 만족 시키기 위해서
먼저 각 축의 길이는 모두 양의 값을 가지게 된다.
그래서 위 식을 아래와 같이 정리할 수 있다.








만약 벡터n이 단위 벡터가 아닌 경우 n의 크기로 나누어 주면 된다.





참고자료
Essential Mathematics For Games And Interactive Applications
3D 게임 프로그래밍 & 컴퓨터 그래픽을 위한 수학 제2판
Real-Time Rendering 2판

2014년 1월 14일 화요일

사원수 회전 (Quaternions Rotation)

사원수(Quaternions)의 회전은 아래와 같이 나타낼 수 있다.
P: 회전이 필요한 점
q: 회전축 및 각도가 표현된 사원수




s: scalar value
v: vector value

그럼 위 식을 차례대로 풀어서 정리해 보자.

먼저 아래 공식을 기억해 두고 하나씩 정리한다.






스칼라 및 벡터 연산에 대하여 주의하면서 풀어나가면 된다.
위 식에서 앞 부분을 조금 풀어보면













그리고 게속해서 나머지를 정리한다.
















여기서 v를 단위벡터A와 길이 t로 표현하여 위의 식을 계속 정리하면








SA:skew matrix of A
I: identity matrix

그리고 Axis-Angle Rotation으로 표현했던 아래 식을 상기 시켜
위의 식과 비교해 보면 다음과 같은 결과가 나온다.








위의 3개 식을 풀어서 s, t값을 구한다.
풀이에는 삼각함수의 반각공식(half-angle relations)을 사용하면 된다.












구해진 s, t를 사용하여 사원수 q를 다시 표현하면 다음과 같아진다.





: unit vector of A


이것으로 쿼터니언에서 표현되는 회전각은 1/2값임을 알 수가 있다.

위에서 구해진 식에서 앞쪽 행렬 부분이 사원수의 회전 표현식이 되고
이것을 계속 행렬로 정리한다.



여기서 정리 하기 전에 아래의 관계를 적용한다.












계속해서 행렬을  정리해 나가면














식을 좀 더 간단히 만들기 위해 단위 사원수로 바꾸어 생각한다.
여기서 사원수 q가 단위 사원수가 되면 다음이 성립한다.





이것을 이용해서 행렬식을 다시 정리하면















마지막으로 행렬식을 하나로 합치면






이 행렬식을 사용하여 사원수q를 행렬로 변환하여 사용하면 된다.

참고자료
Essential Mathematics For Games And Interactive Applications
3D 게임 프로그래밍 & 컴퓨터 그래픽을 위한 수학 제2판
Real-Time Rendering 2판

2014년 1월 9일 목요일

임의의 축 회전 (Axis Angle Rotation)

R2 공간에서 벡터 i=(1, 0)를 회전시 다음과 같이 나타낼 수 있다.



여기서는 기저 벡터를 i, j 대신에 v_perp, w를 사용하고 회전축 A를 이용한다.




















v_prop: A축에 대해 projection
v_perp: A축에 대해 perpendicular

위 식은 v의 수직 성분만 있으므로 수평 성분을 더하면 회전된 v를 계산할 수 있다.

그런데 v_prop는 회전축A에 대하여 회전을 하여도 변하지 않게 된다.

그래서 회전된 v는 다음과 같다.

먼저 v_prop를 찾아보자.

회전축인 A에 v를 투영하면 확인할 수 있다.



: A의 unit vector


그리고 v에서 수평 성분인 v_prop를 빼면 수직 성분인 v_perp를 구할 수 있게 된다.




w는 회전축A와 v의 외적으로 구해진다.



위의 회전식을 지금까지 구해진 식으로 풀어서 적으면







그리고 v를 분리하기 위해 tensor product와 skew matrix를 사용하여 정리 한다.

[tensor product]
두개의 벡터 v, w가 있을때














그리고 3개의 벡터 u, v, w가 있을 때



[skew matrix]
외적을 행렬로 표현할때 사용
벡터 v를 skew matrix로 표현하면






그리고 여기에 벡터 w를 곱해주면 외적이 행렬로 표현 된다.


식을 다시 정리하면




S: skew matrix





I: identity matrix

이제 위의 식에서 벡터 v에 곱해지는 부분이 바로 벡터 v를 회전 시키는 행렬 부분이 된다.
다시  행렬 부분만  풀어 적게 되면  다음과 같이 된다.


















위의 행렬을 임의의 벡터 v에 곱하게 되면 임의의 회전축 A를 기준으로
회전된 벡터 v를 구할 수 있다.

참고자료
Essential Mathematics For Games And Interactive Applications
3D 게임 프로그래밍 & 컴퓨터 그래픽을 위한 수학 제2판