2010-12-13 9 views
15

저는 현재 2D 게임을 촬영하고 있습니다. 충돌 감지에 쿼드 트리를 사용하고 있습니다. 나는 제대로 나무에 속한 노드/나뭇잎에 내 배우를 푸시 작동 쿼드 트리를 썼습니다. 그러나, 나는 약간 문제가있다.2D 충돌 탐지를위한 QuadTree

첫째, 실제로 네 쿼드 트리를 사용하여 개체가 충돌을 테스트해야하는 다른 개체를 선택하는 방법은 무엇입니까? 어떻게하는지 잘 모르겠습니다.

두 번째 질문이 나타납니다. 노드에 다른 노드의 이웃이 아니지만 객체가 노드가 몇 개에 이르기까지 충분히 크다고 가정 해 봅시다. 실제 충돌을 확인할 수있는 방법은 트리가 아닌 것으로 간주 할 수 있습니다. 멀리있는 노드에있는 객체와 충돌 할만큼 충분히 가깝습니까? 노드에 완전히 들어 가지 않는 객체를 부모 노드에 보관해야합니까?

내 게임에서 대부분의 개체는 크기가 다르며 돌아 다니고 있습니다.

나는 quadtrees에 관한 많은 블로그/기사를 읽었지만, 대부분 내가 찾고있는 것이 아닌 나무를 만드는 법을 설명한다.

도움/정보를 환영합니다.

+2

당신이 만든 게임이 정말로 당신이 링크 한 비디오와 같다면, 그것은 공간 인덱스를 전혀 사용하지 말아야한다는 것입니다. 정렬되지 않은 엔티티 목록은 아마 수백 개의 움직이는 객체까지 더 빨라질 것입니다. – SingleNegationElimination

+0

충돌에 따라 달라질 수 있습니다. 원 기반 충돌의 경우 아마 픽셀 기반이 아닐 것입니다. 또한 1D 정렬 된 엔트리 목록에서 이웃을 찾는 개체 수가 적 으면 일반적으로 IIRC가 가장 빠릅니다. 그러나 작동하는 쿼드 트리를 구현하는 것은 완전한 경험을 위해 가치가 있습니다. (그리고 또한, 총알 지옥 동향 shoot'em UPS는 쉽게 움직이는 개체의 수백을 가질 수 :)) – Kos

답변

15

모든 요소는 완전히을 포함하는 가장 작은 4 중 노드에 포함되는 규칙을 설정할 수 있습니다. 당신이 노드 A의 충돌을 검사 할 때

그런 다음 당신은 다음과 같이 진행합니다 : (A)의

  1. 현재 노드 = 루트 노드
  2. 체크 충돌을 각 요소와 직접 현재 노드
  3. 에서 할 수있는 경우 현재 노드의 하위 노드에 모두 포함되고 현재 노드를 해당 하위 노드로 설정하고 다시 2로 이동
  4. 마지막으로 현재 노드의 자식 노드에있는 모든 요소와 A의 충돌을 반복적으로 확인합니다 .

개체가 작을수록 더 깊어지고 쿼드 트리에 위치하므로 덜 자주 비교됩니다.

+0

BTW -이 컨벤션 * 어디 * 유일한 * 잎이 요소를 포함 할 수 있습니다 아마도 유일하게 존재하지 않습니다 - 그냥 첫 번째 내 마음에 온다. 당신은 다른 가정을 취하는 다른 변형을 발견했을 수도 있고 다른 접근법을 필요로 할 수도 있습니다. – Kos

+0

그래서 나는 잠재적 인 충돌을 테스트하기 위해 게임의 각 오브젝트에 대해 4 단계를 반복해야합니다. – dotminic

+2

예, 일반적인 경우입니다. 그러나 한 번에 여러 개의 나무를 가질 수 있습니다. 예를 들어 글 머리 기호는 글 머리 기호와 충돌하지 않습니다. 따라서 글 머리 기호와 별도의 나무를 사용하여 적목을 구분하고 모든 글 머리를 적목 등으로 확인할 수도 있습니다. 이 변형에서 실제로 얼마나 많은 나무가 필요한지 생각해보십시오. :) – Kos