이 질문은 충돌 감지 및 해결에 관한 이전 질문의 "추적"질문이며 여기에서 찾을 수 있습니다 .
이전 질문을 읽고 싶지 않은 경우 물리 엔진 작동 방식에 대한 간단한 설명은 다음과 같습니다.
모든 물리적 개체는 SSSPBody라는 클래스에 저장됩니다.
AABB 만 지원됩니다.
모든 SSSPBody는 모든 신체를 업데이트하고 중력을 처리하는 SSSPWorld라는 클래스에 저장됩니다.
모든 프레임, SSSPWorld는 모든 바디를 업데이트합니다.
모든 업데이트 된 바디는 공간 해시에서 주변 바디를 찾고 바디와 충돌을 감지해야하는지 확인합니다. 그렇다면 "collision"이벤트를 호출하고 충돌을 해결해야하는지 확인하십시오. 그렇다면 침투 벡터와 방향성 겹침을 계산 한 다음 침투를 해결하기 위해 위치를 변경하십시오.
바디가 다른 바디와 충돌 할 때 바디의 속도를 자체 속도로 설정하여 다른 바디로 속도를 전달합니다.
바디는 마지막 프레임에서 위치를 변경하지 않은 경우 속도가 0으로 설정됩니다. 또한 이동체 (예 : 리프트 또는 이동 플랫폼)와 충돌하면 리프트의 이동 차이를 계산하여 바디가 마지막 위치에서 이동하지 않았는지 확인합니다.
또한 본문의 모든 AABB 모서리가 프레임의 무언가와 겹칠 때 "분쇄"이벤트가 발생합니다.
이것은 내 게임의 전체 소스 코드입니다. 세 가지 프로젝트로 나뉩니다. SFMLStart는 엔터티의 입력, 그리기 및 업데이트를 처리하는 간단한 라이브러리입니다. SFMLStartPhysics는 SSSPBody 및 SSSPWorld 클래스가있는 가장 중요한 것입니다. PlatformerPhysicsTest는 모든 게임 로직을 포함하는 게임 프로젝트입니다.
그리고 이것은 SSSPBody 클래스의 "update"메소드이며 주석 처리 및 단순화되었습니다. 전체 SFMLStartSimplePhysics 프로젝트를 보지 않으려는 경우에만 이것을 볼 수 있습니다. (그렇더라도 주석 처리되었으므로 여전히 살펴 봐야합니다.)
.gif는 두 가지 문제를 보여줍니다.
- 바디가 다른 순서로 배치되면 다른 결과가 발생합니다. 왼쪽의 상자는 오른쪽 상자와 동일하며 역순으로 만 배치됩니다 (편집기에서).
- 두 상자는 화면 상단을 향해 추진해야합니다. 왼쪽 상황에서는 상자가 추진되지 않습니다. 오른쪽에는 그중 하나만 있습니다. 두 상황 모두 의도하지 않았습니다.
첫 번째 문제 : 업데이트 순서
이것은 이해하기 매우 쉽습니다. 왼쪽 상황에서는 맨 위 상자가 다른 상자보다 먼저 업데이트됩니다. 바닥의 상자가 다른 속도로 속도를 "전달"하더라도 다음 프레임이 움직일 때까지 기다려야합니다. 움직이지 않았기 때문에 바닥 상자의 속도는 0으로 설정됩니다.
이 문제를 해결하는 방법을 모르겠습니다. 나는 전체 물리 엔진 설계에서 무언가 잘못하고 있다고 느끼기 때문에 업데이트 목록을 "정렬"하는 것에 의존하지 않는 솔루션을 선호합니다.
주요 물리 엔진 (Box2D, Bullet, Chipmunk)은 업데이트 순서를 어떻게 처리합니까?
두 번째 문제 : 한 상자 만 천장쪽으로 추진됩니다
나는 왜 이런 일이 일어나는지 이해하지 못한다. "스프링"엔티티가하는 것은 몸의 속도를 -4000으로 설정하고 스프링 자체 위에 재배치하는 것입니다. 재배치 코드를 비활성화해도 문제가 계속 발생합니다.
내 생각은 하단 상자가 상단 상자와 충돌 할 때 속도가 0으로 설정되어 있다는 것입니다. 왜 이런 일이 발생하는지 잘 모르겠습니다.
첫 번째 문제를 포기한 사람처럼 보일 수도 있지만 위의 전체 프로젝트 소스 코드를 게시했습니다. 나는 그것을 입증 할 것이 없지만 나를 믿습니다.이 문제를 해결하기 위해 열심히 노력했지만 해결책을 찾을 수 없었으며 물리와 충돌에 대한 이전 경험이 없었습니다. 나는이 두 가지 문제를 일주일 이상 해결하려고 노력했지만 지금 필사적입니다.
게임에서 많은 기능을 제거하지 않고 스스로 솔루션을 찾을 수 있다고 생각하지 않습니다 (예 : 속도 전송 및 스프링).
이 질문을 읽는 데 시간을 내 주셔서 감사합니다. 솔루션이나 제안을 생각해 보시면 더 감사드립니다.