Вам нужно, чтобы плоскости фруструма смотрели внутрь (их нормали должны указывать на центр).Тогда сброс рендеринга можно выполнить, проверив, находится ли объект полностью за пределами одной из шести плоскостей усеченного тела.Вы можете сделать это с помощью сферы, 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
}