서비스
교육 철학

12.4 충격량과 충돌

비디오 게임에서는 물체들이 늘 서로 부딪칩니다. 따라서 충돌에 관해 잠시 이야기하는 것이 적절해 보입니다. 앞서 말했듯 실제 세계에서 운동량은 순간적으로 변하지 않습니다. 아주 짧은 시간 동안 큰 힘이 작용하는 것입니다. 하지만 현실이 어떻든—비디오 게임 물리의 제1법칙을 떠올려 보세요—이 힘들이 작용하는 시간은 물리 시뮬레이션의 시간 간격으로 구분할 수 있는 범위보다 짧은 경우가 많습니다.
실용적인 목적에서는 운동량 변화가 순간적으로 일어났다고 생각해도 됩니다. 가장 중요하고 흔한 상황은 물체가 충돌할 때입니다. 대부분의 물체는 질량이 일정하므로 순간적인 운동량 변화는 보통 순간적인 속도 변화로 귀결됩니다.
그림 12.9처럼 질량이 m1,m2m_1,m_2, 속도가 v1,v2v_1,v_2인 두 물체가 1차원에서 서로를 향해 움직인다고 하겠습니다.
그림 12.9
그림 12.9. 충돌.
운동량 관계 p=mvp=mv를 이용하면 충돌 전후의 두 물체 운동량 p1,p2p_1,p_2와 전체 계의 운동량 pp를 계산할 수 있습니다. 질량은 일정하다고 가정하고 충돌 뒤의 값에는 프라임을 붙입니다.
p1=m1v1,p2=m2v2,p=p1+p2=m1v1+m2v2,p1′=m1v1′,p2′=m2v2′,p′=p1′+p2′=m1v1′+m2v2′.\begin{aligned} p_1&=m_1v_1,&p_2&=m_2v_2,&p&=p_1+p_2=m_1v_1+m_2v_2,\\ p'_1&=m_1v'_1,&p'_2&=m_2v'_2,&p'&=p'_1+p'_2=m_1v'_1+m_2v'_2. \end{aligned}
운동량 보존 법칙에 따르면 한 물체의 운동량이 바뀔 때 다른 물체의 운동량도 반대 방향으로 바뀝니다. 실제 변화는 힘이 짧은 시간 동안 작용한 결과이지만, 여기서는 충돌 순간에 일어난 것으로 근사합니다. 이때 짧게 작용하는 큰 힘을 충격력(impulsive force)이라고 하고, 그 힘을 시간에 대해 적분한 운동량 변화량을 충격량(impulse)이라고 합니다.
충격량은 운동량의 즉각적인 변화이므로 운동량과 같은 단위 ML/TML/T를 가집니다. 단위가 ML/T2ML/T^2인 보통의 힘과는 아주 다른 개념이라는 점에 주의하겠습니다. 프로그래머가 충격량과 힘을 혼동해서 사용하는 실수는 매우 흔하므로 반드시 단위를 확인해야 합니다.
두 물체가 충돌하면, 둘 다 부서지지 않는다고 가정해도 여러 일이 일어날 수 있습니다. 두 물체가 서로 튕겨 나가면서 v1,v2v_1,v_2의 부호가 모두 바뀌는 것이 한 가지 가능성입니다. 서로 붙어 버릴 수도 있습니다. 앞의 경우를 탄성 충돌, 뒤의 경우를 비탄성 충돌이라고 합니다.
사실 엄밀하게 탄성이라고 부르는 것은 ‘완벽한 튕김’뿐입니다. 양 극단을 ‘완전 비탄성’과 ‘완전 탄성’이라고 부르며, 중간에 해당하는 충돌은 그냥 ‘비탄성’이라고 합니다. 12.4.2절에서는 반발계수로 이 용어들을 조금 더 정확히 정의하지만, 그 차이를 완전히 이해하려면 운동에너지를 알아야 합니다. 11장 처음에 말했듯 에너지는 물리학에서 분명 중요한 개념이지만, 대부분의 실시간 시뮬레이션에서 쓰는 뉴턴–오일러 동역학의 중심 역할을 하지는 않으므로 이 책에서는 많이 다루지 않습니다.
각 물체의 속도와 운동량은 바뀔 가능성이 크지만, 운동량 보존 법칙은 두 물체로 이루어진 계의 전체 운동량이 일정해야 한다고 말합니다. 즉 p=p′p=p'입니다.
일반적으로 운동량 보존 법칙만으로는 각 물체의 속도 v1,v2v_1,v_2를 예측할 수 없습니다. 운동량 보존은 식 하나 p=p′p=p'만 주는데 미지수는 둘이기 때문입니다. 어떤 정보가 더 필요한지 살펴보기 전에, 충돌과 운동량 보존의 더 간단한 경우부터 보겠습니다. 잠시 충돌이 완전 비탄성이라고, 즉 충돌하면 물체들이 서로 붙는다고 가정하겠습니다. 그러면 연립방정식을 풀기 위해 필요했던 식 하나를 더 얻습니다. 바로 v1′=v2′v'_1=v'_2입니다.

12.4.1 완전 비탄성 충돌

