光線與包圍盒(AABB)的相交檢測演算法

2021-07-11 10:34:19 字數 1531 閱讀 4693

**:  侵刪

這裡介紹兩種演算法,第一種比較容易理解

下面是cocos2dx中實現ray-aabb相交(碰撞)檢測的演算法,說明看注釋

[cpp]view plain

copy

print

?bool

ray::intersects(

const

aabb& aabb) 

const

}  }  //若射線沿y軸方向有分量 判斷是否與包圍盒y軸方向有交點

if(dir.y != 0.f)  

}  }  //若射線沿z軸方向有分量 判斷是否與包圍盒y軸方向有交點

if(dir.z != 0.f)  

}  }  return

false

;  }  

下面是另外一種ray-aabb檢測演算法,稱為"slabs method"

觀察上述三幅圖可以得出,只要發生區間交疊,光線與平面就能相交,

那麼區間交疊出現的條件便是:光線進入平面處的最大t值小於光線離開平面處的最小t值

那麼問題就變成了如何求 光線進入平面處的最大t值 以及 光線離開平面處的最小t值

這個問題很簡單,通過光線與平面相交的引數方程求解就可以了,

光線的引數方程為r(t) = o + t * dir

一般平面方程為ax+by+cz+d=0,因為aabb的六個面分別平行於xy、xz、yz平面,所以平面的方程為x=d,y=d,z=d

光線與垂直於x軸的兩個面相交時,t = (d - o.x) / dir.x

光線與垂直於y軸的兩個面相交時,t = (d - o.y) / dir.y

光線與垂直於z軸的兩個面相交時,t = (d - o.z) / dir.z

注意到t<0時,交點位於光線的起點之後,則光線(射線)並未與盒體發生相交

[cpp]view plain

copy

print

?bool

bbox::hit(

const

ray& ray) 

const

else

else

}  if(abs(dy) 

else

else

}  if(abs(dz) 

else

else

}  double

t0,t1;  

//光線進入平面處(最靠近的平面)的最大t值 

t0=max(tz_min,max(tx_min,ty_min));  

//光線離開平面處(最遠離的平面)的最小t值

t1=min(tz_max,min(tx_max,ty_max));  

return

t0}  

AABB包圍盒 OBB包圍盒 包圍球的比較

1 aabb 包圍盒 aabb 包圍盒是與座標軸對齊的包圍盒,簡單性好,緊密性較差 尤其對斜對角方向放置的瘦長形物件,採用aabb,將留下很大的邊角空隙,導致大量沒必要的包圍盒相交測試 當物體旋轉之後需對aabb 進行同樣的旋轉並更新 當物體變形之後只需對變形了的基本幾何元素對應的包圍盒重新計算 然...

AABB包圍盒 OBB包圍盒 包圍球的比較

1 aabb 包圍盒 aabb 包圍盒是與座標軸對齊的包圍盒,簡單性好,緊密性較差 尤其對斜對角方向放置的瘦長形物件,採用aabb,將留下非常大的邊角空隙,導致大量不是必需的包圍盒相交測試 當物體旋轉之後需對aabb 進行相同的旋轉並更新 當物體變形之後僅僅需對變形了的基本幾何元素相應的包圍盒又一次...

包圍球與包圍盒的碰撞檢測

碰撞檢測演算法的引申問題 盒子和盒子的碰撞,或者球和球的碰撞已經有太多的討 章,這裡不說 這裡只說盒子和球的碰撞 二維情況 問題描述 平面任意的矩形和乙個圓是否相交的判定 分析 圓和矩形相交發生情況下,球心在什麼區域呢?區域的形狀是個圓角矩形,如下示意圖 綠色為矩形的部分,當圓的圓心衛浴藍色和綠色的...