love-2d를 사용하여 (학습을 위해) 물리 엔진 에서 다음과 같이 충돌 해결을 구현했습니다.
FixedUpdate(dt) // I use fixed timestep
foreach collide c1 in allNotStaticColliders
c1.integartePhysic // i.e. apply gravitational force..
foreach collider c2 "near" c1 // "near"= I use spatial hashing
if collide(c1,c2)
resolve collision (c1,c2) // the heavy operation
collison callbacks c1
collison callbacks c2
...
gif 애니메이션의 끝에서 볼 수 있듯이 모든 충돌체가 정적 객체 위에 거의 접지되면 FPS 붕괴가 발생합니다.
이것은 충돌 할 때 물체가 만지면 더 많은 시간을 보내면서 충돌 해결 수가 증가하기 때문입니다. 그러나 객체가 이미 서로에 대해 안정적인 위치에 정착했기 때문에 많은 계산이 “무용지물”입니다.
이러한 “불필요한”충돌 탐지를 피하기위한 최선의 방법 (물리학 학위가 필요하지 않음)은 무엇입니까?
편집 : DMGregory 힌트를 수락 하고이 결과를 얻습니다 (아직 최적은 아님)
(적색 = 정적, 청색 = 활성, 녹색 = 수면)
답변
OP가 이미이 접근법을 알고 있다고 생각했기 때문에 의견에서 시작점으로 언급했지만 조금 더 살려 보려고합니다 …
대부분의 물리 엔진은 동적 객체를 ” 깨어 라 “와 ” 자고 ” 라는 두 그룹으로 나눕니다 .
물체는 휴식을 취하면 잠을 자고 외부 영향을 받아 움직이거나 가속하면 깨어납니다.
수면 (이 정지 때문에이 더 움직임이 없다, 그래서)의 움직임이 시간이 지남에 통합되지 않고 자고있는 객체 또는 정적 사이의 엔진 무시 충돌 – 대부분의 측면에서 정적 객체와 같은 객체 동작합니다.
중력을 포함하여 수면 물체에 대한 모든 움직임 통합이 생략되므로 충돌 응답이 없어도 정적 바닥에 수면 물체가 떨어지지 않습니다.
따라서 하나 이상의 깨우기 동적 객체와 관련된 충돌 만 확인하면됩니다.
Collisions Static Sleeping Awake
------------------------------------------------
Awake | Check Check & Wake Check
Sleeping | No No
Static | No
이를 통해 능동 시뮬레이션이 필요한 객체의 수를 극적으로 줄일 수 있습니다. 특히 문제에서 설명 된 것처럼 상호 충돌이 많고 순 움직임이 거의 없는지 확인하는 파일에서 더욱 그렇습니다.
잠자는 것은 물체가 실제로 휴식에 도달 한 후에 만 도움이 되며 시간이 걸릴 수 있습니다.
더 빨리 휴식을 취하기 위해 할 수있는 일 :
-
최소 속도 또는 운동량이 0이 아니고 그 이하로 떨어지는 것은 제로로 고정하십시오. (이것은 기본적으로 엡실론이며, 수레를 비교하는 데 일반적으로 사용됩니다)
-
마찰, 댐핑 및 비탄성 충돌을 사용하여 시스템에서 에너지를 흡수하고 전체적으로 더 빨리 휴식을 취하도록 돕습니다.
-
움직임이 느린 물체의 경우 마찰 / 댐핑 / 불완전 성을 선택적으로 높이면 보다 에너지가 많은 물체의 동작에 영향을주지 않으면 서 최종 너지 (nudge)를 멈출 수 있습니다.