Frustum Culling이 무엇인가에 대해서는 이 포스트에서 다루고 있다.
Frustum Culling을 구현하기 위해 가장 중요한 것이
어떤 정점이 어떤 평면의 어느 방향에 있는지 (법선벡터의 양의 방향에 있는지 법선벡터의 음의 방향에 있는지)
를 빠르게 판별하는 것이다.
그래야 잘린 피라미드들의 각 면에 대해 해당 연산을 진행하여 해당 정점이 카메라 내부에 있는지 바깥에 있는지를 판별할 수 있다.
크기가 1인 벡터 n을 법선벡터로 가지는 평면이 존재할 때,
어떤 점X를 중심으로 하는 구가 해당 평면의 어느 방향에 위치하고 있느냐를 판정해보자.
(파이프라인에선 구가 평면에 겹치기만 해도 어쨌든 구 일부가 카메라 시야 안에 들어오므로 렌더링한다)
우선, 평면에서 좌표계 원점까지의 거리 d를 구한다.
그 후 원점에서 점X까지의 벡터 p를 구하고, p를 n에 대해 정사영시킨다.
proj n p를 p'이라 하고, |p'| = e라고 하자.
여기까지 구했다면 남은건 점X와 평면까지의 거리가 '음수' 인지를 확인하는 것이다.
이는 e에서 d를 더해주는 것(d는 음수, e는 양수임에 주의)으로 확인할 수 있다.
(|c| + |d| = |e|인 것을 확인할 수 있다, c = 점X와 평면까지의 거리)
즉 만약 점이 법선벡터의 양의 방향에 있다면 c는 양수일 것이고,
반대로 점이 법선벡터의 음의 방향에 있다면 c는 음수일 것이다.
(이 과정들에서 헷갈릴 수 있는 부분은 c와 d의 양/음 판정인데, 그냥 법선벡터 n의 방향과 같은 벡터는 양수이고 반대는 음수라고 생각하면 편하다. )
이렇게 점의 위치가 어느 쪽인지 구한 후
그 값에 구의 반지름 r을 빼주면 구의 일부분이라도 평면 '내부'에 있는지 확인할 수 있다.
정리하면,
dot(p, n) - |d| - |r| 이 0 이하면 구는 평면에 겹치거나 평면의 법선벡터 음의 방향쪽에 있다.
반대는 그 반대.
*본 포스트의 경우 글을 읽기 전 한 번 영상을 보는 것을 권장한다.
참고:
https://www.youtube.com/watch?v=4p-E_31XOPM
'mathematics > game mathematics' 카테고리의 다른 글
[Mathematics] 18. Quaternion (0) | 2022.04.24 |
---|---|
[Mathematics] 17. Axis-Angle Rotation (Rodrigues formula) (0) | 2022.04.08 |
[Mathematics] 15. 3차원 Line-AABB Intersection (0) | 2022.04.03 |
[Mathematics] 14. Line-Plane Intersection (0) | 2022.04.03 |
[Mathematics] 13. 선형변환의 기하학적 의미 (0) | 2022.02.21 |