Make Unreal REAL.
article thumbnail
삼각형 클리핑(Triangle clipping)

이득우의 게임 수학 현재 절두체 컬링 구현에서는 카메라를 좌우로 많이 움직일 경우, 공포 영화의 한 장면처럼 아래와 같이 심각한 깨짐 현상이 발생한다. 문제의 원인을 알아보기 위해 아래와 같이, 삼각형 CBA 중 점 C가 카메라의 뒤쪽에 있는 경우를 가정해본다. 이를 투영하면 카메라 뒤쪽에 위치한 점 C는 원점을 중심으로 뒤집혀 투영 평면에 투영된다. 따라서 위 실행 화면처럼 엉뚱한 삼각형이 그려져 문제가 발생하는 것이다. 따라서 평면이 올바르게 보이려면 카메마 뒤쪽에 있는 점을 파악해 점이 거꾸로 투영되지 않도록 해야 한다. 원근 투영 행렬에 곱해 생성된 클립 좌표계의 w값은 뷰 공간에서의 깊이를 의미한다. 0 < w 카메라 앞에 점이 있다. w < 0 카메라 뒤에 점이 있다. w = 0 카메라 초점에..

article thumbnail
AABB (Axis Aligned Bounding Box)

이득우의 게임 수학 구 영역 대신 박스 영역을 사용하면 좀 더 정교한 절두체 컬링을 수행할 수 있다. 메시 데이터로부터 박스 영역을 생성하는 방법은 간단하다. 메시를 구성하는 점을 순회하면서 각 차원의 최댓값과 최솟값을 갱신해주면 된다. n개의 정점이 있을 때, O(n) 시간에 구할 수 있다. 이렇게 생성된 박스 영역을 기저 축이 정렬되어 있다는 의미에서 AABB 바운딩 볼륨이라고 한다. 구나 AABB 말고도 성능과 효율의 Trade-off에 따라 다양한 바운딩 볼륨이 존재한다. 책의 예제인 CK소프트렌더러에 정의된 AABB는 다음과 같다. // 책의 예제인 CK소프트렌더러에 정의된 AABB struct Box { public: FORCEINLINE constexpr Box() = default; FOR..

article thumbnail
바운딩 볼륨(Bounding volume)

이득우의 게임 수학 카메라 설정 값을 이용한 방법과 원근 투영 행렬을 이용한 방법에서 절두체 컬링이 잘 동작하는 것은 확인했지만, 가장자리에서 오브젝트가 갑자기 사라지거나 불쑥 생겨나는 현상이 있었다. 오브젝트의 위치를 이용해 절두체 내외부 판정을 하기 때문이다. 게임 오브젝트의 좌표가 절두체 외부에 있더라도, 메시가 차지하는 영역이 절두체와 겹친다면 그려줘야 한다. 게임 엔진은 메시가 차지하는 영역을 효과적으로 관리하기 위해 구(Sphere)나 박스(Box) 같은 원시 도형(Primitive shape)을 사용하는데, 이러한 원시 도형으로 설정한 공간 데이터를 바운딩 볼륨이라고 한다. 바운딩 볼륨에서 손쉽게 사용되는 원시 도형은 구다. 반지름을 통해 두 영역이 서로 겹치는지, 떨여져 있는지 가장 쉽게 ..

article thumbnail
원근 투영 행렬로부터 평면의 방정식 만들기

이득우의 게임 수학 뷰 공간의 점이 NDC 좌표까지 변환됐을 때 NDC 좌표의 x, y, z 값이 [-1, 1] 범위에 있다면, 해당 점은 절두체 안쪽에 있음을 의미한다. NDC 좌푯값을 수식으로 표현해보면 다음과 같다. 변환 과정을 거꾸로 추적하면서 수식을 살펴본다. NDC 좌표는 클립 좌표를 마지막 차원의 값 w로 나눈 결과이므로, 클립 좌표로 바꿔 쓰면 다음과 같다. 양 변에 w를 곱한다. 이 상태에서 가꾸로 뷰 공간에서 클립 공간으로 변환한 과정을 살펴본다. 뷰 공간의 점 v를 원근 투영 행렬을 사용해 클립 좌표로 변환하는 수식은 다음과 같다. 원근 투영 행렬을 P.row1부터 P.row4까지 4개의 행 벡터로 표현하면, 위 연산은 행 벡터와 점 v의 내적으로 바꿀 수 있다. 그러면 클립 공간의 ..

article thumbnail
절두체 컬링(Frustum Culling)

이득우의 게임 수학 이제 절두체를 구성하는 6개의 평면에 대한 방정식을 구해 카메라 시야 영역에서 벗어난 게임 오브젝트들을 솎아내는 기능인 절두체 컬링을 구현해본다. 근평면과 원평면을 제외한 4개의 측면 평면은 원점을 포함하기 때문에 원점으로부터의 거리를 의미하는 d의 값은 0이 된다. 따라서, 크기가 1인 법선 벡터만 구하면 4개의 측면 평면에 대한 방정식을 얻을 수 있다. 우선 절두체 상단 평면에 대해 생각해보자. 측면에서 보았을 때 오른쪽은 뷰 공간의 -z축에 대응되고, 위쪽은 y축에 대응된다. 오른쪽을 향하는 벡터 (0, 0, -1)을 반시계 방향으로 θ/2만큼 회전하고 90°만큼 더 회전하면 상단 평면의 법선 벡터를 구할 수 있다. (0, 0, -1)을 반시계 방향으로 θ/2만큼 회전한 벡터는 ..

article thumbnail
직선의 방정식

이득우의 게임 수학 평면의 방정식은 내적에 기반을 두기 때문에 2차원 공간에서도 동일하게 활용할 수 있다. - (ax₀ + by₀)는 상수이므로 c로 치환한다. 직선의 방정식은 다음과 같다. 법선 벡터 n의 크기가 1이면, c의 절댓값은 원점에서 직선까지의 최단 거리를 의미한다. 만약, 크기가 1이 아닌 법선 벡터 v(a', b')를 사용한다면 최단 거리는 다음과 같다. 3차원 평면과 마찬가지로 2차원 직선도 앞뒷쪽을 가진다. 임의의 점 P(x₁, y₁)가 법선 벡터 n(a, b)과 c로 정의된 평면의 바깥쪽에 있는지, 안쪽에 있는지 판별하는 수식은 다음과 같다. 이 수식에 절댓값을 취하면 젝선에서 P까지의 최단 거리가 된다. 직선의 방정식도 정규화할 수 있다.

검색 태그