여러 객체와 충돌하는 경우 충돌 해결


15

정적 객체와 이동 가능한 객체가 있습니다. 충돌은 분리 축 정리를 사용하여 감지됩니다.

예를 들어,이 상황에서는 두 개의 정적 객체 (빨간색)가 있습니다.

여기에 이미지 설명을 입력하십시오

및 둘 사이의 이동 가능한 물체 :

여기에 이미지 설명을 입력하십시오

내 알고리즘은이 두 개체 간의 충돌을 계산할 수 있으며 충돌에 대한 완벽한 해상도 벡터 (최소 변위 벡터를 의미)를 뱉어냅니다.

예를 들어 녹색 사각형과 오른쪽 빨간색 사각형 사이의 충돌을 확인하면 알고리즘이 충돌을 해결하기 위해 녹색 사각형을 이동하는 방법을 알려주는 벡터를 뱉어냅니다.

여기에 이미지 설명을 입력하십시오

MSPaint 에서이 그림을 빨리 그렸습니다. 그래서 그림에서 최소 변환 벡터가 맨 위에 녹색 사각형을 밀어 넣을 수는 있지만 여기서 왼쪽으로 밀어내는 것으로 가정합니다. 오른쪽이 실제로 더 짧습니다.

이에 접근하는 일반적인 방법은 한 번에 한 프레임이 아닌 프레임 당 한 번의 충돌 만 해결하는 것입니다. 그러나 제 경우에는 플립 플롭이 발생합니다.

먼저, 솔버는 두 개의 충돌을 감지하지만 오른쪽 사각형과 녹색 사각형 사이의 충돌 만 해결합니다.

여기에 이미지 설명을 입력하십시오

그런 다음 다음 프레임에서 왼쪽 빨간색 사각형과 녹색 사각형 사이의 충돌이 하나만 감지되어 해결됩니다.

여기에 이미지 설명을 입력하십시오

보시다시피, 이것은 실제로 충돌을 해결하지 않으며 (예를 들어 녹색 사각형을 맨 위로 밀어서) 두 상태 사이에서 무한대로 플립합니다.

이 문제를 어떻게 해결할 수 있습니까?


귀하의 예에서 직사각형을 사용하고 있습니다. 충돌 알고리즘은 한 축에서만 충돌을 해결합니까? 그렇다면 설명하는 동작이 발생하는 것이 좋습니다.
chaosTechnician

아니, 가능한 모든 축 (사각형뿐만 아니라 MS 페인트로 그리는 것이 가장 쉽습니다 : P)에서 모든 종류의 모양으로 해결할 수 있으며 항상 존재하는 가장 짧은 벡터를 찾아서 두 개체를 분리시킵니다. .
TravisG

+1 좋은 질문입니다. 제목에서 (2D) "태그"를 제거했습니다 . 피해야합니다 ( meta 참조 ).
bummzack

답변:


7

정확히 달성하려는 대상 (높은 물리적 정확도 또는 충분한 실시간 시뮬레이션)에 따라 추론 적 접점을 사용해 볼 수 있습니다.

자세한 내용은 다음과 같습니다. http://www.wildbunny.co.uk/blog/2011/03/25/speculative-contacts-an-continuous-collision-engine-approach-part-1/

그는이 기사에서이를 구현하기 위해 알아야 할 사항을 설명하고 다른 접근 방식 (스피어 캐스팅 및 충돌 시점 별 충돌 해결 방법 정렬)과 비교할 때 매우 간단합니다.

더 필요하거나 원한다면 (IIRC) $ 7의 소스 코드를 구입할 수 있습니다.

다음은 3D 구현에 대한 비디오입니다. http://www.youtube.com/watch?v=JvT2H1RmOas

단 한 번의 반복으로 시뮬레이션이 얼마나 안정적인지 확인하십시오. 프레임 당 여러 반복을 쉽게 사용하여 여러 충돌을 안정적인 상태로 해결할 수 있습니다.


2

먼저 각 충돌을 해결하는 데 필요한 모든 벡터를 계산 한 다음 그 결과를 계산할 수 있습니다.

이것이 바이트 될 수있는 유일한 경우는 예제에서와 같이 이러한 벡터가 서로 무효화하는 경우입니다. 이 경우 충돌을 해결할 수 없습니다.


충돌 에 약 epsilon * 10 크기의 작은 랜덤 벡터를 추가 하시겠습니까? 부동 소수점 산술은 나머지를 수행해야합니다.
Martin Sojka

2
예, 이것이 작동 할 수 있습니다. 그러나 지 터링 움직임을 만들 수도 있습니다.
Mihai Maruseac

1
결과에 대한 계산은 "무한 루프"문제를 해결하지만 같은 크기의 타일로 만들어진 벽을 미끄러지면서 움직일 때 몸이 나올 수있는 "균열"문제를 다시 소개합니다. 타일의 "균열"사이에 붙어 있습니다. 이 두 가지 문제를 모두 해결할 수있는 방법이 있습니까?
Vittorio Romeo

동의 ... 불가능한 강체 충돌을 해결하기위한 최선의 "올바른 대답"은 없습니다. 흔들 리거나 하나 이상의 개체에 약간의 "얼룩"을 허용합니다.
david van brink

0

자세히 살펴보면 해당 객체의 상태를 달성 할 수 없거나 달성 할 수없는 것입니다.

가장 왼쪽의 빨간색 모양은 모양 R1이고 가장 오른쪽의 빨간색 모양은 모양 R2입니다. 녹색 모양을 G로 설정하십시오.

즉, 세 물체 모두의 크기와 형상이 주어지고 모든 물체가 관통 할 수없는 경우 :

 (1) G could not have been just directly to the left of R2, since R1 has been there 
     already. Consequently, the translation of G from left to right, penetrating R2
     could not have occurred.
 (2) G could not have been just directly to the right of R1 since R2 has been there 
     already. Consquence of which is the same as that from (1).
 (3) Had G come from the top, the movement will be blocked by both R1 and R2, given
     that their geometry and Y coordinate is the same.

이제 알고리즘이 객체를 하나씩 쿼리하면 동시성 문제입니다. 즉, 알고리즘은 모든 객체를 동시에 확인해야하지만 알고리즘은 사용자가 제한합니다. 개체를 한 번에 하나씩 처리하고 ...

R2에 대해 검사 한 후 R1에 대해 G를 검사하면 G는 R1의 오른쪽에 합법적으로 나타납니다 (G가 R1에 임의의 크기 (또는 거리)로 벡터 <-1, -1>의 방향으로 접근하는 경우) ), R1과 G 사이의 검사가 허용하므로 이전에 수행 된 R2와 G 사이의 검사는 잊어 버리기 때문입니다.

당신이 할 수있는 해결책은 모든 최소 변위 벡터를 배열 또는 원하는 데이터 구조로 모으고 모든 객체에 적합한 것으로 선택하는 것입니다.

주어진 프레임에서 객체 (예 : G)는 한 방향 만 가질 수 있습니다. (오 남자, 보이 밴드처럼 들리네 ...)

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