비탄성 충돌의 고전적인 예는 총에서 발사한 탄환이 나무토막에 박히는 경우입니다. 그림 12.10처럼 질량이 2.00 kg인 나무토막이 질량을 무시할 수 있는 줄에 매달려 정지해 있다고 하겠습니다. 나무토막을 향해 총을 쏘면 질량이 10 g인 탄환이 350 m/s의 속력으로 나무토막을 맞힙니다. 탄환은 나무토막 안에 박힌 채로 남습니다. 충돌 직후 나무토막의 수평속력은 얼마일까요?
먼저 계의 초기 운동량을 계산합니다. 처음에는 탄환만 운동량을 가집니다.
p=m1v1+m2v2=(2.00 kg)(0)+(10.0 g)(350 m/s)=3.50 kg m/s.p=m_1v_1+m_2v_2=(2.00\,\mathrm{kg})(0)+(10.0\,\mathrm g)(350\,\mathrm{m/s}) =3.50\,\mathrm{kg\,m/s}.
그림 12.10
그림 12.10. 줄에 매달린 나무토막에 탄환을 발사하기. 달리 말하면 『호기심 해결사(MythBusters)』의 흔한 한 장면입니다.
이제 충돌 뒤 두 물체의 공통 속도를 구하고, 이를 그냥 v′v'라고 쓰겠습니다. 운동량 보존 p=p′p=p'와 비탄성 충돌이라는 조건 v′=v1′=v2′v'=v'_1=v'_2를 이용합니다.
p′=m1v1′+m2v2′,3.50 kg m/s=(2.00 kg)v′+(10.0 g)v′,3.50 kg m/s=(2.00 kg+10.0 g)v′,3.50 kg m/s2.01 kg=v′,1.74 m/s=v′.\begin{aligned} p'&=m_1v'_1+m_2v'_2,\\ 3.50\,\mathrm{kg\,m/s}&=(2.00\,\mathrm{kg})v'+(10.0\,\mathrm g)v',\\ 3.50\,\mathrm{kg\,m/s}&=(2.00\,\mathrm{kg}+10.0\,\mathrm g)v',\\ \frac{3.50\,\mathrm{kg\,m/s}}{2.01\,\mathrm{kg}}&=v',\\ 1.74\,\mathrm{m/s}&=v'. \end{aligned}
비탄성 충돌의 예를 하나 더 보겠습니다. 이번에는 2차원입니다. 신호를 무시한 운전자가 교차로를 가로지르는 자동차와 충돌했다고 하겠습니다. 그랜트(Grant)가 안전하게 운전하는 쪽이라고 하겠습니다. 충돌 순간 그랜트와 연비 좋은 하이브리드 자동차의 합계 질량은 1,500 kg이며 서쪽으로 35 km/hr로 달리고 있습니다.
주의를 기울이지 않던 캐리(Kari)〔주14〕는 그랜트의 차를 너무 늦게 발견해 왼쪽으로 급히 방향을 틉니다. 캐리와 자동차의 합계 질량은 2,500 kg입니다. 충돌 순간 캐리는 그림 12.11처럼 북쪽에서 서쪽으로 25도 기울어진 방향으로 65 km/hr로 달리고 있습니다.
이 충돌을 비탄성으로 다룰 수 있다고 가정하겠습니다. 충돌 직후 뒤엉킨 두 자동차의 속도는 얼마일까요?〔주15〕
이 문제를 풀기 위해 +x+x는 동쪽, +y+y는 북쪽인 2차원 좌표계를 정하겠습니다. 충돌 전의 전체 운동량은 다음과 같습니다.
그림 12.11
그림 12.11. 자동차 충돌.
P=m1v1+m2v2=(1500 kg)(35 km/hr)[−10]+(2500 kg)(65 km/hr)[cos⁡115∘sin⁡115∘]=(52500 kg km/hr)[−10]+(162500 kg km/hr)[−0.4230.906]=([−525000]+[−68700147000])kg km/hr=[−121200147000]kg km/hr.\begin{aligned} \mathbf P&=m_1\mathbf v_1+m_2\mathbf v_2\\ &=(1500\,\mathrm{kg})(35\,\mathrm{km/hr})\begin{bmatrix}-1\\0\end{bmatrix} +(2500\,\mathrm{kg})(65\,\mathrm{km/hr})\begin{bmatrix}\cos115^\circ\\\sin115^\circ\end{bmatrix}\\ &=(52500\,\mathrm{kg\,km/hr})\begin{bmatrix}-1\\0\end{bmatrix} +(162500\,\mathrm{kg\,km/hr})\begin{bmatrix}-0.423\\0.906\end{bmatrix}\\ &=\left(\begin{bmatrix}-52500\\0\end{bmatrix}+\begin{bmatrix}-68700\\147000\end{bmatrix}\right)\mathrm{kg\,km/hr} =\begin{bmatrix}-121200\\147000\end{bmatrix}\mathrm{kg\,km/hr}. \end{aligned}
두 자동차가 엉겨 붙은 덩어리의 충돌 뒤 속도는 방금 계산한 운동량을 두 자동차의 합계 질량으로 나누기만 하면 됩니다.
v′=P′m1+m2=[−121200147000]kg km/hr1500 kg+2500 kg=[−121200147000]kg km/hr4000 kg=[−30.336.8]km/hr.\begin{aligned} \mathbf v'&=\frac{\mathbf P'}{m_1+m_2} =\frac{\begin{bmatrix}-121200\\147000\end{bmatrix}\mathrm{kg\,km/hr}}{1500\,\mathrm{kg}+2500\,\mathrm{kg}}\\ &=\frac{\begin{bmatrix}-121200\\147000\end{bmatrix}\mathrm{kg\,km/hr}}{4000\,\mathrm{kg}} =\begin{bmatrix}-30.3\\36.8\end{bmatrix}\mathrm{km/hr}. \end{aligned}
〔주14〕 캐리를 서툰 운전자로 정한 것은 성별 편견 때문도, 그녀가 빨간 머리여서도 아닙니다. 기분이 상할 수 있는 그랜트보다 캐리라는 이름의 사람이 더 적으리라는 가정 때문입니다.
〔주15〕 또다시 『호기심 해결사』 같은 순간입니다.

