基于沖量的剛體碰撞運動
來源:http://www.vbgamedev.com/AI/Impulsive.htm|
基于沖量的剛體碰撞運動
原作者: Katsuaki Kawachi ,Hiromasa Suzuki, Fumihiko Kimura,J¨org Sauer,Elmar,Sch omer 整理,編寫代碼: ZH1110
我們在模擬中通常會遇到三種接觸情況: 1.雙側(cè)的強制約束(Bilateral Constraints),約束始終保持,以前所研究過的是其中的一種方法. 2.瞬間非持久接觸(non-permanent permanent contacts),如鍛鐵、打樁等,可稱為碰撞。其特點是在很短的時間間隔內(nèi)物體的速度發(fā)生突然的變化,所以我們很難直接計算其受力大小,而要通過碰撞前后速度變化的規(guī)律入手。在這一章我們主要討論基于沖量的兩剛體碰撞運動。 3.持久接觸(permanent contacts)第一種的特殊情況.運動著的物體,突然對其施加約束,物體的速度也會發(fā)生突變。但在一定條件下約束會消失.他是基于約束(Constraint-based)的 圖1,接觸的三種情況
本節(jié)將根據(jù)動力學(xué)的基本原理對碰撞現(xiàn)象進行描述,討論其的基本規(guī)律,及計算。
基本的沖突碰撞
一.簡化模型的基本的假設(shè): 1.剛體是堅硬的不會因碰撞發(fā)生變形 2.對象是多邊形 3.摩擦計算基于庫侖定律 我們使用下面的符號來表示用到的物理量:(粗體-矢量,常規(guī)-標量)
ra,rb在碰撞過程中不會改變,因為假設(shè)剛體在碰撞過程中不發(fā)生位置的變化. 寫成如下形式:
Va為碰撞前剛體A在碰撞點P的速度,Va'為碰撞后剛體A在碰撞點P的速度
角速度與線速度變化遵守沖量定理:
通過⑴,⑵方程式,我們合并為:
⑶
這個方程除了vA'還有Pn是未知量.注意:后面代碼我們是把N提到括號外面,計算沖量Pn的矢量數(shù)值的。
將后面已知部分化簡為一常量矢量CA, 類似的我們可得B物體的簡寫方程式:
B物體的N是相反的,即-N.
利用Va,Vb的的相對速度Vn,可以判斷是否發(fā)生碰撞,如果Vn < 0意味著發(fā)生碰撞,如果Vn = 0意味著發(fā)生接觸,如果Vn > 0意味著發(fā)生分離.Vn的定義如下:
和并后個方程式可得碰撞以后的相對速度V'n
如果有n個碰撞點這個方程可擴展為:
為了計算P,定義一個恢復(fù)因數(shù)ξ,(牛頓認為碰撞前后相對速度的比為此常數(shù),且該常數(shù)與碰撞物體的材料性質(zhì)有關(guān),與物體的形狀、大小與碰撞前的速度無關(guān)。)這個重要公式為:
它表明:如果發(fā)生碰撞( Pn<>0 ),那么方程就變?yōu)?/font> Vn'=-ξVn ⑼
計算剛體碰撞運動的一般過程: 1.利用碰撞檢測技術(shù)檢測發(fā)生碰撞的二剛體及碰撞點P,碰撞的垂直方向N 2.使用公式⑸計算相對速度Vn.如果Vn>=0,表示兩物體處于分離,不再進行計算退出. 使用公式⑼計算相對速度Vn'. 3.使用公式⑶,⑷計算常量Ca,Cb(如果是地面,可將其看做一個質(zhì)量很大的剛體,也可單獨處理) 4.使用公式⑹計算碰撞的垂直沖量Pn 5.將Pn代入⑵即可得到二剛體碰撞后的狀態(tài). 代碼如下: Private Sub process_collision(Boxa As box, Boxb As box, collpos As D3DVECTOR, colN As D3DVECTOR, extra As Single) cl.Vn2 = -0.4 * cl.Vn '垂直相對速度(碰撞后),0.4是恢復(fù)因數(shù) If cl.Vn >= 0 Then Exit Sub '計算Ca Ca = 1/m+((Ra×N)/Iz×Ra)N Cb = 1/m+((Rb×N)/Iz×Rb)N D3DXVec3Scale cl.Pn, cl.N, ((cl.Vn2 - cl.Vn) / (cl.Ca + cl.Cb)) 摩擦沖量 既然碰撞的正方向可以應(yīng)用沖量方程,那么在與之相垂直的方向(摩擦力方向)也可用此方程,只是后面的判斷方法不同. 如果2個對象接觸并滑行,摩擦力會一直作用于滑行點上,同樣的如果發(fā)生碰撞,正沖量與摩擦沖量也同時工作,我們描述摩擦產(chǎn)生的沖量為摩擦沖量. 如果摩擦力做工,相切的摩擦沖量將要運做,(t是單位矢量相切于碰撞的邊,它的方向可通過P的的速度判斷.)如圖: 這種情況,相切的速度與沖量關(guān)系可以寫成類似于方程⑶的形式,:
在碰撞期間的摩擦力 在無摩擦的系統(tǒng)下,正接觸力fn(t)在[t0,t1]段間持續(xù)的作用于2剛體上,因此P點的正沖量為:
現(xiàn)在假設(shè)在P點的速度在碰撞開始和期間始終不為0,等量摩擦力ft(t)持續(xù)的作用,P點的摩擦量沖為:
假設(shè)在P點碰撞期速度變成了0,摩擦力頂多保持在靜摩擦狀態(tài),摩擦量沖被限制在:
從上面的推斷我們可以推斷摩擦沖量的計算過程: 1.根據(jù)式⑼與式(11)的摩擦沖量都計算出來 2.如果前者小于后者表示動摩擦力不能一直維持到碰撞結(jié)束,實際摩擦沖量為前者,反之亦然.
... clnew.tangent_vel = Subtract(Vr_all, VScale(clnew.N, Dot(Vr_all, clnew.N)))'tangent_vel=Va-((Va·N-Vb·N)*N) '相切的速度 applyimpulse Boxa, VScale(T, clnew.Pt), collpos '應(yīng)用摩擦沖量 刺透處理 為防止一物體刺穿另一物體,需要對刺穿進行處理.一個方法是檢測時計算出刺入的深度,后在碰撞副加一微小沖量,使其分離.簡單的考慮到一次就對半分離過于突然,不能取得最好的效果,所以每次以按一比例分離
另一個簡單方法是直接修改剛體的位置: 目前流行的物理引擎都是通過高級碰撞檢測技術(shù)即未發(fā)生刺穿前? |

