基于沖量的剛體碰撞運動
原作者:
Katsuaki Kawachi ,Hiromasa Suzuki, Fumihiko Kimura,J¨org Sauer,Elmar,Sch omer
整理,編寫代碼: ZH1110
我們在模擬中通常會遇到三種接觸情況:
1.雙側的強制約束(Bilateral Constraints),約束始終保持,以前所研究過的是其中的一種方法.
2.瞬間非持久接觸(non-permanent permanent contacts),如鍛鐵、打樁等,可稱為碰撞。其特點是在很短的時間間隔內物體的速度發生突然的變化,所以我們很難直接計算其受力大小,而要通過碰撞前后速度變化的規律入手。在這一章我們主要討論基于沖量的兩剛體碰撞運動。
3.持久接觸(permanent contacts)第一種的特殊情況.運動著的物體,突然對其施加約束,物體的速度也會發生突變。但在一定條件下約束會消失.他是基于約束(Constraint-based)的

圖1,接觸的三種情況
本節將根據動力學的基本原理對碰撞現象進行描述,討論其的基本規律,及計算。
基本的沖突碰撞
一.簡化模型的基本的假設:
1.剛體是堅硬的不會因碰撞發生變形
2.對象是多邊形
3.摩擦計算基于庫侖定律
我們使用下面的符號來表示用到的物理量:(粗體-矢量,常規-標量)
ma ,mb
|
對象a,b的質量 |
Ia ,Ib
|
慣性矩, 轉動慣量 |
uA ,uB
|
在碰撞前物體A,B中心線速度矢量 |
uA',uB'
|
在碰撞以后物體A,B中心線速度矢量 |
ωA ,ωB
|
碰撞前角速度 |
ωA',ωB'
|
碰撞以后角速度 |
P
|
碰撞點 |
vA ,vB
|
在碰撞前撞擊點線速度矢量 |
vA',vB'
|
在碰撞以后撞擊點線速度矢量 |
GA ,GB
|
重心坐標 |
rA ,rB
|
重心坐標到碰撞點的矢量 |
Pn
|
碰撞的垂直沖量(Pn=Pn*N) |
ra,rb在碰撞過程中不會改變,因為假設剛體在碰撞過程中不發生位置的變化.
寫成如下形式:
⑴
Va為碰撞前剛體A在碰撞點P的速度,Va'為碰撞后剛體A在碰撞點P的速度

角速度與線速度變化遵守沖量定理:
⑵
通過⑴,⑵方程式,我們合并為:
⑶
這個方程除了vA'還有Pn是未知量.注意:后面代碼我們是把N提到括號外面,計算沖量Pn的矢量數值的。
將后面已知部分化簡為一常量矢量CA, 類似的我們可得B物體的簡寫方程式:
⑷
B物體的N是相反的,即-N.
利用Va,Vb的的相對速度Vn,可以判斷是否發生碰撞,如果Vn < 0意味著發生碰撞,如果Vn = 0意味著發生接觸,如果Vn > 0意味著發生分離.Vn的定義如下:
⑸
和并后個方程式可得碰撞以后的相對速度V'n
⑹
如果有n個碰撞點這個方程可擴展為:
⑺ (本章暫不討論多個碰撞點同時發生的情況)
為了計算P,定義一個恢復因數ξ,(牛頓認為碰撞前后相對速度的比為此常數,且該常數與碰撞物體的材料性質有關,與物體的形狀、大小與碰撞前的速度無關。)這個重要公式為:
⑻
它表明:如果發生碰撞( Pn<>0 ),那么方程就變為
Vn'=-ξVn ⑼
計算剛體碰撞運動的一般過程:
1.利用碰撞檢測技術檢測發生碰撞的二剛體及碰撞點P,碰撞的垂直方向N
2.使用公式⑸計算相對速度Vn.如果Vn>=0,表示兩物體處于分離,不再進行計算退出. 使用公式⑼計算相對速度Vn'.
3.使用公式⑶,⑷計算常量Ca,Cb(如果是地面,可將其看做一個質量很大的剛體,也可單獨處理)
4.使用公式⑹計算碰撞的垂直沖量Pn
5.將Pn代入⑵即可得到二剛體碰撞后的狀態.
代碼如下:
Private Sub process_collision(Boxa As box, Boxb As box, collpos As D3DVECTOR, colN As D3DVECTOR, extra As Single) '開始正沖量的計算 Dim cl As collision cl.N = colN ' 碰撞的垂直方向 cl.Ra = Subtract(collpos, Boxa.pos)'重心坐標到碰撞點的矢量 cl.Rb = Subtract(collpos, Boxb.pos) cl.Va = Add(cross(Boxa.Vang, cl.Ra), Boxa.v) ' v'= v +ω×R cl.Vb = Add(cross(Boxb.Vang, cl.Rb), Boxb.v) cl.Vn = Dot(cl.N, cl.Va) - Dot(cl.N, cl.Vb) - 0.2 * extra '相對垂直速度, 另外副加微小沖量
cl.Vn2 = -0.4 * cl.Vn '垂直相對速度(碰撞后),0.4是恢復因數
If cl.Vn >= 0 Then Exit Sub
'計算Ca Ca = 1/m+((Ra×N)/Iz×Ra)N Cb = 1/m+((Rb×N)/Iz×Rb)N cl.Ca = 1 / Boxa.m + Dot(cross(VScale(cross(cl.Ra, cl.N), 1 / Boxa.Iz), cl.Ra), cl.N) cl.Cb = 1 / Boxb.m + Dot(cross(VScale(cross(cl.Rb, cl.N), 1 / Boxb.Iz), cl.Rb), cl.N)
D3DXVec3Scale cl.Pn, cl.N, ((cl.Vn2 - cl.Vn) / (cl.Ca + cl.Cb)) applyimpulse Boxa, cl.Pn, collpos '應用正沖量 applyimpulse Boxb, VScale(cl.Pn, -1), collpos ... End Sub
摩擦沖量
既然碰撞的正方向可以應用沖量方程,那么在與之相垂直的方向(摩擦力方向)也可用此方程,只是后面的判斷方法不同.
如果2個對象接觸并滑行,摩擦力會一直作用于滑行點上,同樣的如果發生碰撞,正沖量與摩擦沖量也同時工作,我們描述摩擦產生的沖量為摩擦沖量.
如果摩擦力做工,相切的摩擦沖量將要運做,(t是單位矢量相切于碰撞的邊,它的方向可通過P的的速度判斷.)如圖:

