光線追蹤的效率問題一直以來都是關注的焦點,因為很多時候都會有非常多的求交運算要執行。目前幾乎所有的加速演算法都是儘量減少求交運算量,比如octree、kd-tree、包圍盒(及層次包圍盒)等。基於空間分割的演算法最重要的就是如何有效地分隔空間,讓場景細節和主體脫離(劃分在不同的層次中)。
層次包圍盒對空間的利用率非常高,如果場景中有多處細節中心,如何有效地構造包圍盒層次來分別體現場景的細節就是演算法成敗的根本。當場將中有成千上萬個多邊形的時候,不可能手工構造,只能依靠演算法來實現。在實踐中,我實現了乙個快速構造層次包圍盒的演算法,只需要通過一次掃瞄就能構造相對有效的層次包圍盒模型。演算法的核心主要是對細節的發現和分離。
試驗結果如下:
5120個三角形,層次包圍盒:5秒;普通演算法:49秒。
10804個三角形,採用層次包圍盒:11秒;普通演算法:1分46秒。
可以看出,採用層次包圍盒的演算法快了10倍左右。對於圖1來說,場景細節中心分散,並且沒有主次。對於圖2來說,場景細節中心集中,而且被外部更大的空間所包圍。演算法對這兩種不同型別的場景都能很好的構造層次包圍盒加速渲染。
AABB包圍盒 OBB包圍盒 包圍球的比較
1 aabb 包圍盒 aabb 包圍盒是與座標軸對齊的包圍盒,簡單性好,緊密性較差 尤其對斜對角方向放置的瘦長形物件,採用aabb,將留下很大的邊角空隙,導致大量沒必要的包圍盒相交測試 當物體旋轉之後需對aabb 進行同樣的旋轉並更新 當物體變形之後只需對變形了的基本幾何元素對應的包圍盒重新計算 然...
AABB包圍盒 OBB包圍盒 包圍球的比較
1 aabb 包圍盒 aabb 包圍盒是與座標軸對齊的包圍盒,簡單性好,緊密性較差 尤其對斜對角方向放置的瘦長形物件,採用aabb,將留下非常大的邊角空隙,導致大量不是必需的包圍盒相交測試 當物體旋轉之後需對aabb 進行相同的旋轉並更新 當物體變形之後僅僅需對變形了的基本幾何元素相應的包圍盒又一次...
光線與包圍盒(AABB)的相交檢測演算法
侵刪 這裡介紹兩種演算法,第一種比較容易理解 下面是cocos2dx中實現ray aabb相交 碰撞 檢測的演算法,說明看注釋 cpp view plain copy print bool ray intersects const aabb aabb const 若射線沿y軸方向有分量 判斷是否與包...