다음과 같은 접근 방식을 사용합니다 (Tonge http://www.richardtonge.com/ 의 질량 분할 알고리즘과 유사 ).
- 장면 / 컨텍스트에서 충돌하는 모든 쌍을 감지합니다. (A, B)를 그런 쌍으로 만드십시오. 고스트 / 질량 분할 아이디어 적용 : A가 M 바디와 접촉하고 B가 다른 N 바디와 접촉하는 경우 A 의 질량 을 B로 일시적으로 설정합니다.
m_A/M
m_B/N
- 각 쌍 (A, B)에 대한 반력 / 반발력 기여를 계산하고 이러한 기여를 A와 B의 자체 누적기에 저장
- 임펄스에서 복원 속도를 계산하고 (설명한대로) 동일한 방식으로 저장합니다 ( 각 (A, B) 쌍에 대해 자체 누적 기의 deltaV 속도 잔류 물로 )
- 페널티 변위 계산 (다시, 변위 축적, 즉시 적용하지 마십시오!)
- 충돌 쌍으로 이전에 당사자로 지정된 모든 바디의 질량을 재설정 (
m_A = m_A * M
및 m_B = m_B * N
)
이 방법은 Jacobi 반복 알고리즘이 선형 연립 방정식 시스템에서 작동하는 방식과 유사합니다. 그리고 수렴이 보장되지는 않지만 시뮬레이터에서 3D로 작업이 매끄럽게 수행됩니다 (예, 추가 치수는 두 배의 어려움을 더합니다!)
경고 : 충돌 감지 / 처리 단계가 끝난 후에 만 정확한 위치와 속도를 확인하십시오! 그렇게하면 충돌하는 액터를 동시에 업데이트 할 수 있습니다. 또한 다음에 위치와 속도를 통합 할 때 복원력을 고려해야합니다.
편집 : 글쎄, 당신은 이미 남용 된 Verlet 통합 방법을 사용하고 있다고 생각합니다 (이 방법은 gamedev 애호가들 사이에서 세대 이름이되었습니다). 이 충돌 처리 및 통합 스펙터에서 여기를 살펴볼 수 있습니다 .
업데이트 : 충돌에 접근하는 방법에 대한 일부 정보 (및 사실에 대한 자체 충돌)는 다음 백서에서 찾을 수 있습니다.
내가 제안한 접근법은 오래 전부터 독창적 인 기여를하는 것이 아니며, 많은 게임들이 그 결과를 그럴듯한 결과로 사용하며 Jakobsen은 그의 Hitman 게임 엔진에서 가장 잘 활용했습니다.
다소 실제적인 경험으로 볼 때 충돌하는 몸체의 다른 힘이 그보다 큰 경우 페널티 힘 (관통 거리에서 입력을받는 선형 또는 지수 스프링과 유사)이 침투를 제대로 해결하지 못합니다. 그렇기 때문에 나는 뉴턴의 반력 (벽을 밀고 벽을 뒤로 밀고), 유도 된 속도 (스누커 공 충돌)와 자연스럽지 않은 신체를 기하학적으로 서로 멀어지게하는 세 가지 (거의 중복 된) 접근법을 결합하기로 결정했습니다. " 해결책. 함께 그들은 모든 것을 제공하는 것처럼 보입니다 : 대부분을 제거하십시오추악한 상호 침투 아티팩트, 충돌 바디는 장기적으로 서로 상호 작용하는 경향이 있습니다 (복원 속도와 힘으로 인해 충돌 시나리오에서 바디를 드래그하는 경향이 사라지고 바디는 서로 튀어 나옵니다) . 마지막으로 이러한 단순하지만 일반적인 개념에 대한 이해를 돕기 위해이 슬라이드를 분석 하는 것이 좋습니다 .
Verlet 통합 단계를 설명하는 나의 "가혹한 방법"은이 통합 방법의 성배라는 대중 문화의 신념을 대상으로합니다. 그것은 Symplectic Euler (일부 반 암시 적 Euler라고도 함) 사촌보다 조금 더 낫습니다. 더 복잡한 통합 방법이 존재합니다 (그리고 모두 암시 적 이름을 가짐). 강력한 게임 엔진이이를 활용하지만 인디 개발자는 특정 시나리오에 맞춰 Verlet이 실제로 실험 한 이후로 이러한 기능을 실험 할 시간이 없습니다. 또한, 약간의 부정 행위가 발생하지 않고 뻣뻣한 구속 조건을 처리 할 수있는 통합 방법이 전혀 없습니다 (링크를 찾을 수는 없지만 제가 언급 한 논문은 "X.Provot-"질량의 변형 구속 조건 "이라고합니다) 헝겊 동작을 설명하는 봄 모델 "