• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            牽著老婆滿街逛

            嚴以律己,寬以待人. 三思而后行.
            GMail/GTalk: yanglinbo#google.com;
            MSN/Email: tx7do#yahoo.com.cn;
            QQ: 3 0 3 3 9 6 9 2 0 .

            基于沖量的剛體碰撞運動

            來源:http://www.vbgamedev.com/AI/Impulsive.htm

            基于沖量的剛體碰撞運動

             

            原作者:

            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'

            碰撞以后角速度 

               

            碰撞點

            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)

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

            posted on 2008-01-15 16:41 楊粼波 閱讀(658) 評論(0)  編輯 收藏 引用

            亚洲精品无码久久毛片| 99精品久久精品| 91精品无码久久久久久五月天| 国产免费久久精品99re丫y| 久久国产视频网| 久久有码中文字幕| 久久久亚洲精品蜜桃臀| 久久久WWW免费人成精品| 久久99精品国产麻豆婷婷| 久久97久久97精品免视看秋霞| 国产午夜电影久久| 亚洲一本综合久久| 国内精品久久久久久麻豆| 久久久久成人精品无码| 亚洲国产成人精品无码久久久久久综合| 久久av免费天堂小草播放| 色8激情欧美成人久久综合电| 欧美成a人片免费看久久| 久久这里只有精品首页| 亚洲va国产va天堂va久久| 国产精品久久久久久| 国产精品伊人久久伊人电影| 欧美久久久久久午夜精品| 久久无码高潮喷水| 日本久久久久亚洲中字幕| 久久美女人爽女人爽| 亚洲精品无码久久不卡| 香蕉久久av一区二区三区| 久久久综合九色合综国产| 欧美久久一级内射wwwwww.| 久久精品www人人爽人人| 久久精品国产精品亚洲人人| 日韩精品久久无码中文字幕| 99热精品久久只有精品| 久久www免费人成看片| 97精品伊人久久久大香线蕉| 国产香蕉97碰碰久久人人| 国产亚洲精久久久久久无码AV| 久久AV无码精品人妻糸列| 99久久精品国产一区二区三区 | 国产成人精品免费久久久久|