12.4.2 일반적인 충돌 반응

간단한 비탄성 충돌은 운동량 보존 원리로 풀 수 있습니다. 하지만 일반적인 경우의 속도는 어떻게 계산할까요? 이 질문에 제대로 답하려면 먼저 질문이 나오는 상황을 살펴야 합니다. 충돌 처리는 보통 두 단계로 이루어집니다. 먼저 물체들이 이미 서로 파고들었거나, 이번 시간 단계 안에 곧 충돌할 것임을 알아내야 합니다.
다음으로 충돌을 해소하거나 예방하는 조치를 취합니다. 앞의 작업을 충돌 검출(collision detection), 뒤의 작업을 충돌 반응(collision response) 이라고 합니다. 지금은 충돌을 이론적으로 설명하는 것이 목적입니다. 실제 물리 시뮬레이션이 어떻게 작동하는지에 관한 몇 가지 실용적인 문제는 12.6절에서 살펴봅니다.
따라서 지금은 충돌에 반응하여 강체의 운동량이 어떻게 바뀌는지를 일반적으로 설명해 보겠습니다. 두 물체가 충돌했다는 사실은 이미 알고 있고, 충돌 뒤의 행동을 예측하려 한다고 가정합니다.
추상적인 물리 문제를 풀든 디지털 시뮬레이션의 충돌 반응 코드를 작성하든, 보통은 두 물체가 충돌했다는 사실만 알아서는 부족합니다. 어디서 충돌했으며 접촉점에서 두 물체가 서로 어떤 방향으로 놓여 있었는지도 알아야 합니다. 예를 들어 그랜트와 캐리의 자동차 충돌에서는 그랜트의 차가 왼쪽 문 근처를, 캐리의 차가 오른쪽 앞 펜더를 부딪쳤다는 사실이 필요합니다.
물론 충돌이 반드시 점 하나에서 일어나지는 않습니다. 한 물체의 모서리가 다른 물체의 면에 닿기도 하고, 면 전체가 맞닿기도 합니다. 원문 집필 당시 대부분의 실시간 충돌 검출 시스템은 이처럼 상세한 형태로 충돌을 반환하지 않았으며, 충돌 반응 시스템도 그런 추가 정보를 제대로 활용하지 못했습니다.
그에 가장 가까운 방식은 검출 시스템이 접촉점 또는 침투점 여러 개를 찾고, 그 목록을 어떤 방식으로 처리하는 것입니다. 예를 들어 볼록 껍질을 찾거나 평균 표면 법선을 구할 수 있습니다. 이를 빠르게 수행하는 최선의 방법은 여전히 활발히 연구되는 주제이므로 이런 입문서에서 다루기에는 적절하지 않습니다.
여기서는 접촉점 하나에 관련된 원리만 살펴봅니다. 더 발전된 기법도 이 원리를 바탕으로 합니다.
그림 12.12는 충돌 검출 시스템이 반환할 법한 충돌 결과의 예를 보여줍니다. 각 충돌 결과인 검은 화살표에는 화살표의 시작점에 해당하는 접촉점과 보통 단위벡터라고 가정하는 표면 법선이 있습니다. 법선이 어느 방향을 향할지는 임의로 정한 관례를 따릅니다. 그림 12.12에서는 ‘첫 번째’ 물체 바깥쪽을 향합니다.
두 물체 중 어느 쪽을 ‘첫 번째’와 ‘두 번째’로 부를지도 임의로 정할 수 있습니다. 어떤 공간 분할 자료구조에서 우연히 어떤 순서로 발견되었는지에 따라 정해질 수도 있습니다. 이 구분은 프레임마다 달라질 수도 있으므로 충돌 반응 계산은 대칭적이어야 합니다. 그림에는 표시하지 않았지만 물체가 이미 서로 파고들었다면 침투 깊이를 함께 반환하는 경우가 많습니다.
그림 12.12
그림 12.12. 충돌 검출이 반환하는 결과 유형의 예.
언제나 비디오 게임 물리의 제1법칙을 기억해야 합니다. 게임의 모든 충돌이 물리 시스템에 표현되어 있는 ‘실제’ 물체들 사이에서만 일어나야 하는 것은 아닙니다. 발차기 동작이 있는 게임을 생각해 보겠습니다. 캐릭터의 발이 물리 시스템에 들어 있지 않아도, 또는 현실이 아니라 게임플레이 목적에 따라 설계한 간단한 근접 검사나 레이캐스팅으로 판정한 경우라도 발차기를 물체와의 ‘충돌’로 다루면 유용할 수 있습니다.
실제로 발이 목표에 닿기에는 플레이어가 너무 멀거나 너무 가까웠을 수 있지만 그것은 중요하지 않습니다. 이 행동에 대한 반응을 보통의 충돌과 비슷하게 처리하면 큰 도움이 될 수 있습니다. 예를 들어 소리와 파티클 효과를 재생하고, 대상의 체력을 줄이고, 겉모습을 바꾸는 식입니다.
일반적인 충돌과 플레이어의 발차기 같은 ‘가상’ 충돌에 같은 반응 코드를 쓰려면—단지 시각·청각 효과를 맞추기 위한 경우라도—보통 검출 시스템이 주는 값을 가상 충돌에 맞게 만들어야 할 수 있습니다. 발의 질량과 속도, 접촉점과 표면 법선 등이 그런 값입니다.
마지막으로 주의할 점이 하나 더 있습니다. 지금은 선운동량만 관심 대상입니다. 물체는 회전하지 않습니다. 따라서 이 절의 설명은 불완전할 것입니다. 그래도 회전이 더하는 복잡함 없이 일반적인 원리를 먼저 다루는 편이 도움이 됩니다.
이제 핵심으로 들어가겠습니다. 어떤 방법으로든 충돌을 검출하고 위치와 법선을 얻었다고 가정하면, 충돌 반응으로 생기는 속도는 어떻게 구할까요? 여기서는 Chris Hecker의 글 [34]을 따라 일반적인 방법을 보여줍니다. 먼저 계산을 이끄는 원리들을 복습하겠습니다.
첫 번째 원리는, 현실에서 아주 큰 힘이 짧은 시간 작용한다는 사실을 알지만 그 시간이 시뮬레이션의 시간 간격에 비해 너무 짧으므로 충돌 반응이 순간적으로 일어난다고 생각한다는 것입니다. 즉 힘을 계산하는 대신 물체의 운동량을 순간적으로 바꾸는 충격량을 계산합니다.
두 번째 원리는 뉴턴의 제3법칙에서 나옵니다. 한 물체에 어떤 충격력이 작용하면 다른 물체에는 반대의 힘이 작용해야 합니다. 운동량 보존도 본질적으로 같은 말입니다. 한 물체의 운동량을 바꾸면 다른 물체의 운동량을 그 반대로 바꾸어야 충돌 전후 계의 전체 운동량이 같습니다.
따라서 두 물체의 충돌을 해소하는 계획은 적절한 크기의 충격량을 계산한 뒤, 두 물체에 서로 반대 방향으로 적용하는 것입니다. 충격량은 벡터이므로 크기와 방향이 필요합니다. 방향은 이미 알고 있습니다. 충돌 검출 시스템이 제공한 표면 법선입니다. 법선을 정하는 세부사항은 충돌 반응이 아니라 충돌 검출의 문제이므로 여기서는 설명하지 않습니다.
다만 물체가 이 법선에 평행하게 움직이면 문제가 더 나빠지거나—더 깊게 파고들거나—더 좋아집니다—서로 멀어지면서 침투를 해소한다—는 점에 주목하겠습니다. 반대로 침투 깊이가 비교적 작고 접촉점 부근의 면이 국소적으로 평평하며 법선에 수직이라고 가정하면, 법선에 수직인 운동은 침투 깊이를 바꾸지 않습니다.
따라서 실질적으로 중요한 방향은 표면 법선뿐입니다.
우리의 과제는 표면 법선 방향으로 작용하여 침투를 해소하거나 예방할 충격량의 적절한 크기를 결정하는 것입니다. 아직 발생하지 않은 침투를 막기만 하려면 표면 법선에 평행하게 작용하는 상대속도를 없애면 됩니다. 그 상대속도 성분이 바로 물체를 시간에 따라 전진시켰을 때 침투를 일으킬 성분입니다.
접촉점 부근의 면이 평평하다는 가정 아래서는 법선에 수직인 상대속도는 괜찮고 상쇄할 필요가 없습니다. 그림 12.13처럼 m2m_2에 대한 m1m_1의 상대속도는 vrel=v1−v2\mathbf v_{\rm rel}=\mathbf v_1-\mathbf v_2로 계산합니다. 이를 법선에 투영한 길이는 n⋅vrel\mathbf n\cdot\mathbf v_{\rm rel}입니다.
그림 12.13
그림 12.13. 표면 법선에 평행하게 작용하는 상대속도 성분 계산하기.
상대속도를 없애면 침투는 막을 수 있지만, 이것이 언제나 올바른 반응은 아닙니다. 충돌한 물체는 서로 옆에 멈춰 서기만 하는 것이 아니라 튕겨 나옵니다. 즉 떨어뜨린 콩주머니와 슈퍼볼의 충돌 반응 차이를 설명할 재료가 하나 빠져 있습니다. 이런 경우를 구분하는 간단하고 널리 쓰이는 법칙 중 하나가—유일한 법칙은 아닙니다—뉴턴의 충돌 법칙입니다.
이 법칙은 ee로 쓰는 반발계수(coefficient of restitution) 를 도입합니다. 반발계수는 충돌 뒤 법선 방향 상대속도의 크기를 충돌 직전 같은 값과 연결하는 분수값입니다. e=0e=0이면 충돌 뒤 법선 방향 상대속도가 0인 완전 비탄성 충돌입니다.
e=1e=1이면 법선 방향 상대속도가 충돌 전과 크기는 같고 부호는 반대인 완전 탄성 충돌입니다. 콩주머니를 카펫 위에 떨어뜨리는 것은 비탄성 충돌에 가깝고, 슈퍼볼을 떨어뜨리는 것은 탄성이 매우 큰 충돌입니다. 원문은 11.6절의 식을 이용하면 물체를 여러 번 튀게 했을 때 반발계수가 연속된 튀어오름의 최고 높이 비를 준다고 설명합니다.
이 높이 관계의 정정은 별도 보충 해설에서 다룹니다.
충돌 반응 충격량의 크기를 kk라고 쓰겠습니다. 첫 번째 질량 m1m_1은 벡터 충격량 −kn-k\mathbf n을 받고, m2m_2는 반대의 운동량 변화 knk\mathbf n을 받습니다. 부호는 표면 법선의 방향을 임의로 정한 데서 나옵니다. 원하는 결과를 정했으니 상대속도를 상쇄하는 적절한 kk를 구하는 것은 간단한 대수 문제입니다.
앞에서처럼 충돌 뒤 값에는 프라임을 붙입니다. 충격량은 순간적인 운동량 변화이므로 첫 번째 물체의 충돌 뒤 운동량은 P1′=P1−kn\mathbf P'_1=\mathbf P_1-k\mathbf n입니다. 질량으로 나누고 P=mv\mathbf P=m\mathbf v를 떠올리면 충돌 뒤 속도는 다음과 같습니다.
충돌 뒤의 속도
v1′=v1−knm1,v2′=v2+knm2.\mathbf v'_1=\mathbf v_1-\frac{k\mathbf n}{m_1},\qquad \mathbf v'_2=\mathbf v_2+\frac{k\mathbf n}{m_2}.
충돌 뒤 상대속도는 단순히 두 속도의 차이 vrel′=v1′−v2′\mathbf v'_{\rm rel}=\mathbf v'_1-\mathbf v'_2입니다. 결과로 얻을 법선 방향 상대속도를 충돌 전 법선 방향 상대속도의 원하는 배수로 나타내어 kk를 풉니다.
충격량의 크기 kk 구하기
vrel′⋅n=−e vrel⋅n,(v1′−v2′)⋅n=−e vrel⋅n,[(v1−kn/m1)−(v2+kn/m2)]⋅n=−e vrel⋅n,[(v1−v2)−(kn/m1+kn/m2)]⋅n=−e vrel⋅n,[vrel−k(1/m1+1/m2)n]⋅n=−e vrel⋅n,vrel⋅n−k(1/m1+1/m2)n⋅n=−e vrel⋅n,k(1/m1+1/m2)n⋅n=(e+1)vrel⋅n,k=(e+1)vrel⋅n(1/m1+1/m2)n⋅n.(12.23)\begin{aligned} \mathbf v'_{\rm rel}\cdot\mathbf n&=-e\,\mathbf v_{\rm rel}\cdot\mathbf n,\\ (\mathbf v'_1-\mathbf v'_2)\cdot\mathbf n&=-e\,\mathbf v_{\rm rel}\cdot\mathbf n,\\ [(\mathbf v_1-k\mathbf n/m_1)-(\mathbf v_2+k\mathbf n/m_2)]\cdot\mathbf n&=-e\,\mathbf v_{\rm rel}\cdot\mathbf n,\\ [(\mathbf v_1-\mathbf v_2)-(k\mathbf n/m_1+k\mathbf n/m_2)]\cdot\mathbf n&=-e\,\mathbf v_{\rm rel}\cdot\mathbf n,\\ [\mathbf v_{\rm rel}-k(1/m_1+1/m_2)\mathbf n]\cdot\mathbf n&=-e\,\mathbf v_{\rm rel}\cdot\mathbf n,\\ \mathbf v_{\rm rel}\cdot\mathbf n-k(1/m_1+1/m_2)\mathbf n\cdot\mathbf n&=-e\,\mathbf v_{\rm rel}\cdot\mathbf n,\\ k(1/m_1+1/m_2)\mathbf n\cdot\mathbf n&=(e+1)\mathbf v_{\rm rel}\cdot\mathbf n,\\ k&=\frac{(e+1)\mathbf v_{\rm rel}\cdot\mathbf n}{(1/m_1+1/m_2)\mathbf n\cdot\mathbf n}.\tag{12.23} \end{aligned}
흔히 그렇듯 n\mathbf n이 단위벡터임을 알고 있다면 식 (12.23)은 조금 더 간단해집니다. n\mathbf n이 단위벡터가 아니면 그 길이 때문에 kk가 달라지지만, 벡터 충격량 knk\mathbf n을 계산하는 과정에서 그 변화가 상쇄됩니다. 따라서 kk가 정말로 충격량의 크기인 것은 n\mathbf n이 단위벡터일 때뿐입니다.
식 (12.23)의 예를 몇 개 풀어 보겠습니다. 먼저 반발계수로 콩주머니와 슈퍼볼을 떨어뜨렸을 때의 차이를 설명해 보겠습니다. 두 물체를 콘크리트 바닥에 떨어뜨릴 것입니다. 이 예는 대부분의 물리 엔진에서 움직이지 않는 물체를 무한한 질량을 가진 것처럼 다루어 쉽게 처리할 수 있음을 보여줍니다.
이런 특수한 물체와 관련된 계산에서는 식 (12.23)처럼 보통 역질량을 사용합니다. 게다가 역질량과 나중에 설명할 대응 개념인 역관성 텐서는 자주 필요한 유도량이라 미리 계산하는 경우가 많습니다. 그러므로 물리 코드는 역질량을 0으로 설정하기만 해도 움직이지 않는〔주16〕 물체를 별도 특수 경우로 나누지 않고 다룰 수 있습니다.
한쪽의 역질량이 0이면 속도를 직접 다루면서 식 (12.23)을 건너뛸 수도 있습니다. kk는 질량에 비례하지만 이를 적용해서 생기는 속도 변화는 질량에 반비례하기 때문입니다. 뒤에서는 이런 단순화가 불가능한 일반적인 예도 풉니다.
각각 50 g인 슈퍼볼 하나와 콩주머니 하나가 있다고 하겠습니다. 식 (12.23)을 쓰지 않아도 예제의 답이 너무 뻔해지는 일을 피하려고, 법선이 단순한 좌표축 방향이 아닌 경사면에 충돌하도록 하겠습니다. 단위벡터를 써야 한다는 제약은 없으므로 n=[1,3]\mathbf n=[1,3]이라고 하겠습니다. 머릿속 실험에서 두 물체를 정확히 같은 방식으로 던져서 둘 다 충돌 순간의 속도가 v2=[−4,−4]\mathbf v_2=[-4,-4]라고 하겠습니다. 그림 12.14에 이 상황을 나타냈습니다.
그림 12.14
그림 12.14. 경사면에 콩주머니 또는 슈퍼볼을 튀기기.
결과 속도를 구하려면 먼저 충격량의 배율 kk를 구합니다. 그러려면 반발계수를 선택해야 합니다. 슈퍼볼 충돌에는 광고된 값에 가까운 e=0.9e=0.9를 사용하겠습니다. vrel=v1−v2\mathbf v_{\rm rel}=\mathbf v_1-\mathbf v_2임을 기억하고 kk를 풀면 다음과 같습니다.
슈퍼볼의 충격량 배율 kk 계산
k=(e+1)vrel⋅n(1/m1+1/m2)n⋅n=(0.9+1)[4 m/s4 m/s]⋅[13](0+1/(50 g))[13]⋅[13]=1.9(16 m/s)10/(50 g)=152 g m/s.\begin{aligned} k&=\frac{(e+1)\mathbf v_{\rm rel}\cdot\mathbf n}{(1/m_1+1/m_2)\mathbf n\cdot\mathbf n}\\ &=\frac{(0.9+1)\begin{bmatrix}4\,\mathrm{m/s}\\4\,\mathrm{m/s}\end{bmatrix}\cdot\begin{bmatrix}1\\3\end{bmatrix}} {(0+1/(50\,\mathrm g))\begin{bmatrix}1\\3\end{bmatrix}\cdot\begin{bmatrix}1\\3\end{bmatrix}}\\ &=\frac{1.9(16\,\mathrm{m/s})}{10/(50\,\mathrm g)}=152\,\mathrm{g\,m/s}. \end{aligned}
충돌 뒤 속도를 구하려면 슈퍼볼의 운동량에 충격량 knk\mathbf n을 더합니다. 운동량은 질량 곱하기 속도이므로 속도 변화는 이 충격량을 슈퍼볼의 질량 m2m_2로 나눈 값입니다.
슈퍼볼의 충격량 적용 뒤 속도 계산
v2′=v2+knm2=[−4 m/s−4 m/s]+(152 g m/s)[13]50 g=[−4 m/s−4 m/s]+[3.04 m/s9.12 m/s]=[−0.96 m/s5.12 m/s].\begin{aligned} \mathbf v'_2&=\mathbf v_2+\frac{k\mathbf n}{m_2} =\begin{bmatrix}-4\,\mathrm{m/s}\\-4\,\mathrm{m/s}\end{bmatrix} +\frac{(152\,\mathrm{g\,m/s})\begin{bmatrix}1\\3\end{bmatrix}}{50\,\mathrm g}\\ &=\begin{bmatrix}-4\,\mathrm{m/s}\\-4\,\mathrm{m/s}\end{bmatrix} +\begin{bmatrix}3.04\,\mathrm{m/s}\\9.12\,\mathrm{m/s}\end{bmatrix} =\begin{bmatrix}-0.96\,\mathrm{m/s}\\5.12\,\mathrm{m/s}\end{bmatrix}. \end{aligned}
이 속도를 그림으로 보여주기 전에 콩주머니를 살펴보겠습니다. 콩주머니 충돌은 거의 완전 비탄성이라고 보고 e=0.01e=0.01을 사용합니다. ee를 바꾸는 것 외의 과정은 슈퍼볼과 같습니다.
콩주머니의 충격량 배율 kk와 충돌 뒤 속도 계산
k=(e+1)vrel⋅n(1/m1+1/m2)n⋅n=1.01(16 m/s)10/(50 g)=80.8 g m/s,v2′=v2+knm2=[−4 m/s−4 m/s]+(80.8 g m/s)[13]50 g=[−2.38 m/s0.85 m/s].\begin{aligned} k&=\frac{(e+1)\mathbf v_{\rm rel}\cdot\mathbf n}{(1/m_1+1/m_2)\mathbf n\cdot\mathbf n} =\frac{1.01(16\,\mathrm{m/s})}{10/(50\,\mathrm g)}=80.8\,\mathrm{g\,m/s},\\ \mathbf v'_2&=\mathbf v_2+\frac{k\mathbf n}{m_2} =\begin{bmatrix}-4\,\mathrm{m/s}\\-4\,\mathrm{m/s}\end{bmatrix} +\frac{(80.8\,\mathrm{g\,m/s})\begin{bmatrix}1\\3\end{bmatrix}}{50\,\mathrm g} =\begin{bmatrix}-2.38\,\mathrm{m/s}\\0.85\,\mathrm{m/s}\end{bmatrix}. \end{aligned}
반발계수가 작아져 콩주머니가 받는 충격량 배율이 줄었고, 튀어나오는 속도도 작아졌습니다. 그림 12.15는 이 차이를 보여줍니다. 비교를 위해 e=1e=1인 경우도 넣었습니다. 원문은 이를 ‘완전 비탄성 충돌’이라고 적지만, 앞에서 정의한 대로 이 경우는 완전 탄성 충돌입니다. 완전 비탄성 충돌 e=0e=0은 콩주머니 결과와 매우 가까우므로 그리지 않았습니다.
그림 12.15
그림 12.15. 반발계수 ee의 값에 따른 충돌 뒤 속도.
그림 12.15의 콩주머니 궤적을 보면 이 모형이 충돌의 중요한 요소 하나를 담지 못한다는 사실이 분명합니다. 바로 마찰입니다. 법선에 수직인 속도는 충돌 전후에 같습니다. 콩주머니 같은 물체라면 충돌 때문에 수평속도의 상당 부분을 잃고, 어쩌면 완전히 멈출 것이라고 예상합니다.
올바른 처리 방법은 충격량에 수직 방향 성분을 추가하는 것입니다. 하지만 마찰의 올바른 처리는 일반적으로 까다로운 문제이며 원문 집필 당시에도 실시간 시뮬레이션의 활발한 연구 주제였습니다. 수평 충격량을 계산하는 당시 방법들, 특히 미끄럼 접촉을 처리하는 방법 중 상당수는 ‘경험적으로 그럴듯하게 조정한 것’이라는 범주에 들어갔습니다.
앞의 예에서는 물리적인 힘에 반응하는 물체가 하나뿐이고 다른 물체는 움직임에 반응하지 않았습니다. 이것은 특수한 경우여서 식을 단순화할 수 있었습니다. 앞서 말했듯 투사체의 질량은 약분되므로 필요하지 않습니다. 연습문제 9에서는 그랜트와 캐리의 충돌이 완전 비탄성이 아니면 어떻게 될지 생각해 보도록 합니다. 그 경우에는 이 법칙의 모든 능력이 필요합니다. 물체가 자유롭게 회전할 수 있는 충돌은 12.5.4절에서 다룹니다.
지금까지는 물체들이 접촉했지만 아직 서로 파고들지는 않았다고 가정했습니다. 충돌 해소의 전체 전략에 따라 실제로는 그렇지 않을 수 있습니다. 한 기법은 시뮬레이션의 시간을 접촉 순간까지 되돌리는 것입니다. 하지만 한 시간 단계 안에서도 서로 다른 시각에 아주 많은 충돌이 일어나므로 이를 효율적으로 수행하기는 어렵습니다.
게다가 부동소수점 연산으로 ‘정확히 접촉했다’를 정의하기도 어렵습니다. 다른 전략은 침투를 허용하고 이미 파고든 물체에 충격량을 적용하는 것입니다. 이때 충격량은 추가 침투를 막도록 상대속도를 없애는 것 이상의 일을 해야 합니다. 계산된 상대속도를 위치에 적분한 뒤 시간 단계가 끝날 때 물체들이 분리될 만큼 상대속도가 충분히 커야 합니다.
다시 말해 물체의 위치는 계산된 속도에 따라 전진하며, 그 갱신 뒤에는 침투가 해소되어야 합니다. 적어도 대부분은 해소되어야 합니다. 작은 침투를 어느 정도 허용하면 이점도 있습니다. 이런 문제들은 확립된 원리라기보다 당시 진행 중인 연구〔주17〕의 영역에 가까우므로 여기서는 더 설명하지 않습니다.
〔주16〕 이런 의미에서 ‘특수한’ 물체가 반드시 정지해 있어야 하는 것은 아닙니다. 레벨 디자이너가 만든 스플라인 경로를 따라가는 발판이나, 정해진 궤적에서 벗어나서는 안 되는 수동 애니메이션 물체를 생각해 보겠습니다. 이런 운동학적으로 제어되는 물체도 월드 안에서 움직이며, 다른 물체—운동학적으로 제어되지 않는 물체!—와 상호작용하려면 물리 엔진이 그 존재를 알아야 합니다.
하지만 이 물체들은 힘에 반응하지 않고 물리 엔진이 위치를 갱신하지도 않습니다. 질량은 무한대로 다루지만 올바른 충돌 반응을 위해서는 운동학적으로 결정된 속도를 알아야 합니다.
〔주17〕 실제로 로켓 과학자였던 베르너 폰 브라운은 이렇게 말했습니다. “내가 무엇을 하는지 모를 때 하고 있는 일이 연구입니다.”
💡
충격량을 적용하는 순간과 힘을 누적하는 시간
질량 2 kg인 상자를 정지 상태에서 3 m/s로 밀어내려면 충격량은 J=mΔv=6 N sJ=m\Delta v=6\,\mathrm{N\,s}입니다. 엔진의 충격량 API에는 이 값을 한 번 줍니다. 힘 API로 같은 일을 하려면 ‘얼마 동안’ 가할지도 정해야 합니다. 0.5초 동안 일정한 12 N을 가하면 같은 운동량 변화가 생깁니다. 한 프레임마다 충격량 6을 계속 적용하면 매 프레임 속도를 3 m/s씩 늘리는 전혀 다른 동작입니다.
반발계수 ee는 충돌 법선 방향 상대속력의 비입니다. 공이 바닥에 부딪히기 직전 아래로 10 m/s이고 e=0.6e=0.6이면, 고정된 바닥에서 충돌 직후 위로 6 m/s입니다. 공기저항을 무시하고 중력이 일정하면 최고 높이는 속력의 제곱에 비례하므로 연속 높이의 비는 e2e^2입니다. 1 m에서 떨어뜨린 공은 e=0.6e=0.6일 때 0.36 m까지 오릅니다. 원문 12.4.2의 ‘높이 비가 ee’라는 설명은 이 제곱이 빠져 있습니다.
실험의 ‘충돌’ 화면에서 반발계수를 바꾸면 세 번의 반발 높이가 함께 바뀝니다. 표시는 질량과 무관한 고정 바닥·수직 운동·일정 중력·공기저항 없음 모형입니다. 원문의 경사면 예처럼 접선속도가 있으면 e=0e=0이어도 옆으로 미끄러질 수 있습니다. 법선 방향 상대속도가 0이라는 조건이 모든 방향에서 두 물체가 붙는다는 뜻은 아닙니다. 마찰 또는 별도 접착 제약이 있어야 접선속도도 없어질 수 있습니다.
💡
원문 표현과 구현 조건
12.4.2의 그림 12.15 설명에서 e=1e=1은 완전 탄성입니다. 원문의 ‘완전 비탄성’은 오탈자입니다.

