- 2D 게임 물리의 강체 충돌 해결은 이미 닿거나 겹친 물체가 다음 프레임에서 서로 관통하지 않도록 속도 변화를 계산하는 문제임
- 게임 루프는 매 프레임 속도와 Δt로 위치를 갱신하므로, 새 위치에서 기하가 겹치면 별도 처리가 없을 때 물체가 서로 통과함
- 충돌은 단순한 접촉 여부가 아니라, 접촉한 물체들이 현재 속도대로 계속 서로를 향해 움직이는지까지 함께 봐야 함
- 표면에서 멀어지는지는 법선(normal) 과 속도의 내적 부호로 판단할 수 있으며, 양수면 같은 방향 성분, 음수면 반대 방향 성분이 있음
- 두 물체의 경우 개별 속도보다 상대 속도와 충돌 법선이 중요하며, 접촉 상태에서 상대 법선 속도가 음수일 때 충돌로 볼 수 있음
강체 물리와 충돌 해결의 범위
- 대상은 강체 물리(rigid body physics) 로, 힘을 받아도 변형되지 않는 물체를 다룸
- 현실에서는 모든 물체가 분자 수준에서 변형되므로 완전한 강체는 존재하지 않음
- 대부분의 물리 시뮬레이션에서 이런 세부 변형까지 계산하기는 매우 어렵거나 비용이 큼
- 물체가 충분히 현실적으로 보인다면, 강체처럼 단순화하는 방식이 실용적임
- 게임 엔진의 충돌 처리는 보통 두 단계로 나뉨
- 충돌 감지(collision detection): 장면에서 어떤 물체들이 충돌 중인지 판단함
- 충돌 해결(collision resolution): 충돌 중인 물체의 이동 방향, 속도, 재질 등을 바탕으로 이후 상태를 결정함
- 여기서 다루는 초점은 기하학적 교차 여부를 찾는 단계가 아니라, 충돌 이후의 움직임을 정하는 충돌 해결임
게임 루프에서 충돌이 생기는 방식
- 대부분의 게임은 큰 루프 안에서 장면 속 물체들의 위치를 반복해서 다시 계산함
- 각 반복에서 물체의 위치는 현재 속도(velocity) 를 바탕으로 갱신됨
- 속도는 크기와 방향을 모두 가진 벡터량임
- 화살표의 길이는 속력, 화살표가 가리키는 방향은 이동 방향을 나타냄
- 일정 시간 간격 Δt 동안의 위치 변화는 변위(displacement) 로 표현됨
- 변위도 크기와 방향을 가진 벡터량임
- 게임 루프가 초당 60번 실행되면 Δt는 1/60초가 됨
- 새 위치는 현재 속도에서 계산한 변위를 기존 위치에 더해 얻음
- 두 물체의 새 위치가 서로의 기하를 겹치게 만들면, 별도 처리가 없을 때 물체들은 관통한 뒤 통과하게 됨
충돌 해결이 찾으려는 값
- 충돌 해결의 목표는 시뮬레이션이 진행될 때 물체들이 더 이상 서로 관통하지 않도록 각 물체의 속도 변화를 정하는 것임
- 충돌 전후 속도는 다음 기호로 표현됨
v_a,i,v_b,i: 물체a,b의 충돌 전 속도v_a,f,v_b,f: 물체a,b의 충돌 후 속도Δv_a,Δv_b: 충돌 때문에 생긴 각 물체의 속도 변화
- 결국 충돌 해결은 Δv_a와 Δv_b 값을 찾는 문제임
- 현실적으로 보이는 충돌을 만들려면 선택한 속도 변화가 관련 물리 법칙을 만족해야 함
접촉만으로는 충돌을 알 수 없음
- 두 물체가 닿아 있다고 해서 항상 충돌 중인 것은 아님
- 충돌은 현재 속도대로 계속 움직였을 때 물체들이 서로 관통하게 되는 상황임
- 같은 접촉 장면이라도 두 물체의 속도 방향에 따라 충돌일 수도, 아닐 수도 있음
- 따라서 충돌 조건에는 두 가지가 함께 필요함
- 물체들의 기하가 닿거나 겹쳐 있어야 함
- 물체들이 여전히 충돌 방향으로 움직이고 있어야 함
표면 법선과 멀어지는 방향
- 물체가 어떤 표면에서 멀어지는지는 표면에 대한 법선 방향(normal direction) 으로 판단할 수 있음
- 법선 방향은 표면에 수직이며, 표면에서 직접 멀어지는 방향을 가리킴
- 평평한 표면에서는 모든 지점의 법선 방향이 같음
- 곡면에서는 지점마다 법선 방향이 달라짐
- 원의 둘레에서는 중심에서 해당 둘레 지점으로 향하는 방향이 법선 방향임
- 법선 방향은 길이가 1인 정규화 벡터로 표현됨
- 길이가 1인 벡터는 단위 벡터(unit vector)라고도 함
- 정규화된 벡터임을 나타내기 위해 변수 위에
^표시를 붙일 수 있음
- 어떤 점에서의 법선 방향은 그 점에서 표면의 접선(tangent) 에 수직임
내적으로 방향 성분을 판단하기
- 한 벡터가 다른 벡터와 얼마나 같은 방향을 향하는지 계산할 때 내적(dot product) 을 사용할 수 있음
- 2차원 벡터에서 내적은 대응하는 성분들의 곱을 더한 값이며, 결과는 벡터가 아니라 스칼라임
- 기하학적으로 내적은 한 벡터를 다른 벡터 방향으로 투영한 스칼라 투영 길이에, 투영 대상 벡터의 길이를 곱한 값으로 볼 수 있음
- 내적의 부호는 두 벡터의 방향 관계를 알려줌
- 두 벡터 사이 각도가 90°보다 작으면 내적은 양수이고, 대체로 같은 방향을 가리킴
- 각도가 90°보다 크면 내적은 음수이고, 대체로 반대 방향을 가리킴
- 각도가 정확히 90°이면 내적은 0임
- 물체의 속도 벡터와 표면 법선의 내적이 양수이면, 물체는 그 표면에서 멀어지고 있음
두 물체 충돌에 적용하기
- 두 상자처럼 물체가 둘이면 속도 벡터도 각 물체마다 하나씩 존재함
- 이때는 개별 속도보다 두 물체의 상대 속도(relative velocity) 를 사용함
- 상대 속도는 두 물체의 속도 차이임
- 기하학적으로는
v_b의 끝에서v_a의 끝으로 향하는 벡터임 - 예를 들어 두 차가 각각 50km/h로 정면 충돌하는 상황은, 조건이 같다면 한 차가 정지한 차를 100km/h로 들이받는 것과 같음
- 표면에 해당하는 방향은 충돌 법선(collision normal) 으로 표현함
- 충돌 법선을 계산하는 방식은 충돌하는 물체의 형태나 기하에 따라 달라짐
- 여기서의 예시는 한 물체의 점 또는 꼭짓점이 다른 물체의 변과 충돌하는 vertex-edge collision임
- vertex-edge collision에서 충돌 법선은 해당 변에 수직임
- 관례상 물체를
a,b로 표시하면 충돌 법선은 물체a를 향함- 어떤 물체를
a또는b라고 부르는지는 계산 전체에서 일관되기만 하면 됨
- 어떤 물체를
상대 법선 속도로 정의하는 충돌
- 상대 속도
v_ab와 충돌 법선n^의 내적을 계산하면 두 물체가 충돌 방향으로 움직이는지 판단할 수 있음 - 이 값은 상대 법선 속도(relative normal velocity) 라고 부름
- 상대 속도 중 충돌 법선 방향 성분임
- 여기서는 부호가 중요하지만, 이후 충돌 중 작용하는 힘을 계산할 때도 중요한 역할을 함
- 상대 법선 속도의 부호는 충돌 상태를 구분함
- 값이 양수이면 두 물체는 이미 서로 멀어지고 있음
- 값이 음수이면 두 물체는 아직 서로 들이받고 있음
- 최종적으로는 한 물체의 점이 다른 물체와 닿아 있고, 상대 법선 속도가 음수일 때 충돌이 발생함