2011-08-18 38 views
33

Tôi đang bối rối. Cũng không bối rối, nhiều như không muốn làm 6 chương trình thử nghiệm để xem thuật toán nào là tốt nhất. Vì vậy, tôi nghĩ rằng tôi muốn hỏi bạn bè chuyên gia của tôi ở đây tại SO để cho tôi những lợi ích của kinh nghiệm của họ.Thuật toán tốt nhất để phát hiện xung đột hiệu quả giữa các đối tượng

Kịch bản là cảnh 3D có diện tích khá lớn so với kích thước của các đối tượng bên trong. Có khả năng hàng ngàn đối tượng trong cảnh. Các đối tượng có kích thước khác nhau từ mười phần của một đơn vị lên đến khoảng 10 đơn vị, nhưng không lớn hơn (hoặc nhỏ hơn). Các đối tượng có xu hướng được nhóm lại với nhau, nhưng các cụm đó có khả năng xuất hiện ở bất kỳ đâu trong cảnh. Tất cả các đối tượng đều năng động và di chuyển. Các cụm có xu hướng di chuyển cùng nhau, nhưng khi vận tốc của chúng có thể không giống nhau. Ngoài ra còn có hình học tĩnh để xem xét. Mặc dù có số lượng lớn các đối tượng động, cũng có một số đối tượng tĩnh trong cảnh (các đối tượng tĩnh có xu hướng là một hoặc hai đơn đặt hàng lớn hơn các đối tượng động).

Bây giờ, điều tôi muốn là cấu trúc dữ liệu không gian để phát hiện va chạm hiệu quả cho tất cả các mục trong cảnh. Nó sẽ là tuyệt vời nếu thuật toán cũng hỗ trợ truy vấn hiển thị quá, cho đường dẫn rendering. Để đơn giản, giả sử rằng phát hiện va chạm ở đây là giai đoạn rộng (nghĩa là tất cả các đối tượng động chỉ là các hình cầu hoàn hảo).

Vì vậy, trong nghiên cứu của tôi, tôi có thể sử dụng một trong số:

(1) octree (2) Loose octree (3) Tuyến tính octree (+ lỏng) (4) KD Tree (5) BSP Cây (6) Hashing

Cho đến nay (6) là lần duy nhất tôi đã thử. Đó là thực sự hoàn toàn tuyệt vời về tốc độ (8192 mục va chạm kiểm tra trong dưới 1ms trên hệ thống của tôi) nếu các đối tượng trong cảnh đang trên trung bình đồng đều trải ra. Nó không phải là một thuật toán tốt như vậy nếu tất cả các đối tượng được biến thành một khu vực nhỏ hơn, mà tôi cho là có thể.

Có ai có một số thông tin chi tiết về cách sử dụng hoặc bất kỳ thủ thuật nào tôi có thể sử dụng để tăng tốc độ không? Tôi nghĩ rằng bất cứ điều gì xảy ra tôi chỉ có thể sử dụng một cây BSP riêng biệt cho hình học tĩnh. Tôi cho rằng "quả cầu" năng động là những gì tôi quan tâm nhất ở đây. Lưu ý: không có CUDA, đây chỉ là CPU: p.

Cảm ơn

EDIT: Ok, nhờ Floris, tôi đã tìm thêm thông tin về cây AABB. Có một cuộc thảo luận cũ về GameDev tại đây: http://www.gamedev.net/topic/308665-aabb-tree---wheres-the-poly-o_o/. Trông giống như một sự thỏa hiệp tốt.

EDIT cuối cùng: Quyết định không phát minh lại bánh xe. Có thể thư viện vật lý đạn sẽ làm tất cả điều này cho tôi (nó có cây AABB trong nó, có lẽ cũng được tối ưu hóa quá).

+1

Bạn có thể bỏ qua KD-tree cho cảnh động. Công việc của cây KD trên các tập dữ liệu tĩnh, bạn sẽ phải xây dựng lại toàn bộ cây (phụ) mỗi lần một phần tử di chuyển – SingleNegationElimination

+0

Có, có vẻ như nó quá chuyên sâu để sử dụng trong các cảnh động. – Robinson

Trả lời

13

Câu hỏi hay.

