그래서 절두체 도려 내기를 구현하려고합니다. 여기에있는 일은 내가 할 수 있기 전에 몇 가지를 이해해야한다는 것입니다.절두체 도려 내기 질문보기
의우선, 평면의 교차점이다
내 이해 평면은 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 사이에 언급 할 가치 구현 차이가있는 경우
주
은, 확실히 이해할 수있을 것이다.
일반적으로 우리 수행 비교가 1, -1, 등에 대해 –
@MarkPing 것을, 그래서 절두체 평면에 대해 확인하기 전에 균일 변환 : 참 개별 정점을 테스트하기 위해,하지만 경계 상자 또는 경계와 같은 모양에 대한 이러한 형상은 균일 한 공간에서 더 이상 구형의 직사각형이 아니기 때문입니다. 따라서 뷰 공간에서 테스트하는 AFAIK가 더 일반적입니다. – cdoubleplusgood