irrlicht圓球與三角形碰撞測試

2021-06-28 19:53:13 字數 1236 閱讀 3631

看了irrlicht terrian例子,裡面攝影機重力track中涉及乙個球與三角形的碰撞函式:

cscenecollisionmanager::test********intersection

**中注釋較為簡單,這裡稍為補充一下,

主要是利用圓球半徑為1這個條件建立二次方程求根,得到碰撞發生的時間點

橢圓標準化為半徑為1的球(通過對三角形的三個頂點實施縮放實現)

case 1:

首先測試圓心與三角形所在平面的交點

如果交點在三角形之內,則認為碰撞發生,並根速度求出t

case 2:

測試三角形的頂點是否與圓碰撞

假設速度向量為vx vy vz,

初始圓心所在位置為 bx by bz

碰撞點自然為px py pz

新的圓心為

b(new)x = t*vx 

b(new)y = t*vy 

b(new)z = t*vz

根據圓的特點有

(px - b(new)x)^2 + (py - b(new)y)^2 + (pz - b(new)z)^2 = 1

將b(new)的分量分別用t代入,可以得到乙個二次方程,求根,就可以得到t

case 3:

與三角形的邊相碰撞

同樣,求出新圓心與三角形某個頂點p的向量d1的長度平方:

leng_sqrt(d1) = (px - b(new)x)^2 + (py - b(new)y)^2 + (pz - b(new)z)^2

其中b(new)向量如case2所示

同時,向量d1某在三角形某個邊上v投影成乙個向量d2,

根據圓球

有d1^2 + d2^2 = 1 ---- 式1

同時d2的長度可以直接用向量點乘算出

v歸一化後,與d1進行點乘,就可以得到d2

d2演算法如下

length(d2) = dot(normalise(v), d1);

將lenght(d2)代入式1,就是cscenecollisionmanager::test********intersection 最後一部分的二次方程的由來

滑動處理:

設乙個滑動值 sliding_vel

根據碰撞點,以及相應切平面的法線,得到乙個向量v

物體在碰撞檢測前的目的點dest,與向量v相減

就會得到沿著碰撞切面滑動的點p,

p與dest重新進行一輪碰撞檢測,直到p與dest之間的距離小於某個閥值,停止遞迴

圓與三角形(圓與三角形是否相交)

給出圓的圓心和半徑,以及三角形的三個頂點,問圓同三角形是否相交。相交輸出 yes 否則輸出 no 三角形的面積大於0 第1行 乙個數t,表示輸入的測試數量 1 t 10000 之後每4行用來描述一組測試資料。4 1 三個數,前兩個數為圓心的座標xc,yc,第3個數為圓的半徑r。3000 xc,yc ...

圓與三角形

1298 圓與三角形 基準時間限制 1 秒 空間限制 131072 kb 分值 0 難度 基礎題 給出圓的圓心和半徑,以及三角形的三個頂點,問圓同三角形是否相交。相交輸出 yes 否則輸出 no 三角形的面積大於0 第1行 乙個數t,表示輸入的測試數量 1 t 10000 之後每4行用來描述一組測試...

求大三角形中三角形個數

一道筆試程式設計題要求求乙個大三角形中所有小三角形的個數,大約是下面這種情況 首先想到是的將問題由求邊長為n的三角形個數 求邊長為n 1的三角形個數 求邊長為1的三角形個數 1,回溯求得所有三角形個數。但是再仔細一看因為有重疊三角形和倒置的三角形,所以這個方法不可行。接著找到三角形個數由三部分組成 ...