我无法让正确的截锥体剔除工作。我从某人那里得到了一个关于 AABB 点测试的好建议,它效果很好,但我已经到了最大值和最小值点测试并不总是有效的地步,因为它们通常不会在截锥体中,而是来自其中一个的平面双方将。所以我需要进行完整的边界框检测。我已经有了根据截锥体平面检查边界框的代码,只需要设置边界框。
有没有人有代码示例或有关如何执行此操作的想法。我用来创建边界框的两点是最小 xy 和 z 以及最大 xy 和 z。
谢谢!:)
我无法让正确的截锥体剔除工作。我从某人那里得到了一个关于 AABB 点测试的好建议,它效果很好,但我已经到了最大值和最小值点测试并不总是有效的地步,因为它们通常不会在截锥体中,而是来自其中一个的平面双方将。所以我需要进行完整的边界框检测。我已经有了根据截锥体平面检查边界框的代码,只需要设置边界框。
有没有人有代码示例或有关如何执行此操作的想法。我用来创建边界框的两点是最小 xy 和 z 以及最大 xy 和 z。
谢谢!:)
您需要让截锥体的平面向内看(它们的法线必须指向中心)。然后可以通过检查对象是否完全在截锥体的六个平面之一之外来完成渲染丢弃。您可以使用球体或 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
}