看了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,回溯求得所有三角形個數。但是再仔細一看因為有重疊三角形和倒置的三角形,所以這個方法不可行。接著找到三角形個數由三部分組成 ...