所以,我試圖實施截錐體撲殺。這裏的事情是,在我能做到這一點之前,我需要了解一些事情。查看截錐體撲滅問題
首先其中,是平面的交點:
我的理解是一個平面可以通過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.
}
這背後的邏輯推理是,由於視圖錐臺包含六個不同的平面(近,遠,左,上,右,下) ,我們希望抓住這六個平面中的每一個,並且基本上將它們「傳遞」到對於單個點(對於該點來說是一個點,六個測試)的函數crossesPlane()
。
如果這六個電話中的一個crossesPlane()
回報false
,然後我們要剔除有問題的點,從而有效地導致點被截錐被淘汰,當然還有點不會被渲染。
問題
- 這是一個正確的做法,以正確撲殺視圖錐臺?
- 如果是這樣,將給出一個給定的多邊形的頂點的任意列表,並使用這種方法在每個頂點上執行這個測試,是一個有效的方法去實現它?
- 儘管AABB可以用來替代剔除測試中的多邊形/網格,但是它們仍然常用於此場景,它們仍然被認爲是「常規」goto方法嗎?
注意
如果有任何值得D3D和OpenGL這間提的實現差異,這將是肯定的讚賞。
通常我們做的同質變換檢查,對視錐的飛機,從而使比較的對象1,-1等 –
@MarkPing前:真正用於測試各個頂點,而不是像或的AABB邊界的形狀因爲這些形狀在同質空間中不再是球形的矩形。因此,AFAIK在視圖空間測試更爲常見。 – cdoubleplusgood