3

그래서 절두체 도려 내기를 구현하려고합니다. 여기에있는 일은 내가 할 수 있기 전에 몇 가지를 이해해야한다는 것입니다.절두체 도려 내기 질문보기

우선, 평면의 교차점이다

내 이해 평면은 3 포인트를 통해 정의 될 수 있다는 점이다; p0, p1, and p2이라고 부르 자.

우리는 다음과 같이 일반 비행기의 계산 될 수 있음을 알고 있음을 감안할 때 :

(사이비 코드) 이제

vec3 edge0 = p1 - p0; 
vec3 edge1 = p2 - p0; 

vec3 normal = normalize(cross(edge0, edg1)) // => edge1 X edge2/length(edge1 X edge2); 

,의 우리가 기본적으로 여부를 우리에게 알려주는 기능을 가지고 가정 해 봅시다 주어진 점은 비행기를 "교차"합니다.

(moar 의사 코드)

bool crossesPlane(vec3 plane[3], vec3 point) 
{ 
    vec3 normal = getNormal(plane); // perform same operations as described above 
    float D = dot(-normal, plane[ 0 ]); // plane[ 0 ] is arbitrary - could just as well be the 2nd or 3rd point in the array 

    float dist = dot(normal, point) + D; 

    return dist >= 0; // dist < 0 means we're on the opposite side of the plane's normal. 
} 
배후 논리 추론은

, 그 뷰 프러스 텀 여섯 개 분리면을 포함하기 때문에 (근처까지, 왼쪽, 위쪽, 오른쪽 아래) 우리는이 6 개의 평면을 각각 잡고 "crossesPlane()"함수에 "통과"시키려합니다. 한 포인트 (한 포인트, 그 포인트에 대한 여섯 테스트).

crossesPlane()에 대한 6 개의 호출 중 하나가 false을 반환하면 문제의 포인트를 제거하여 효과적으로 포인트가 절두체에 의해 컬링되고 결과적으로 포인트가 렌더되지 않습니다.

질문

  • 이 제대로 추려 뷰 프러스 텀에 대한 올바른 접근 방식인가?
  • 그렇다면 주어진 폴리곤에 대한 임의의 정점 목록을 가져 와서이 방법을 사용하여 각 정점에 대해이 테스트를 수행하면 효과적일까요?
  • 컬 테스트를 위해 폴리곤/메쉬 대신 AABB를 사용할 수 있지만이 시나리오에서는 여전히 일반적으로 사용되며 여전히 "일반적인"goto 방식으로 간주됩니까? 이것에 대한 D3D와 OpenGL 사이에 언급 할 가치 구현 차이가있는 경우

은, 확실히 이해할 수있을 것이다.

+0

일반적으로 우리 수행 비교가 1, -1, 등에 대해 –

+1

@MarkPing 것을, 그래서 절두체 평면에 대해 확인하기 전에 균일 변환 : 참 개별 정점을 테스트하기 위해,하지만 경계 상자 또는 경계와 같은 모양에 대한 이러한 형상은 균일 한 공간에서 더 이상 구형의 직사각형이 아니기 때문입니다. 따라서 뷰 공간에서 테스트하는 AFAIK가 더 일반적입니다. – cdoubleplusgood

답변

3
  • 예, 본질적으로 절두체 컬링 포인트에 대한 올바른 접근 방식입니다.
  • 아니요, 각 정점에 대해 개별적으로이 테스트를 수행하는 것은 임의의 다각형을 제거하는 효과적인 방법이 아닙니다. 절두체와 교차하는 하나의 매우 큰 삼각형의 경우를 생각해보십시오. 모든 꼭지점이 절두체 바깥에있을 수 있지만 삼각형은 절두체와 여전히 교차하여 렌더링되어야합니다.
  • AABB는 절두체 컬링에 사용할 수 있으며 종종 절두체 외부의 꼭지점을 가지지 만 절두체와 교차하는 AABB의 경우를 처리해야하지만 종종 좋은 선택입니다. 경계 영역은 내부/외부 테스트를 다소 단순하게하지만 포함 된 객체 주위의 경계가 느슨해지는 경향이 있습니다.그러나 이것은 종종 합리적인 교환입니다.
2

일반적으로 귀하의 접근 방법은 정확합니다.
일반적으로 임의 모양의 각 꼭지점을 테스트하는 대신 AABB 또는 경계 구가 사용됩니다.
그러나 AABB의 경우 모든 코너가 절두체 외부에 있지만 상자가 절두체와 교차하는 상황이 있습니다. 보수적 인 해결책은 모든 모서리가 적어도 하나의 평면의 바깥쪽에있는 경우 상자 만 거부하는 것입니다.
AABB에 대한 일반적인 최적화가 있습니다. 절두체의 각 평면에 대해, 6 개의 모서리 대신 "가장 가까운"모서리와 "가장 가까운"모서리를 확인하면됩니다. 이것과 일반적으로 컬링 프러스 텀을위한 훌륭한 자원이있다 :
http://www.lighthouse3d.com/tutorials/view-frustum-culling/

편집 : 다음은 완전하게 하나가 하나 개의 평면의 바깥 쪽 만, 여전히 교차하지 않는있는 경계 상자를 발견하는 방법을 한 번 더 글입니다 절두체 :
http://www.iquilezles.org/www/articles/frustumcorrect/frustumcorrect.htm