SAT를 사용하여 복합 모양의 충돌을 해결하는 방법은 무엇입니까?


16

SAT 는 임의의 볼록 다각형 사이의 충돌을 결정하는 적절한 방법입니다. 충돌을 해결하는 데 필요한 벡터를 얻을 수도 있습니다.

복잡한 (볼록하지 않은) 모양 사이의 충돌을 해결하기 위해 여러 볼록 다각형으로 구성된 일종의 복합 모양에 대해 생각하고있었습니다. 넓은 위상에서 충돌이 발생하면 (예 : 원 대 원 또는 AABB 대 AABB) 충돌은 복합 형태의 각 다각형 대 다른 복합 형태의 각 다각형을 확인하여 해결됩니다.

그래도 실제로 객체를 분리하는 가장 좋은 방법이 무엇인지 궁금합니다. 순진한 접근 방식은 가장 큰 크기의 벡터를 가져와 분리에 사용하는 것입니다. 다음 그림에서 이것은 V 2입니다.

SAT 예 1

그러나 분리 벡터가 다른 방향을 가리키면 충돌을 즉시 해결할 수 없으며 여러 번 반복해야 할 수도 있습니다. 다음 그림에서 우리는 V 1을 사용 하고 V 2에 의한 또 다른 반복에서 분리합니다 (또는 V 1 의 양만큼 모양이 움직였을 때 V 2에 가까운 무언가 ).

SAT 예 2

이 방법은 서로 반대 방향을 가리키는 벡터를 분리하거나 다음 그림과 같이 경우에 실패합니다.

SAT 예 3

여기서 우리는 왼쪽의 상태와 오른쪽의 상태를 끝없이 반복합니다.

따라서 실제 질문을하려면 :이 문제에 대한 합리적인 접근 방법은 무엇입니까? 복잡한 모양에 복합 다각형을 사용하는 것이 합리적이라고 생각하지만 그 경우 충돌을 어떻게 해결해야하는지 궁금합니다. 세 번째 이미지와 같이 막 다른 골목을 어떻게 감지합니까?


벡터를 사용하려는 대상을 명확히 할 수 있습니까?
— Will

@Will 모양이 더 이상 겹치지 않도록 벡터를 사용하여 충돌을 해결해야합니다. 따라서 결과 벡터로 노란색 객체를 이동할 수 있고 두 객체가 더 이상 충돌하지 않습니다.
— bummzack

답변:


7

나는 당신이 여기있는 방식으로 SAT를 적용하여 사각형 키를 둥근 구멍에 맞추려고 노력하고 있다고 생각합니다. 분명히, 그것은 오목한 오목한 충돌을 위해 고안된 것이 아니며, 그 목적에 맞게 수정하려는 당신의 노력을 칭찬하지만, 이것이 효과가 없을 것 같은 고려 사항이 있습니다.

실재론

각 임펄스와 노크 효과는 게임의 이름입니다.

접점의 순서는 현실적인 충돌 해결에 중요합니다. 실제로는 그 중 하나가 항상 다른 점보다 먼저 닥칠 것입니다. 그리고 접촉 순서와 그로 표현 된 각 "하위 충돌"의 결과를 모방하는 것만으로도 시뮬레이션에서 현실적인 결과를 얻을 수 있습니다. 이것이 처음에 오목한 부분을 볼록한 부분으로 분류하는 이유 중 하나입니다. 어떤 부분이 먼저 부딪 쳤는지 부분적으로 감지 할 수 있습니다. 물론 이것은 "Less realism"이라는 제목 아래의 나의 의견에 따라 모방 될 수도있다.

볼록한 고정구가 결합되어 개체의 윤곽과 중심을 모두 제공합니다 (물론 복잡한 시뮬레이션에서는 각 고정구가 밀도에 다르게 영향을 줄 수 있음). 내가 이것을 언급 한 이유는 사실적으로 충돌을 해결할 때 접점의 각 "하위 충돌"에 따라 선형뿐만 아니라 각 임펄스도 계산해야하기 때문입니다. SAT로 적용하는 기본 "푸시 분리"만큼 간단하지 않습니다.

그러면 문제의 본질이 완전히 바뀝니다. 보시다시피 2 개 이상의 접점 을 사용 하는 것은 무의미합니다. 실제로 중요한 것은 첫 번째 접점이기 때문입니다. 선형 및 각도 임펄스 측면에서 첫 번째를 해결 한 후에는 각 객체의 방향이 변경되므로 추가 충돌을 위해 다시 계산해야합니다. 또한, 단계에서 각각의 개별 접촉을 검출하는 것은 동일한 단계 내에서 수행 될 필요 가 있거나 필요 하지 않을 수있다-물체의 제 1 접촉점이 접촉 할 때의 접촉 사이의 타이밍에 따라, 후속 선형 및 각 임펄스가 적용되고, 두번째 접점 접촉 등.

덜 사실감

물론, 각도 임펄스를 해결하는 데 전혀 관심이 없다고 가정하면 SAT로 할 수있는 최선은 Graham의 스캔과 같은 것을 사용하여 이러한 다각형을 볼록하게 감싼 경우와 정확히 일치합니다. 단일 분리로 분리 벡터. 다시 말해, 시연 한 것처럼 세 개의 벡터를 함께 해결하려고 시도하는 것은 의미가 없습니다. 그것은 무리에서 가장 큰 것입니다.

질문에 대한 답변으로 수정

간단한 접근 방식을 원할 경우해야 할 일은 다음과 같습니다.

  • 올바른 변위 방향 을 결정하십시오 . 이것은 각각 볼록한 헐링과 분리 축에 대한 법선을 결정함으로써 가장 쉽게 수행됩니다.

  • 이제 변위 크기 를 결정해야합니다 . SAT에서 제공 한 크기 만 사용할 수없는 이유는 무엇입니까? 당신이 그것에 대해 생각하면, 상호 침투 깊이는 볼록 껍질에 대해 잠재적으로 더 커질 것입니다. 일치하는 오목 껍질에 대한 것보다-두 개의 E가 서로 이빨에 있다고 생각하십시오! 위에서 한 것처럼 주어진 단계에 대한 모든 접점을 찾으 되 올바른 변위 방향이기 때문에 축 법선 과 평행 한 것을 찾으십시오 . 이제이 병렬 오버랩 벡터 중 가장 긴 것이 무엇인지 결정하십시오. 그 하나를 대체하고 나머지는 버리고 다음 물리 단계로 진행하십시오.


무슨 말인지 알 것 같아 따라서 "현실감이 적은"시나리오에서는 개별 다각형에 대해 SAT에서 제공 한 (가장 짧은) 벡터를 평가할뿐만 아니라 다른 (더 큰) 겹침도 고려해야하고 최악의 경우 볼록 껍질을 사용해야합니까?
— bummzack

(최신) 편집을 참조하십시오.
— 엔지니어
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.