2013年8月13日 星期二

python 物理模擬2

上次介紹過vector後,這篇就來講講我的碰撞是怎麼寫的,目前經過測試後我的計算應該是正確的,因為我計算了動能(k),的確有守恆,除了當我用滑鼠點物體的時候,一但點下去會讓物體的速度歸0,並且可以拖曳給予速度,如下影片所示。

話說有什麼軟體是錄製的時候比較不會LAG的嗎? 我用的這個軟體錄起來好像沒說那麼順暢 :(。 回到正題,這邊我是假設兩球碰撞後是沒有旋轉的,因此不考慮進去進入我碰撞程式碼前,先給個概念。
上面要表達的是,一顆移動速度V的球,撞上靜止的球,另外當兩個球體碰撞時,在那個瞬間會有個impulse,且這個imulse方向是平行於連心線的,因此碰撞後會改變得動量也只有平行於連心線的動量,所以在此就把速度向量V拆成平行於連心線(vcos)和垂直於連心線這(vsin)兩種,之後一切就好搞啦 :) 之前說得好像很難,在這邊我要說那時候我腦筋打結阿啊!! 思考不順暢 :( 回到正題,接下來只要把vcos代入,高中教的二維碰撞公式,再將得到的結果與vsin合併,最後這就是答案 :) 這邊我就不教怎麼導出公式了,有興趣的就自己去查囉。
def collision(self, obj):
        '''
            2d collision -- split in two part
            first -- v parallel to the line connected the two circle center

            second -- v vertical to the line connected the two circle center 
            inelastic case, both will has the same velocity....

            v1' = (m1-m2)v1/(m1+m2) + 2 m2v2/(m1+m2) 

            v2' = (2m1)v1/(m1+m2) + (m2-m1)v2/(m1+m2)

        '''
        if self.boundCircle.isCollision(obj.boundCircle): #compare two circle

            o1x, o1y = self.boundCircle.pos.point
            o2x, o2y = obj.boundCircle.pos.point
            p1 = Vector(o2x-o1x, o2y-o1y)

            v1, v2 = self.velocity, obj.velocity
            v1L, v2L = v1.length(), v2.length()

            try:
                rad1 = math.acos( v1.dot(p1)/ (p1.length()*v1L) )
            except:
                rad1 = 0
            try:
                rad2 = math.acos( v2.dot(-p1)/ (p1.length()*v2L) )
            except:
                rad2 = 0
            
                
            v1 = p1.normalize()*v1L*math.cos(rad1)
            v2 = -p1.normalize()*v2L*math.cos(rad2)

            
            m1, m2 = self.mass, obj.mass

            v1f = (m1-m2)*v1/(m1+m2) + 2*m2*v2/(m1+m2) 
            v2f = 2*m1*v1/(m1+m2) + (m2-m1)*v2/(m1+m2)
            

            self.velocity = v1f + (self.velocity-v1)
            obj.velocity = v2f + (obj.velocity-v2)

目前這碰撞只是兩個圓體,我還在想,要是圓體碰撞正方體,要怎麼去計算碰撞後的情形,還要若要考慮旋轉,勢必要改寫這個碰撞公式,必須再花點時間來研究 :) 但是其實如果不想浪費時間在自己寫這些有的沒的,到是可以用別人寫好的物理模擬,目前聽過的有box2d和bullet這兩種,以供參考。

0 意見:

張貼留言