這種情況,相切的速度與沖量關系可以寫成類似于方程⑶的形式,:
⑼
在碰撞期間的摩擦力
在無摩擦的系統下,正接觸力fn(t)在[t0,t1]段間持續的作用于2剛體上,因此P點的正沖量為:
⑽
現在假設在P點的速度在碰撞開始和期間始終不為0,等量摩擦力ft(t)持續的作用,P點的摩擦量沖為:
(11)
假設在P點碰撞期速度變成了0,摩擦力頂多保持在靜摩擦狀態,摩擦量沖被限制在:
(12)
從上面的推斷我們可以推斷摩擦沖量的計算過程:
1.根據式⑼與式(11)的摩擦沖量都計算出來
2.如果前者小于后者表示動摩擦力不能一直維持到碰撞結束,實際摩擦沖量為前者,反之亦然.
'開始摩擦沖量的計算 Dim clnew As collision '已經改變的碰撞
... Vr_all = Subtract(clnew.Va, clnew.Vb)
clnew.tangent_vel = Subtract(Vr_all, VScale(clnew.N, Dot(Vr_all, clnew.N)))'tangent_vel=Va-((Va·N-Vb·N)*N) '相切的速度 clnew.tangent_speed = VLength(clnew.tangent_vel) '相切的速度標量 If clnew.tangent_speed > 0 Then Dim T As D3DVECTOR D3DXVec3Scale T, clnew.tangent_vel, -1 / clnew.tangent_speed clnew.Ca = 1 / Boxa.m + D3DXVec3Dot(T, cross(VScale(cross(clnew.Ra, T), 1 / Boxa.Iz), clnew.Ra))'Ca = 1/m+((Ra×T)/Iz×Ra)T clnew.Cb = 1 / Boxb.m + D3DXVec3Dot(T, cross(VScale(cross(clnew.Rb, T), 1 / Boxb.Iz), clnew.Ra)) clnew.C = clnew.Ca + clnew.Cb
If clnew.C > 0 Then Const friction = 0.5 '動摩擦系數 Dim Ptt As Single '臨時摩擦沖量 Ptt = clnew.tangent_speed / clnew.C If Ptt < friction * VLength(cl.Pn) Then '動靜摩擦判斷 clnew.Pt = Ptt Else clnew.Pt = friction * VLength(cl.Pn) End If
applyimpulse Boxa, VScale(T, clnew.Pt), collpos '應用摩擦沖量 applyimpulse Boxb, VScale(T, -clnew.Pt), collpos End If End If
刺透處理
為防止一物體刺穿另一物體,需要對刺穿進行處理.一個方法是檢測時計算出刺入的深度,后在碰撞副加一微小沖量,使其分離.簡單的考慮到一次就對半分離過于突然,不能取得最好的效果,所以每次以按一比例分離
另一個簡單方法是直接修改剛體的位置: Boxa.pos = Add(VScale(colN, extra * 0.2), Boxa.pos) Boxb.pos = Add(VScale(colN, -extra * 0.2), Boxb.pos)

目前流行的物理引擎都是通過高級碰撞檢測技術即未發生刺穿前?
|