2010-12-13 77 views
15

Tôi hiện đang làm việc trên một 2D bắn chúng lên loại trò chơi, và tôi đang sử dụng một cây quad cho phát hiện va chạm của tôi. Tôi đã viết một cây quad làm việc một cách chính xác đẩy các diễn viên của tôi vào các nút/lá họ thuộc về trong cây. Tuy nhiên, tôi có một vài vấn đề.QuadTree cho phát hiện va chạm 2D

Thứ nhất, làm cách nào để thực sự sử dụng quadtree để chọn đối tượng khác mà đối tượng cần kiểm tra va chạm? Tôi không chắc chắn về cách thực hiện điều này.

Sẽ trả lời câu hỏi thứ hai. Giả sử tôi có một đối tượng trong nút không phải là hàng xóm của một nút khác, nhưng đối tượng đủ lớn để mở rộng một vài nút, làm cách nào tôi có thể kiểm tra một vụ va chạm thực sự, vì tôi đoán cây có thể xem xét nó không đủ gần để va chạm với các đối tượng trong một nút "xa"? Các đối tượng không hoàn toàn vừa với một nút có được giữ trong nút cha không?

Trong trò chơi của tôi, hầu hết các vật thể có kích thước khác nhau và di chuyển xung quanh.

Tôi đã đọc một số lượng lớn các blog/bài viết về quadtrees nhưng hầu hết chỉ giải thích cách xây dựng một cây không thực sự là những gì tôi đang tìm kiếm.

Mọi trợ giúp/thông tin đều được chào đón.

+2

Nếu trò chơi bạn đang tạo thực sự giống như video bạn đã liên kết, bạn không nên sử dụng chỉ mục không gian nào cả, Danh sách các đối tượng chưa được phân loại sẽ vẫn có thể nhanh hơn tới vài trăm đối tượng di chuyển. – SingleNegationElimination

+0

Phụ thuộc vào xung đột mà tôi nghĩ ... có lẽ là do va chạm dựa trên vòng kết nối, có thể không phải dựa trên pixel. Ngoài ra, đối với số lượng thấp các đối tượng tìm kiếm các nước láng giềng trong danh sách được sắp xếp theo thứ tự 1D, thường là nhanh nhất, IIRC. Nhưng thực hiện một quadtree làm việc là giá trị nó cho kinh nghiệm tuyệt đối. (Và ngoài ra, đạn bắn đạn xu hướng địa ngục có thể có hàng trăm vật thể di chuyển dễ dàng :)) – Kos

Trả lời

15

Bạn có thể thiết lập quy ước mọi phần tử được chứa trong nút tứ giác nhỏ nhất chứa toàn bộ số.

Sau đó, khi bạn kiểm tra va chạm cho nút A, bạn tiến hành như thế này:

  1. hiện tại node = gốc nút
  2. va chạm kiểm tra của A với mỗi yếu tố trực tiếp trong nút hiện
  3. nếu A lon được chứa hoàn toàn trong bất kỳ nút con nào của nút hiện tại, đặt nút hiện tại thành nút con đó và đi tới 2 lần nữa là
  4. cuối cùng, kiểm tra va chạm của A với tất cả các phần tử trong nút con của nút hiện tại, đệ quy .

Lưu ý rằng các đối tượng càng nhỏ, chúng sẽ nằm sâu hơn trong cây quad, do đó chúng sẽ được so sánh ít thường xuyên hơn.

+0

BTW - quy ước này trong đó * không * chỉ lá có thể chứa các phần tử có lẽ không phải là phần tử duy nhất tồn tại đến với tâm trí tôi. Bạn có thể đã vấp phải các biến thể khác có các giả định khác nhau và do đó cần một cách tiếp cận khác. – Kos

+0

Vì vậy, tôi cơ bản cần phải lặp lại những bước 4 cho mỗi đối tượng trong trò chơi để kiểm tra nó cho bất kỳ va chạm tiềm năng? – dotminic

+2

Có, trong trường hợp chung. Nhưng bạn có thể có nhiều cây cùng một lúc - ví dụ đạn không va chạm với đạn, vì vậy bạn thậm chí có thể có cây riêng biệt cho đạn và tách biệt, nói, kẻ thù, và kiểm tra từng viên đạn với cây đối phương, v.v. Kiểm tra logic của bạn và nghĩ có bao nhiêu cây bạn thực sự cần trong biến thể này :) – Kos

Các vấn đề liên quan