有關osg交集的一些總結

交集

          你可以將通過點擊鼠標的節點選擇想象成是從鼠標(光標)位置向場景中發射了一條射線。被鼠標選中的場景部分將與射線有一個交集。如果場景是由線和點元素組成的,那麼射線的交運算可能無法符合用戶的實際選擇,因爲鼠標的位置幾乎無法與這些圖元產生精確的空間交集。

         此外,在典型的透視渲染中,射線交運算的精度將與觀察者所處的距離成反比。OSG 使用一種名爲多胞體(polytope)的金字塔形包圍盒代替射線,以克服上述的問題。這種金字塔形的頂峯位於視點,其中心軸直接穿過鼠標(光標)的位置。它距離視點的寬度是由視場和程序控制的寬度參數決定的。OSG 使用場景圖形的自頂向下的繼承結構,從而避免了OpenGL 普遍存在的“ 遲鈍的” 選擇特性, 而在本地CPU 上進行高效的計算。
         osgUtil::IntersectionVisitor 類繼承自NodeVisitor,它可以檢測每個定點的包圍盒與交集包圍盒的關係,並允許在某個子圖形不可能存在有交集的子節點時,跳過該子圖形的遍歷。IntersectionVisitor 是一個純虛類,可以從它的派生類實例化,例如:osgUtil::PolytopeIntersector 類。    

        有些程序需要拾取單獨的頂點和多邊形;而有些程序只需要簡單地獲取那些包含了被選節點的Group 或Transform 父節點。IntersectionVisitor 返回osg::NodePath 對象來滿足這些需求。NodePath 是一個std::vector<osg::Node>向量,它表示沿着從根節點到葉節點的、呈現出一定排列層次的節點路線。如果用
戶程序需要獲取中間的Group 組節點,那麼只需要從後向前搜索滿足程序要求的節點即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章