錐台の平面を内側に向ける必要があります (法線は中心を指している必要があります)。次に、オブジェクトが錐台の 6 つの平面のいずれかの外側に完全にあるかどうかを確認することで、レンダリングの破棄を行うことができます。球、AABB、または平面までの距離 (および側面) を計算できるその他のコンテナーを使用してそれを行うことができます。
私自身の平面コードから (つまり、平面が -1 を返した場合、レンダリングを破棄します)、いくつかのコメントを追加して、理解しやすくしました。
int Side(const Sphere &e) const {
float d=Distance(e.center);
if(d-e.radius>Epsilon) return 1; // inside
if(d+e.radius<-Epsilon) return -1; // outside
return 0; // crossing the plane
}
int Side(const Vector3f &v) const {
float d=Distance(v);
if(d>Epsilon) return 1;
if(d<-Epsilon) return -1;
return 0;
}
int Side(const Box3f &c) const {
Vector3f a,b;
if(Normal.x>=0.0) { a.x=c.min.x; b.x=c.max.x; }
else { b.x=c.min.x; a.x=c.max.x; }
if(Normal.y>=0.0) { a.y=c.min.y; b.y=c.max.y; }
else { b.y=c.min.y; a.y=c.max.y; }
if(Normal.z>=0.0) { a.z=c.min.z; b.z=c.max.z; }
else { b.z=c.min.z; a.z=c.max.z; }
int l1 = Side(a), l2= Side(b);
if(l1==l2) return l1; // both in the same side
return 0; // we have the object crossing the plane
}