12.4.3 디랙 델타

선형 동역학을 떠나 회전 동역학을 이야기하기 전에, 특히 충격량을 다룰 때 접할 수 있는 수학 표기 하나를 간단히 소개하겠습니다. 앞서 말했듯 운동량 같은 많은 자연 현상은 이론상 순간적으로 변하지 않지만, 실용적인 목적에서는 순간적으로 변한다고 다룹니다. 또한 연속함수, 또는 같은 의미로 연속 ‘신호’를 다루는 수학 도구가 마련되어 있고 이를 불연속점이 있는 신호에도 적용하고 싶은 경우가 많습니다.
함수의 불연속을 적분할 수 있는 형태로 표현하는 편리한 수학적 장치가 있습니다. 디랙 델타(Dirac delta) 라고 하며, 보통 소문자 델타를 사용하여 δ(a)\delta(a)처럼 씁니다.
δ(t)\delta(t)라는 기호는 뾰족한 봉우리, 즉 임펄스 같은 특별한 종류의 함수입니다. t=0t=0을 제외한 모든 곳에서 값이 0이고, t=0t=0에서는 무한대입니다. 하지만 디랙 델타의 실제 값들을 너무 문자 그대로 받아들이면 안 됩니다. 더 중요한 것은 그 적분, 즉 이 무한히 높은 봉우리의 ‘넓이’가 1이라는 사실입니다.
디랙 델타는 중심이 0이고 폭이 ww, 높이가 1/w1/w인 직사각형으로 생각하는 것이 가장 좋습니다. 다른 모양을 택해도 되지만 넓이가 반드시 1이어야 한다는 점이 중요합니다. 디랙 델타는 넓이를 계속 1로 유지하면서 폭이 0으로, 높이가 무한대로 갈 때 이런 함수의 극한으로 정의합니다.
우리는 Bracewell [9]의 조언을 좋아합니다. 디랙 델타 같은 특별한, 음, 함수에는 ‘함수’라는 말을 피하고 대신 기호(symbol) 라고 부르라는 조언입니다. 디랙 델타 기호를 보면 그 주변의 식 전체를 극한으로 해석해야 하기 때문입니다. 원점에 중심을 두고 넓이가 1인 어떤 모양의 폭이 0으로 갈 때의 극한을 생각하는 것입니다.
디랙 델타가 있으면 불연속점이 있는 함수를 미분할 수 있습니다. 예를 들어 t=2t=2에 방망이에 맞는 야구공의 속도를 다음 불연속함수로 근사한다고 하겠습니다.
v(t)={−130 ft/s,t<2,130 ft/s,t≥2.v(t)=\begin{cases}-130\,\mathrm{ft/s},&t<2,\\130\,\mathrm{ft/s},&t\ge2.\end{cases}
디랙 델타를 이용하면 이 식의 미분을 다음처럼 쓸 수 있습니다.
v′(t)=260 δ(t−2).v'(t)=260\,\delta(t-2).
이는 ‘2에서 크기가 260인 임펄스’라고 읽을 수 있습니다. δ\delta 기호는 보통 함수가 아니므로, 위 식은 ‘t=2t=2 주위의 길이 Δt\Delta t인 구간에서 총 260 ft/s의 속도 변화가 일어날 때, Δt\Delta t를 0으로 보내는 극한’이라고 해석해야 합니다.
디랙 델타는 연속 수학의 도구를 불연속 신호에 적용하는 여러 상황에서 나타납니다. 예를 들어 그래픽스에서 화면 공간의 이미지는 본래 불연속을 가지는 신호이며, 우리는 이를 표본화하고 재구성해야 합니다. 컨트롤러를 통한 사용자의 입력도 불연속을 보이는 신호입니다. 디랙 델타와 램프 함수·헤비사이드 계단 함수 같은 관련 기호들은 이런 신호를 설명하고 다루는 데 도움이 됩니다.
💡
원문 표현과 구현 조건
디랙 델타는 평범한 실숫값 함수로 ‘0에서 무한대’를 대입해 계산하는 대상이 아닙니다. 원문이 권한 대로 주변 식 전체와 적분·극한의 의미로 읽습니다. 속도 변화량에 델타를 곱하면 가속도가 되며, 질량까지 곱해야 힘에 해당합니다.