빠르고 정확한 2D 충돌 탐지를 어떻게 구현할 수 있습니까?


11

두 개 이상의 2D 객체가 충돌하는지 감지하는 방법을 잘 알고 있지만 충돌 여부를 결정하는 방법에 관심이 있습니다. 이전 프로젝트에서는 다른 모든 객체 (O (n ^ 2) 수준의 어리 석음)에 대해 모든 객체 검사를 수행했으며 유동적이지 않은 게임 플레이를 만들었습니다.

다양한 포럼에서 Quadtrees, B-Trees 및 기타 생각할 수있는 다른 종류의 트리 또는 구조를 환영합니다.

충돌을 점검해야하는지 결정하는 가장 효율적인 구조는 무엇입니까?


1
고려해야 할 사항 중 하나는 이동 한 객체와 자신에게 가장 가까운 객체의 충돌 만 확인하는 것입니다. 현재 시스템이 수백 개의 객체로 잘 작동합니다. 이것이 바로 제가하는 일입니다.
ultifinitus

나는 gamedev.stackexchange.com/questions/14369/… 가 당신을 많이 도울 수 있다고 생각 합니다. 원래 병렬 처리를위한 알고리즘 이었지만 동일한 알고리즘이 단일 스레드 응용 프로그램을 향상시킬 수 있다고 생각합니다.
Ali1S232

1
@ultifinitus 그것은 본질적으로 내가 요구하는 것입니다. 모든 객체를 반복하고 위치를 확인하지 않고 어떤 객체가 근처에 있는지 어떻게 알 수 있습니까?
Mike Cluck

Mike, 내가 사용한 특정 코드를 이메일로 보내거나 c ++로 제공하거나 기본 구조를 제공 할 수는 있지만 그로 인해 다소 모호하고 복잡해질 수 있습니다.
ultifinitus

1
충돌 검사를 귀찮게 해야하는지 결정하는 데 가장 적합한 종류의 구조를 요청했기 때문에 복제본이 아닙니다. 다른 질문은 투명 대 투명하지 않은 충돌에 대해 묻고있었습니다. 말할 것도없이,이 질문은 당신이 연결 한 1 년 전에 질문되었습니다.
Mike Cluck

답변:


12

2D 게임의 경우, 2D 객체가 맵의 한쪽면에 매우 많은 분포를 갖지 않는 한 균일 한 그리드가 거의 항상 진행됩니다. 메모리 복잡도는 간단하고 (맵의 크기에 비례) 합리적으로 분포되어 있으며 O (1) 조회 시간과 평균 log (numberOfObjects / (행 * 열)) ^ 2 개의 교차 테스트 셀당 수행됩니다. 객체가 이동 한 셀만 검사하여 정적 지오메트리를 훨씬 효율적으로 만들 수 있습니다. 즉석에서 균일 한 그리드를 쉽게 수정할 수 있으며 (트리 기반 솔루션보다 훨씬 덜 고통스럽고) 구현하기가 더 쉽습니다. 2D 게임에서 사용하지 말아야 할 유일한 시간은 균일 한 그리드의 메모리 요구 사항이 너무 커지는 경우입니다 (예를 들어 레벨이 희소하지만 거대한 공간 시뮬레이션).


이 솔루션은 2 개 또는 4 개의 그리드 셀과 경계를 이루는 개체를 어떻게 처리합니까?
ashes999

1
객체가 겹치는 셀은 포함 된 것으로 간주되므로 객체가 여러 셀에있을 수 있습니다. 대부분의 공간 데이터 구조는 유사한 방식으로 오버랩 문제를 처리합니다.
Darcy Rayner

와우, 똑똑하다 건배 친구 +1
ashes999


1

세계에 하나의 "긴"치수 (X라고 함)가있는 경우 다른 객체와 비교하여 객체를 정렬 된 목록으로 유지할 수 있습니다.이 목록은 이동하면서 다시 정렬 할 수 있으며 충돌 감지는 X 축에서 겹칩니다.

또 다른 가능성은 활성 / 수동 개체 목록을 유지하고 수동 개체 (아직 움직이지 않는)를 신경 쓰지 않는 것입니다.

이들이 화면에서 플레이어가 볼 수있는 중간 크기의 물체라면 모든 것과 모든 것이 그렇게 나쁘지는 않을 것입니다.

그 외에도 Darcy와 함께 일관된 그리드가 좋습니다.

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