2017-09-15 25 views
1

我正在嘗試查找或搜索一種方法,該方法可以快速查找將由視錐體包含的大小爲L的所有立方體。甚至可能使用cuda。用於在視覺平截頭體中查找大小爲L的所有立方體的方法?

我做了一個DDA遍歷raycasting,這對我來說很簡單,因爲我只沿着一條已知距離的線移動。

我的直覺是創建了一個平截頭體的邊界框,並將這個空間細分成一個大小爲L的立方體的空間網格。然後測試網格中每個單元的中心是否在平截頭體內。考慮到錐體是一個金字塔,似乎大約一半的單元會被一個邊界框佔據,我覺得這種方法只是做了太多的工作。它肯定會工作,但我希望不那麼天真或更快的幾何方法。

也許光線先投射左壁,然後右壁第二條線然後在這兩條線之間投射?簡而言之,尋找類似DDA遍歷的R3版本。

+0

整個立方體是否需要包含在平截頭體內? –

+0

並非完全不是,我認爲裏面是任何頂點在平截頭體內。我並不擔心旋轉的立方體夾住截錐體的角落的情況。我的世界由hermite數據組成,因此軸對齊。 –

回答

0

檢測頂點是否位於平截頭體內的最快方法是dot product。平截頭體由4個平面組成,即頂部,底部,左側,右側和兩個z值,前後剪切。對於每個頂點檢查兩件事情:首先,它在前面還是後面?如果不是,它在四架飛機裏面嗎?

  1. 要檢查頂點超出前或後面板您檢查vertex.Z對您的截:

    isInsideZ = vertex.Z >= frustrum.Zmin && vertex.Z <= frustrum.Zmax; 
    
  2. 要檢查它是否是四截「牆」,你需要計算內爲他們的cross vectors,面向frustrum的中心。然後檢查每個交叉矢量的點積和相對於相應平面的頂點的位置矢量。您可以通過從您測試的頂點減去平面上的某個任意點來獲得此位置矢量。如果點積爲正,那麼該頂點在之上

    isAbove[i] = Vector3D.Dot(cross[i], vertex - planeloc[i]) > 0; 
    

    哪裏planeloc[i]任何點位於相應的平面

頂點是截內,如果滿足所有條件:

isInside = isInsideZ && isAbove[0] && isAbove[1] && isAbove[2] && isAbove[3]; 

這聽起來有點彆扭來處理,但很多事情可以磨削外循環來完成,如計算叉積,即截平面法線或平面位置矢量。例如,如果一個平面跨越(1,0,0), (1,1,0)那麼(1,0,0)已經表示位於該平面上的點。

+0

是的,計算平截頭體測試非常簡單。我正在尋找一種更有效的方法來獲得由一個平截頭體包含的大小爲L的軸對齊邊界框的列表。所以我現在做的是獲得平截頭體本身的AABB,並使用你所建議的測試從最左到最右,從最上到最下方循環:IsInsideFrustum,從平截頭體獲得AABB包括投射歸一化點進入世界的近平面和遠平面:-1,1或0,1取決於您的系統,然後查找最小/最大垂直距離。我仍然覺得可能會有更直接的方法。一個預感 –

+0

你可以計算一個3x3變換矩陣,它將形成一個軸對齊的立方體,然後用它轉換任何頂點,並檢查xmin yacc

+0

如果frustrum始終與一個固定的孔徑角軸對齊,你可以計算出一個扭曲因子,這樣你就可以檢查'xmin yacc