알고리즘
2008/09/23 11:01
ball collision (운동량 보존 법칙에 따른)
다시 정리하고 몇가지 추가해 보았다.
전제
힘은 물체의 운동 상태(속력이나 방향)을 변화시킨다.
주는 힘이 있으면 반드시 크기가 같은 힘을 받게 되어있다.
힘에 의한 효과(가속도 = 속도의 변화)는 힘에 비례하고 질량에 반비례한다.
힘이 작용하지 않을 때 충돌 전과 충돌 후의 운동량은 항상 같다.
운동량 보존 법칙의 수식적 풀이
가속도 : 단위 시간당 속도의 변화량
a = △v/△t = (v' - v)/△t
가속도의 법칙 : 가속도는 작용한 힘에 비례하고 질량에 반비례한다.
a = F/m, F=m*a
운동량 : 물체의 질량과 속도의 곱으로 나타내는 물리량의 하나, 밖에서 힘이 작용되지 않는 한, 물체 또는 물체가 몇개 모여서 된, 하나의 물체계(物體系)가 가지는 운동량의 합은 변하지 않는다.
질량이 ma 이고 속도가 va 인 물체 A와 질량이 mb이고 속도가 vb인 물체 B 가 일직선 상에서 운동하여 충돌한 후 각각 va', vb'인 일직선상의 운동을 한다고 가정한다.
물체가 충돌할 때 물체 사이에 작용하는 힘은 작용반작용의 관계이므로 -Fa = Fb로 쓸 수 있다.
이를 가속도 법칙에 대입해 풀어쓰면,
-ma*(va' - va)/△t = mb*(vb' - vb)/△t
-ma*va'+ ma*va = mb*vb' - mb*vb
ma*va + mb*vb = ma*va' + mb*vb'
위 식의 좌변은 충돌전 두 물체의 운동량의 합이고 우변은 충돌 후 두 물체의 운동량의 합이다.
이로써, 운동량 보존의 법칙을 수식으로 확인할 수 있다.
반발계수의 수식적 풀이
반발계수 :
충돌하는 물체들의 반발 정도를 나타내는 반발계수는 속도나 질량에 관계없고, 두물체를 구성하는 물질에 따라 결정된다. 고로, 물체마다 고유의 반발계수를 가지고 있는 셈이다.
충돌전 운동 에너지는 충돌하면서 탄성에너지와 열에너지, 소리에너지 등으로 변하지만, 두 물체가 반발되면서 탄성 에너지는 다시 운동 에너지로 변하게 된다. 이때, 얼마만큼 탄성에너지가 보존되어 다시 운동에너지로 변환되는지 반발계수로 표현하게 된다.
충돌한 후 가까워지는 속도와 멀어지는 속도가 같다면, 충돌하면서 운동에너지가 전부 탄성에너지로 변했다가 그대로 운동에너지로 전환된 셈이다. 즉, 반발계수 e=1이 된다.
반대로, 운동에너지가 열에너지나 소리에너지 등으로 모두 전환될 경우 두 물체는 붙어버리게 되어 반발 계수 e=0 이 된다.
따라서, 반발계수는 0≤e≤1의 범위에 있게 된다.
위 예제 그림에서 충돌 후에 서로 멀어지는 속도(충돌 후의 상대속도, vb' - va')와 충돌 전에 가까워지는 속도(충돌 전의 상대속도, va - vb)의 비를 반발계수 e로 표시한다.
e=(vb' - va')/(va - vb) = -(va' - vb')/(va-vb)
충돌 후의 속도 계산을 위한 수식적 풀이
위에서 나온 두 가지 방정식을 보면 아래와 같습니다.
ma*va + mb*vb = ma*va' + mb*vb' (1번식)
e=(vb' - va')/(va - vb) = -(va' - vb')/(va-vb) (2번식)
위 2번식을 vb'에 대한 식으로 바꾸어 1번식에 대입하면, va'에 대한 식을 구할 수 있다.
ma*va + mb*vb = ma*va' + mb*(e*va - e*vb + va')
ma*va + mb*vb = ma*va' + mb*e*va - mb*e*vb + mb*va'
(ma + mb)*va' = ma*va + mb*vb - mb*e*va + mb*e*vb
(ma + mb)*va' = (ma-mb*e)*va + (mb+mb*e)*vb
va' = (ma-mb*e)/(ma+mb)*va + (mb+mb*e)/(ma+mb)*vb
마찬가지로, va'를 2번식에 대입하면, vb' 에 대한 식도 구할 수 있다.
vb' = (ma+ma*e)/(ma+mb)*va + (mb-ma*e)/(ma+mb)*vb
따라서, 일직선 상 충돌 전의 질량과 속도를 알면 충돌 후의 속도를 구할 수 있음을 알 수 있다.
평면상 (2차원) 충돌계산
일직선 상의 충돌 공식을 평면으로 확대해본다.
위 두 공이 평면상에 충돌하였을 때 2 차원 움직임을 1차원 (일직선) 상의 움직임으로만 계산할 수 있도록 벡터분해해야 한다. 즉, 속도가 va인 물체 A는 vax, vay 로, 속도가 vb인 물체 B는 vbx, vby로 나눌 수 있다.
그런데, 두 물체를 일직선상에 놓이게 하려면 새로운 좌표계를 가상으로 설정해야 한다. 물체 A와 B의 중심점을 이은 선을 x'계로 한 가상좌표계를 만들어보자.
가상으로 설정한 x'선상이 x 선상과 이루는 각을 θ 라고 하면,
물체 A의 x'선상의 속도는 vaxp = vax*cosθ + vay*sinθ 이고,
물체 B의 x'선상의 속도는 vbxp = vbx*cosθ + vby*sinθ 이다.
위 식을 일직선상 충돌 공식에 대입해 보자.
그런데, 두 물체를 일직선상에 놓이게 하려면 새로운 좌표계를 가상으로 설정해야 한다. 물체 A와 B의 중심점을 이은 선을 x'계로 한 가상좌표계를 만들어보자.
가상으로 설정한 x'선상이 x 선상과 이루는 각을 θ 라고 하면,
물체 A의 x'선상의 속도는 vaxp = vax*cosθ + vay*sinθ 이고,
물체 B의 x'선상의 속도는 vbxp = vbx*cosθ + vby*sinθ 이다.
위 식을 일직선상 충돌 공식에 대입해 보자.
vaxp = (ma-mb*e)/(ma+mb)*(vax*cosθ + vay*sinθ)
+ (mb+mb*e)/(ma+mb)*(vax*cosθ + vay*sinθ)
vbxp = (ma+ma*e)/(ma+mb)*(vbx*cosθ + vby*sinθ)
+ (mb-ma*e)/(ma+mb)*(vbx*cosθ + vby*sinθ)
이렇게 x'선상의 충돌에 의한 속도 변화를 공식으로 표현할 수 있다.
다음은 y'선상의 속도 변화인데, 이는 충돌이 x'선상에서 일어나기 때문에 y' 선상의 속도는 충돌에 의한 속도 변화는 없게 된다.
물체 A의 y'선상의 속도 va'y' 는
다음은 y'선상의 속도 변화인데, 이는 충돌이 x'선상에서 일어나기 때문에 y' 선상의 속도는 충돌에 의한 속도 변화는 없게 된다.
물체 A의 y'선상의 속도 va'y' 는
vayp = vay*cosθ - vax*sinθ
물체 B의 y'선상의 속도 vb'y' 는
vax = vaxp*cosθ - vayp*sinθ
vay = vaxp*sinθ - vayp*cosθ
마찬가지로 물체 B의 운동은
vbx = vbxp*cosθ - vbyp*sinθ
vby = vbxp*sinθ - vbyp*cosθ
vby = vbxp*sinθ - vbyp*cosθ
이로써, 평면상의 충돌 후 속도에 대한 정리가 끝났다.
바로 actionscript로 적용해 보자.

