충돌 해결


23

충돌을 확인하는 방법을 잘 알고 있지만 충돌을 올바르게 처리하는 방법을 모르겠습니다.

단순화 된 두 물체가 충돌하면 속도 방향을 변경하기 위해 계산을 사용합니다. 두 객체를 움직이지 않으면 객체가 겹치며 속도가 충분히 크지 않으면 다음 업데이트 후에도 충돌합니다. 이로 인해 물체가 서로 끼일 수 있습니다.

그러나 두 객체가 겹치지 않도록 이동하려고하면 어떻게됩니까? 이것은 좋은 생각처럼 들리지만 두 개 이상의 객체가 있으면 매우 복잡하다는 것을 깨달았습니다. 두 물체를 움직이면 그중 하나가 다른 물체와 충돌하여 이동해야하며 벽과 충돌 할 수 있습니다.

하향식 2D 게임을 염두에두고 있지만 그와 관련이 있다고 생각하지 않습니다. 충돌은 일반적으로 어떻게 처리됩니까?

이 질문은 Wooh를 대신하여 요청됩니다


1
게임의 종류를 명확히 할 수 있습니까? "Top down 2D"는 젤다 스타일 액션 어드벤처 게임, 수직 스크롤 슈팅 게임 또는 포켓 당구 게임과 같은 많은 것을 의미 할 수 있습니다. 이 모든 것들은 충돌을 다루는 표준 스타일이 매우 다릅니다!
Ian Schreiber

2
나는 그것을 명확히 할 수 없다. 문제는 충돌의 결과로 발생하는 것이 아니라 다중 오버랩 문제를 처리하는 것입니다. 나는 물체를 서로 튕겨 내고 있다는 것을 아는 것으로 충분 하며이 질문에 대답하기 위해 현실적으로 행동하기를 원합니다.
CiscoIPPhone

답변:


16

Daniel Kodicek은이 주제를 그의 저서 인 프로그래머를위한 수학 및 물리학 에서 자세히 다루고 있습니다.

Kodicek은 자연스럽게 보이는 충돌 해결을 위해 두 가지 작업을 수행합니다.

  • 그의 충돌 감지 기능은 두 물체가 충돌하는 정확한 시간을 계산합니다.
  • 충돌시 새로운 속도를 다시 계산하므로 객체가 겹치지 않습니다.

Kodicek의 충돌 감지 및 해상도를 기반으로 데모를 업로드했습니다 .

업데이트 : 다음 은 Kodicek의 방법과 매우 유사한 충돌 감지 및 해결 알고리즘 입니다. 와 소스 코드 . 그의 알고리즘은 약간 다르게 구현되었으며 훨씬 더 철저하게 설명되었으므로 Kodicek의 책을 여전히 추천합니다.


1
데모 링크가 끊어진 것 같습니다.
ashes999

@ ashes999 : 링크가 수정되었습니다!
Leftium

서클 용 알고리즘입니다. 박스는 어때요?
Anton Chikin

@AntonChikin : Kodicek의 충돌 해결 알고리즘은 충돌 지점에서 질량, 속도 및 법선의 세 가지 입력 만받습니다. Kodicek은 충돌을 감지 할 때 항상 충돌 지점에서 법선을 계산합니다. 그는 다른 상자를 치는 상자를 포함하여 여러 가지 유형의 충돌 감지를 설명합니다. 충돌 탐지 알고리즘을 충돌 해결 알고리즘에 꽂기 만하면됩니다. 자세한 설명은 Kodicek 책의 8-10 장을 참조하십시오. (회전 물리학에 대해서는 더 많은 수학이 필요하며,이 책의 뒷부분에서 다룰 것입니다 ...)
Leftium

1
@ThomasHilbert : 데모 소스 코드와 윈도우에서 사용할 실행 가능 leftium.com/asteroid
Leftium

6

나중에 객체 대신 객체가 이동하기 전에 충돌을 확인하면 어떻게됩니까? 즉, 객체가 충돌하면 이전 위치를 재사용하여 새 위치를 거부합니까?

의사 코드 :

  tmpPosition1 = Obj1.position
  tmpPosition2 = Obj2.position
  updatePosition(Obj1)
  updatePosition(Obj2)
  if collided(Obj1,Obj2) then
      updateVelocities( Obj1, Obj2 )
      Obj1.position = tmpPosition1
      Obj2.position = tmpPosition2
  endif

이렇게하면 객체가 충돌하려고 할 때 객체가 서로 부딪 칠 수 있습니다. 업데이트 단계가 충분히 작 으면 플레이어는 표현에서 이상한 것을 눈치 채지 않아야합니다.


