점 $\vec{p}$ 가 NDC 공간의 평면 안쪽에 있는지 여부를 돌려줍니다. 인자로 준 p 는 반드시 클립 좌표(clip coordinate)이어야 합니다. 해당 함수들은 Renderer.clipTriangle0() 의 구현에 사용됩니다.

Syntax

testRight(p);
testLeft(p);
testTop(p);
testBottom(p);
testFar(p);
testNear(p);

Parameters

p

NDC 공간의 평면 안에 있는지 확인할 점을 나타내는 Vector2 . 반드시 클립 좌표(clip coordinate)이어야 합니다.

Return value

클립 좌표(clip coordinate)인 점 $\vec{p}$ 가 NDC 공간 안에 위치한지 여부를 나타내는 number . 예를 들어 p 가 NDC 공간 안에 있다면 1 . 바깥에 있다면 0 을 돌려줍니다

Description

Camera.perspective() 를 통해 원근투영을 적용하게 되면, 절두체(Frustum) 안에 들어있는 모든 점들의 $x, y, z$ 성분들은 $[-1, 1]$ 범위의 값을 가지게 됩니다. 그렇다면 삼각형의 일부만 절두체(frustum) 내부에 있는 경우는 어떻게 처리해야 할까요?

카메라의 영역을 벗어나는 것도 문제지만, $near$ 평면을 벗어난 점이 있다면 삼각형의 상하가 뒤집히게 되겠죠 (물론 그것보다도 삼각형이 기하급수적으로 커져서 RendererJS 가 프리징(freezing)에 걸릴겁니다). 이런 상황들을 방지하기 위해, 삼각형을 잘라내서 절두체(frustum) 안에 들어있는 부분만 그려내야됩니다.

testRight(), testLeft(), testTop(), testBottom(), testFar(), testNear() 함수들은 여기서 인자로 받은 점 $\vec{p}$ 가 NDC 공간 안에 위치한지를 검사하는 역할을 담당합니다. NDC 공간은 여기서 절두체(frustum)를 정사각형으로 정규화한 공간을 의미합니다. Normalized Device Coordinate 의 약자로, 이름 그대로 정규화되었기 때문에 $[-1, 1]$ 범위의 값을 가집니다:

정규화된 절두체(frustum) 공간을 나타내는 NDC 공간.

정규화된 절두체(frustum) 공간을 나타내는 NDC 공간.

그렇다면 여기서 testNear() 의 구현을 생각해봅시다. NDC 공간의 점을 나타내는 $\vec{p_{ndc}} = (x_{ndc}, \text{ }y_{ndc}, \text{ }z_{ndc})$ 가 있다고 해보죠. $Near$ 평면은 $z = -1$ 인 평면을 의미합니다. 그렇다면 $Near$ 평면의 안쪽에 있다면 $z_{ndc} ≤ -1$ 이어야 하겠네요. 반대로 $Far$ 평면은 $z = 1$ 인 평면을 의미하며, $Far$ 평면의 안쪽에 있다면 $z_{ndc} ≤ 1$ 이어야 합니다.

즉 하나의 평면이 아니라, $\vec{p_{ndc}}$ 가 NDC 공간 내부에 있다면, 다음 조건을 만족해야 한다는 의미입니다:

$$ -1 \le x_{ndc} < 1 \\ -1 \le y_{ndc} < 1 \\ -1 \le z_{ndc} < 1 \\ $$