여러 다각형으로 축 정리를 분리 하시겠습니까?


9

C #에서 분리 축 정리를 구현하려고합니다. 두 다각형 사이의 최소 변환 벡터를 계산할 수있는 함수가 있습니다. 그러나 하나의 다각형과 다른 여러 다각형 사이의 최소 변환 벡터를 계산하는 함수를 만들 수없는 것 같습니다. 솔직히, 나는 몇 달 동안이 일을 해왔고 솔루션에 더 가깝지 않고 온라인으로 솔루션을 찾을 수 없었습니다. 항상 정확한 결과를 반환하지 않는 몇 가지 최첨단 사례가있어 게임에서 우선 순위가 높은 버그가 발생합니다.

올바르게 작동하지 않는 일반적인 경우는 다음과 같습니다.

가장자리 케이스

이 문제에 대한 잘 알려진 해결책이 있습니까? 내가 찾을 수있는 것은 "각 다각형마다 SAT 만 수행"이라고 말하는 사람들이지만 최소 번역 벡터 는 거의 생성하지 않습니다 .

도움을 주시면 감사하겠습니다.


실제로 테스트를 해 본 적이없는 한 가지 아이디어는 옆에있는 다각형으로 옆으로 이동하는 분리 축을 최소값으로 간주하지 않는 플래그 일 수 있다는 것입니다. 그런 다음 일종의 반복 테스트를 통해 좋은 결과를 얻을 수 있습니다 (루프에 걸리지 않도록 일종의 FIFO 및 / 또는 반복 제한이있을 수 있음).
Andrew Russell

이 버전을 해결하기가 더 어려운 것은 모양의 가장자리가 부분적으로 다른 부분으로 덮여있을 때입니다. 예를 들어 오른쪽 상단 이미지에서 중간 정사각형이 오른쪽으로 확장 된 경우 더 큰 사각형이됩니다. 이것은 내가 사용하는 일부 코드의 출력과 유사합니다. 수십만 개의 점유 / 점유되지 않은 셀을 가져와 수백 개의 더 큰 충돌 형태로 줄입니다.
Richard Tingle

답변:


2

이상적으로는 다각형으로 환경을 구축하지 않습니다. 가장자리 밖으로 빌드합니다 (다각형 집합에서 계산할 수 있음). 예를 들어 첫 번째 예에서는 단일 대각선 모서리가 있습니다. 마지막 예에서 상자는 단일 수평 가장자리에 놓여 있습니다.

편집기 나 도구가 더 작은 개별 모양을 사용하여 레벨을 작성한다는 사실이 런타임에 영향을 미치지 않아야합니다.

약간 더 간단한 방법은 기본 모양의 "내부"가장자리를 간단히 제거합니다. 마지막 예에서 "바닥"상자 사이에는 두 개의 모서리가 있습니다. 충돌 감지 중에는 무시하십시오.

Box2D 문서의 섹션 4.5 (가장자리 및 가장자리 체인)를 읽으면 더 나은 그림과 구현 아이디어를 찾을 수 있습니다 .


2
가장자리를 사용하면 (특히 가장자리 체인이 조금 더 좋습니다) 물리 객체가 레벨 지오메트리 내부 에서 글리치하기가 매우 쉽다는 큰 단점이 있습니다.
Andrew Russell

1
@AndrewRussell : 일반적인 터널링 수정으로 이러한 문제를 피할 수 있습니다. 움직이는 물체의 체적 / 면적이 상당히 적당한 지 확인하고, 프레임 당 최대 속도를 충분히 낮게 유지하여 가장 짧은 치수의 절반 이상을 움직일 수 없도록하십시오 (또는 더 빨리 움직여야하는 경우 여러 번 밟지 마십시오). 정말 예리한 틈새와 레벨 지오메트리에서 "안전한"최종 위치 등에 수렴 될 때까지 해상도를 여러 번 반복하십시오.
Sean Middleditch
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.