1
다른 객체를 만지면 전혀 움직일 수 없기 때문에 객체와 평행하게 쉽게 이동할 수 없기 때문에 이것은 매우 성가신 일입니다.
Ikke

x와 y를 따로 해결하지 않는 한
instantaphex

6

두 물체가 겹칠 때마다 서로를 향하거나 멀어지고 있는지 확인하십시오. 그들이 서로를 향해 이동하는 경우에만 충돌을 수행하십시오.

벡터 수학을 사용하는 것은 매우 쉽습니다. 간단히 계산하십시오.

dot_product (B.position-A.position, A.velocity-B.velocity)

결과가 긍정적이면 물체가 서로를 향해 움직입니다.


4

오해의 소지가있을 수 있지만 다음 두 가지 질문을하는 것 같습니다. 1. 충돌 해결을 처리하는 일반적인 방법은 무엇입니까? 내가 할 수있는 것보다 더 나은 정의를 할 수 있습니다.

요약하면 질량 대 속도 인 운동량 공간에서 물리 시뮬레이션을 더 빨리 진행하려고합니다.

각도 반응의 경우 운 좋게도 가장 큰 관성 모멘트는 항상 2 개의 직교 축 (2D)으로 축소 될 수 있습니다. 이는 행렬 곱셈이 일반적으로 작동한다는 것을 의미하며, X 및 Y 축과 정렬하면 2D 벡터.

충돌이 발생하면 충돌 지점에서 선형 및 각 모멘트를 기반으로 반응을 파악하고, 퍼지 계수는 상호 침투가있는 경우 두 바디를 분리하기 위해 약간의 페널티 포스 (위에서 언급 한 것처럼)를 적용하는 것입니다.

이제 최대 각도 운동량 상한과 같이 비정상적인 동작을 제어하는 ​​규칙을 더 많이 추가하여 상단과 같이 회전하지는 않지만 좋은 시작입니다.

가능하면 간단하게 유지하십시오.

  1. 멀티 바디 충돌 문제를 어떻게 해결합니까

이 작업을 수행하는 유일한 방법은 선형 방정식 시스템과 많은 해결 방법을 사용하는 것입니다. 그것을하는 실제적인 방법은 위와 같은 시스템을 가지고 있으며 물리학은 시간이 지남에 따라 자연스럽게 해결되는 것입니다.

구르거나 움직이는 표면에 서있는 것과 같은 대부분의 게임에는 물리 시간 스텝핑을 위해 발이 표면 (또는 도로의 바퀴)에 부착 된 하이브리드 모델이 있습니다. 작동하지 않습니다).

이것이 도움이되기를 바랍니다. 수학 예제가 필요하면 알려주십시오.


3

이것이 물리 엔진에서 일반적으로 해결되는 방식은 페널티 포스를 적용하는 것입니다. 첫 번째 단계로 강성이 강한 물체가 높은 속도로 움직이는 경우 (관통적인 저크 동작이 보이는 경우) 관통 형 후 강체를 움직이는 것은 좋지 않습니다. 첫 단계로 시도해보고 요구 사항에 맞는지 확인하십시오.

A penalty force는 스프링 댐퍼처럼 적용되며, 강체를 더 많이 관통할수록 페널티 힘이 증가하고 후속 프레임에서 줄어 듭니다. 그것을 봄으로 생각하십시오. 2 개의 강체가 상호 침투 할 때, 각각 보이지 않는 스프링에 부딪쳐 진행을 약화시키고 (즉, 더 많은 침투를 방지 함) penalty force몸체가 더 이상 침투하지 않을 때까지 앞에서 언급 한 것을 적용합니다 .

그것은 광범위한 주제이지만 위의 정보가 당신을 시작할 수 있기를 바랍니다.


따라서이 방법은 상호 침투를 방지하는 대신 물체가 압축되는 것처럼 저항을 제공하지만 저항을 제공합니까?
CiscoIPPhone

그것은 저항을 제공합니다. 그렇습니다. 저항은 몸이 침투하려고할수록 증가합니다. 실제로, 델타 시간이 충분하지 않은 경우 (예 : 10ms) 상호 침투를 생성하지 않습니다. 그러나이 방법의 실제 장점은 여러 가지 이유로 상호 침투 된 바디 (위치가 변경되고 네트워크로 고정 된 바디와 위치가 수정 된 바디)가 있고이 기술이 없으면 바디가 분리되어 있어야하는 경우입니다. 점차적으로 분리되지 않고 폭발합니다.
Samaursa
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.