2D 게임 충돌 응답 : 주어진 축을 따라 SAT 및 최소 변위?


13

내가 만들고있는 2D 게임에서 충돌 시스템을 구현하려고합니다. 메타 축의 충돌 튜토리얼에 설명 된 것처럼 분리 축 정리 는 효율적이고 강력한 충돌 감지 처리 방법처럼 보이지만 사용하는 충돌 응답 방법은 마음에 들지 않습니다. 최소 오버랩 축을 따라 맹목적으로 변위함으로써, 알고리즘은 단순히 움직이는 물체의 이전 위치를 무시합니다. 즉, 정지 한 물체가 들어가고 튀어 나오는만큼 충돌하지 않습니다.

다음은 이것이 중요한 상황의 예입니다.

예

위에서 설명한 SAT 방법에 따르면 사각형은 빗변에 수직 인 삼각형에서 간단히 튀어 나옵니다.

토 스타일 응답

그러나 실제로 사각형은 변위 벡터를 따라 연속적으로 이동하는 경우 첫 번째 충돌 지점이므로 삼각형의 오른쪽 아래 모서리에서 멈춰야합니다.

현실적인 반응

이제는 게임 플레이 중에 실제로 중요하지 않을 수도 있지만, 효율적이고 일반적으로 이러한 방식으로 정확한 변위를 얻는 방법이 있는지 알고 싶습니다. 나는 지난 며칠 동안 내 두뇌를 쌓아 올렸지 만 아직 포기하고 싶지 않습니다!

(StackOverflow에서 교차 게시되었으므로 규칙에 위배되지 않기를 바랍니다!)


규칙에 위배됩니다. 크로스 포스트하지 마십시오.
AttackingHobo

예, StackOverflow에서 삭제하고 여기에 보관하십시오 : P
TravisG

gamedev.stackexchange.com/questions/9144/… 나는 당신의 특정한 질문에 대답했습니다.
ultifinitus

SO에서 삭제되었습니다.
Archagon

현상금을 시작하십시오, archagon : P 그렇지 않으면, 필요할 수도 있습니다. 이 질문은 정말 흥미롭고, 단지 몇 가지 참고 문헌을 열거하는 것 이상의 답을 보는 것이 좋습니다.
TravisG

답변:


11

내가 찾은 방법은 다음과 같습니다. 결함이있을 수 있지만 아직 커서 분석에서 문제가 발견되지 않았습니다. 또한 약간의 수정만으로 임의의 다각형에 사용할 수 있습니다.

아래 그림에서 파란색 물체는 움직이고 빨간색 물체는 움직이지 않습니다. 1 1 단계 : 각 다각형에 대해 해당 다각형의 투영을 따라 모션 벡터에 수직 인 선에서 가장 먼 두 점을 찾습니다. 2 2 단계 : 이 점들을 연결하는 선을 따라 각 다각형을 나눕니다. 모션 벡터를 따라 다른 다각형을 향하는 다각형의 절반은 "정방향 선체"입니다. 이것은 충돌 할 수있는 다각형의 유일한 부분입니다. 삼 3 단계 :모션 벡터를 따라 각 다각형의 "정방향 선체"에있는 각 점의 벡터를 반대쪽 다각형으로 투영하고 반대쪽 다각형의 "정방향 선체"의 각 모서리와 교차하는지 확인합니다. (아마도 속도는 느리지 만 요즘 컴퓨터 속도는 매우 빠릅니다.) (기울어 진 화살표는 유감입니다. 모든 화살표는 평행해야합니다.) 4 4 단계 : 가장 짧은 벡터를 가져옵니다. 정확한 충돌 거리입니다. 5 5 단계 : 짜잔! 6


2
꽤 인상적입니다. 알고리즘 속도를 간단한 (4x 또는 8x) 멀티 샘플링과 비교 한 적이 있습니까?
TravisG

불행하게도.
Archagon

인상적이며 수학도 너무 복잡하거나 집중적이지 않습니다. +1
you786

7

이 비슷한 질문을 확인하십시오 : 충돌 해결

또한 http://www.metanetsoftware.com/technique/tutorialA.html#section5 에서 링크를 게시했습니다.

5 장 : 빠르게 움직이는 물체

위에서 언급했듯이 작고 빠르게 움직이는 물체는 정적 충돌 테스트를 사용할 때 문제가 발생할 수 있습니다. 이러한 개체를 처리하기 위해 취할 수있는 몇 가지 접근 방법이 있습니다. 가장 간단한 방법은 그러한 개체가 필요하지 않도록 게임 디자인을 제한하는 것입니다.

반드시 가지고 있어야하는 경우 작고 빠르게 움직이는 객체를 처리하는 일반적인 두 가지 방법 (스윕 충돌 테스트 및 멀티 샘플링)이 있습니다.

-= 스윕 테스트 =-

두 정적 모양 사이의 교차점을 테스트하는 대신 원래 모양을 궤적을 따라 스윕하고 이러한 스윕 모양 사이의 겹침을 테스트하여 새 모양을 만들 수 있습니다.

원 아이디어 및 AABB-AABB 스윕 테스트에 대한 기본 아이디어는 [Gomez]에 설명되어 있습니다.

-= 멀티 샘플링 =-

스윕 된 테스트의 훨씬 간단한 대안은 멀티 샘플링입니다. 객체의 새 위치에서 단일 정적 테스트를 수행하는 대신 객체의 이전 위치와 새 위치 사이에있는 여러 위치에서 여러 테스트를 수행하십시오. 이 기술은 N에서 봉제 인형을 충돌시키는 데 사용되었습니다.

샘플의 거리가 항상 물체의 반경보다 작은 거리에 있는지 확인하면 우수한 결과를 얻을 수 있습니다. 구현시 최대 샘플 수를 제한하므로 매우 빠른 속도로 인해 문제가 발생할 수도 있습니다. 이것은 특정 응용 프로그램에 따라 조정할 수있는 것입니다.

편집하다

요약 및 AFAIK에는 몇 가지 솔루션이 있습니다.

  1. 작고 빠르게 움직이는 물체를 갖지 않도록 게임을 제한하십시오.
  2. 내가 게시 한 첫 번째 링크에 설명 된 것처럼 실제로 충돌이 발생하지 않도록하는 시스템을 구현하십시오.
  3. 빠르고 작은 물체에 대한 샘플링 속도를 높입니다.
  4. ... 아마도 더 많지만 나는 전문가가 아닙니다.

1

직선 운동 만 원하는지 또는 각 운동에도 대처 해야하는지에 달려 있습니다.

SAT 사용에 대한 대안 :

선형의 경우에만 객체의 델타 선형 속도 방향으로 원점에서 두 다각형의 Minkowski 차이에 대해 레이 캐스팅 할 수 있습니다.

광선이 MD에 닿으면 두 개체가 충돌하고 충돌 지점에 충돌 시간 t가 표시됩니다.

이제 개체가 움직이고 회전 하면 더 어려워 지지만 비슷한 기술을 계속 사용할 수 있습니다. 보수적 인 발전을 통해이 사건을 다룰 수 있습니다. 이 기술은 반복적입니다. 각 반복은 새로운 MD를 생성하고 교차 시간에 더 가깝게 만듭니다.

다음은 보수적 발전에 관한 초안입니다.

http://www.continuousphysics.com/BulletContinuousCollisionDetection.pdf

이 기법을 자세히 설명하는 기사를 여기에 작성했습니다.

http://www.wildbunny.co.uk/blog/2011/04/20/collision-detection-for-dummies/

이 도움을 바랍니다!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.