[英]Problems with Bounding Box Frustum Culling
我無法讓正確的截錐體剔除工作。 我從某人那里得到了一個關於 AABB 點測試的好建議,它效果很好,但我已經到了最大值和最小值點測試並不總是有效的地步,因為它們通常不會在截錐體中,而是來自其中一個的平面雙方將。 所以我需要進行完整的邊界框檢測。 我已經有了根據截錐體平面檢查邊界框的代碼,只需要設置邊界框。
有沒有人有代碼示例或有關如何執行此操作的想法。 我用來創建邊界框的兩點是最小 xy 和 z 以及最大 xy 和 z。
謝謝: :)
您需要讓截錐體的平面向內看(它們的法線必須指向中心)。 然后可以通過檢查 object 是否完全位於截錐體的六個平面之一之外來完成渲染丟棄。 您可以使用球體或 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
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.