Bạn về cơ bản có một sự đánh đổi phức tạp giữa:

  1. Tốc độ của một giai đoạn phát hiện va chạm hoàn
  2. Overhead của cập nhật/duy trì cấu trúc dữ liệu như các đối tượng di chuyển xung quanh

Nhược điểm tin tức là không có câu trả lời "hoàn hảo" vì điều này - nó sẽ thực sự phụ thuộc vào rất nhiều yếu tố khác nhau duy nhất cho tình huống của bạn. BSPs ví dụ là blisteringly nhanh cho 1. khi họ được tính toán trước với rất nhiều hình học phẳng phẳng, giải thích lý do tại sao họ đã rất phổ biến trong các trò chơi FPS đầu.

Dự đoán cá nhân của tôi là một cây AABB rời (Axis Aligned Bounding Box) với số lượng vật thể hợp lý (5-10?) Trong mỗi hộp giới hạn ở dưới cùng có thể sẽ hoạt động tốt nhất trong trường hợp của bạn. Lý do:

  • Bạn có một không gian khá lớn/thưa thớt với các cụm đối tượng. Cây AABB có xu hướng tốt cho điều này, vì bạn có thể cắt ra rất nhiều cấp độ mà bạn sẽ cần.
  • Bạn đang giả sử các hình cầu hoàn hảo. Sphere để kiểm tra va chạm hình cầu là rất rẻ, do đó bạn có thể dễ dàng đủ khả năng để làm 10-45 kiểm tra cho mỗi nút cấp dưới cùng. Về cơ bản N^2 là tốt cho các giá trị nhỏ của N :-)
  • Căn chỉnh trục giúp cập nhật cây đơn giản hơn nhiều và kiểm tra giao cắt rẻ hơn nhiều so với hầu hết các lựa chọn thay thế. Vì bạn đang giả sử các đối tượng hình cầu, tôi không nghĩ bạn sẽ thu được nhiều từ các hộp định hướng (mà chỉ thực sự mang đến cho bạn một lợi thế nếu bạn có nhiều hình dạng dài/mỏng ở góc độ hài hước).
  • Bằng cách cho phép các hộp giới hạn bị lỏng lẻo và chứa số lượng đối tượng hợp lý, bạn giảm khả năng chuyển động của bất kỳ đối tượng riêng lẻ nào sẽ mang nó ra ngoài ranh giới AABB. Trừ khi điều này xảy ra, bạn không cần phải cập nhật cây. Điều này sẽ giúp bạn tiết kiệm rất nhiều thời gian cập nhật cây. Khi nó xảy ra, mở rộng giới hạn với một chút lề để bạn không ngay lập tức phải mở rộng lại khung tiếp theo - hãy nhớ rằng hầu hết chuyển động có xu hướng tiếp tục theo cùng một hướng cho một vài khung hình!

Xin lỗi vì câu trả lời hơi len nhưng tôi hy vọng điều này sẽ cung cấp cho bạn một số ý tưởng hữu ích/điều cần cân nhắc!

+1

Câu trả lời rõ ràng mikera. Cảm ơn vì điều đó. – Robinson

+0

Không phải lo lắng. Bạn cũng có thể tìm thấy một số ý tưởng hay khác tại liên kết này: http://hectorgon.blogspot.com/2006/08/regular-grids-vs-aabb-trees-in-games.html – mikera

5

Nhiều công cụ vật lý sử dụng AABBTree (Cây hộp viền liên kết trục), Nó chia nhỏ một đối tượng thành các phần nhỏ hơn và nhỏ hơn. Bạn có thể phát hiện va chạm rất tốt bằng cách sử dụng bản ngã này. Cây này trông hơi giống một Octree.

Một OOBBTree (Hộp giới hạn định hướng) sẽ là phần truy cập tốt hơn.

+0

Chắc chắn. Đó là một hệ thống phân cấp khối lượng giới hạn, có lẽ tốt hơn rất nhiều cho thử nghiệm giao lộ hạt mịn. Tôi đã theo đuổi ý tưởng cho phát hiện pha rộng (nghĩa là di chuyển từng hạt/hạt). - Lỗi của tôi ... Tôi sẽ xem xét điều này một số chi tiết. Ví dụ đầu tiên tôi tìm thấy trên trang web này trông giống như nó đã được thực hiện va chạm hạt mịn nhưng có nhiều hơn tôi sẽ xem xét trong một mo. – Robinson

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