Kỹ thuật phát hiện va chạm của động cơ vật lý liên tục


10

Tôi đang làm việc trên một công cụ vật lý hoàn toàn liên tục và tôi cần chọn các thuật toán để phát hiện va chạm pha rộng và hẹp. "Hoàn toàn liên tục" có nghĩa là tôi không bao giờ thực hiện các bài kiểm tra giao nhau, mà thay vào đó, tôi muốn tìm mọi cách để bắt mọi va chạm trước khi nó xảy ra, và đặt từng thứ vào ngăn xếp "va chạm theo kế hoạch" được TOI yêu cầu.

Pha rộng Phương pháp pha rộng liên tục duy nhất tôi có thể nghĩ đến là bọc từng cơ thể trong một vòng tròn và kiểm tra xem mỗi vòng tròn có bao giờ trùng nhau không. Điều này có vẻ không hiệu quả khủng khiếp, và thiếu bất kỳ loại thải nào.

Tôi không biết những gì tương tự liên tục có thể tồn tại cho các phương pháp loại bỏ va chạm rời rạc ngày nay, chẳng hạn như cây bốn lá. Làm thế nào tôi có thể đi về việc ngăn chặn các thử nghiệm rộng rãi không phù hợp và vô nghĩa như một động cơ rời rạc? Tôi cũng muốn có thể nhìn thấy va chạm nhiều hơn 1 khung hình phía trước.

Giai đoạn hẹp
Tôi đã xoay sở để điều chỉnh SAT hẹp thành một kiểm tra liên tục thay vì rời rạc, nhưng tôi chắc chắn có những thuật toán khác tốt hơn trên các bài báo hoặc trang web mà các bạn có thể đã gặp.
Những thuật toán nhanh hay chính xác nào mà bạn đề nghị tôi sử dụng và những ưu điểm / nhược điểm của mỗi thuật toán là gì?

Lưu ý cuối cùng:
Tôi nói các kỹ thuật và không phải là thuật toán vì tôi chưa quyết định về cách tôi sẽ lưu trữ các đa giác khác nhau có thể lõm, lồi, tròn hoặc thậm chí có lỗ. Tôi dự định đưa ra quyết định về điều này dựa trên những gì thuật toán yêu cầu (ví dụ nếu tôi chọn thuật toán chia đa giác thành hình tam giác hoặc hình lồi, tôi sẽ chỉ lưu trữ dữ liệu đa giác ở dạng này).


Tôi khuyên bạn nên kiểm tra những cuốn sách này amazon.com/Real-Time-Collision-Detection-Interactive-Technology/... amazon.com/...
concept3d

Tôi xin lỗi để thêm, nhưng tại sao không sử dụng Box2D? Nó được chuyển đến gần như mọi ngôn ngữ. Nếu bạn không có kế hoạch sử dụng nó, tại sao không duyệt qua nguồn đó để bạn có thể thấy cách nó quản lý sự va chạm của nó?
Derek

Câu trả lời:


2

Tôi thực sự chỉ đang ném ý tưởng xung quanh đây. Giả sử bạn có (ít nhất) currentvị trí và nextvị trí; cho từng khung hình.

Bạn sẽ cần hai giai đoạn rộng riêng biệt, theo sau là giai đoạn hẹp của bạn:

  • Một trong đó chỉ ra rằng một vụ va chạm sẽ xảy ra.
  • Một trong đó chỉ ra gần đúng nơi xảy ra va chạm (ví dụ SAT rộng / không chính xác)
  • Cuối cùng, pha hẹp của bạn sẽ cải thiện kết quả của pha rộng thứ hai.

Giai đoạn rộng ban đầu

Bạn có thể xem xét băm không gian (sử dụng nextvị trí, không current) cho giai đoạn rộng ban đầu. Điều này sẽ phân vùng không gian vấn đề của bạn độc đáo thành các nhóm ứng cử viên va chạm.

Giai đoạn thứ hai

Thực hiện đa mẫu nhị phân bằng phương pháp giao nhau vòng tròn mà bạn đã mô tả. Nói cách khác:

left = current
right = next
midpoint = (left + right) / 2
loop a desired amount of times tweaked to the accuracy you want:
  is a collision occuring at midpoint?
    right = midpoint
  else?
    left = midpoint
  midpoint = (left + right) / 2
pointOfCollision = midpoint

Điều chỉnh độ chính xác đó cũng có thể xem xét khoảng cách - tôi nghĩ rằng sử dụng 'bình phương độ dài' next - currentsẽ có được kết quả hoàn hảo về pixel.

Giai đoạn hẹp

Thực hiện đa mẫu nhị phân bằng cách sử dụng một cái gì đó như PMask - logic sẽ hoàn toàn giống như trên; chỉ sử dụng một thói quen va chạm khác nhau.

Cuối cùng

Bạn sẽ có thể làm việc ra thời gian-of-ngã từ pointOfCollision, currentvà hiện tại của bạn speedacceleration(giả sử bạn có một tích hợp lý).


Vì vậy, để phát hiện pha rộng thứ cấp, bạn có gợi ý tôi lấy điểm giữa của đường di chuyển của vòng tròn không và kiểm tra xem nó có nằm trong vòng tròn đang được thử không? Tôi đã nghĩ rằng tôi chỉ đơn giản là có thể tạo ra một phương trình cho khoảng cách hai vòng tròn với nhau theo thời gian và xem liệu bất cứ lúc nào khoảng cách bằng 0.
Griffin

Ngoài ra, Pmask làm gì chính xác? trang web không thực sự giải thích = /.
Griffin

@Griffin bình luận đầu tiên của bạn có thể hoạt động - xem nếu bạn có thể tìm ra. Về cơ bản, tôi đang thực hiện tìm kiếm nhị phân trên một không gian va chạm ... PMask khá thông minh. Xem 64-int không dấu dưới dạng lưới 8 x 8 pixel (bật / tắt) - một AND (nhị phân) đơn giản xác định nếu xảy ra xung đột (khác không); trước tiên bạn cần thực hiện một số thao tác bẻ khóa thông minh, nhưng đó là ý tưởng. Đọc nguồn để biết thêm; thật khó để giải thích ở đây (hay đúng hơn, lời giải thích của tôi sẽ tệ) - bạn thực sự cần phải tham khảo nguồn.
Jonathan Dickinson

1

Được rồi, tôi đã thấy bạn đã cập nhật câu hỏi của bạn để cụ thể hơn. Tôi sẽ cố gắng và giúp bạn thêm một số.

Đối với kiểm tra giai đoạn rộng đầu tiên của bạn, tôi thực sự khuyên bạn nên băm không gian .

Về cơ bản, bạn chia màn hình của bạn thành các lưới có kích thước bằng nhau. Sau đó, nếu một đối tượng nằm trong một lưới, bạn thêm nó vào một "nhóm" trong bảng băm 1D.

Đó là kiểm tra đầu tiên của bạn được thực hiện. Nếu các đối tượng không nằm trong cùng một nhóm, chúng sẽ không thể giao nhau.

Tiếp tục với điều đó, bây giờ bạn có một danh sách các thùng có các đối tượng (có khả năng) trong đó. Bạn có thể thực hiện một kiểm tra pha rộng khác ở đây bằng cách:

A.) Chia nhóm này thành 4 nhóm khác và kiểm tra bảng băm 1D. Nếu chúng không nằm trong cùng một thùng, không có va chạm.

Hoặc là:

B.) Thực hiện kiểm tra khoảng cách đơn giản và giữ chiều rộng và / hoặc chiều cao của đối tượng để đảm bảo độ chính xác.

Nhưng những gì về khi bạn có khả năng có một vụ va chạm?

Sau đó, tôi sẽ đề nghị một cái gì đó dọc theo dòng này . Về cơ bản, đây là một loại pha trộn giữa va chạm đa giác (đối với hình dạng phức tạp) hoặc hình chữ nhật / hình tròn cho hình dạng ít phức tạp hơn.

Ngoài ra, nếu bạn thực sự muốn "bắt va chạm trước khi chúng xảy ra và lưu trữ chúng" thì bạn luôn có thể làm điều gì đó như thế này:

Nếu hai đối tượng nằm trong cùng một thùng, thì chúng có thể va chạm.

Hơn nữa, các đối tượng có đủ gần để chúng có thể va chạm sớm không? (Có tính đến vận tốc, kích thước đối tượng và khoảng cách)

Nếu câu trả lời cho cả hai là có, thì hãy tiếp tục và lưu nó để làm bài kiểm tra giao lộ sau.


" Câu trả lời cũ

Thật không may, tôi đã mất theo dõi Sổ tay "Tất cả các loại va chạm và những gì chúng được sử dụng cho". :)

Tuy nhiên, mặc dù đây là một nhiệm vụ cực kỳ rộng, tôi sẽ giúp bạn bắt đầu.

Có một câu hỏi hay (đã trả lời) liên quan đến một cái gì đó như thế này ở đây .

Cũng như một bài viết của những người đã tạo ra N và N + ở đây .

Chưa kể, bạn đã có Va chạm Per-pixel dự phòng tốt .

Tôi thực sự nghi ngờ rằng bất cứ ai cũng sẽ có một danh sách tiện dụng của từng loại va chạm, nhưng điều này sẽ giúp bạn bắt đầu.

Tuy nhiên, tôi nên đề cập rằng loại va chạm bạn cần (và cuối cùng sẽ sử dụng) phần lớn phụ thuộc vào loại trò chơi bạn đang tạo. Đó là lý do tại sao bạn tìm thấy hướng dẫn - hầu hết mọi người cho rằng bạn có ý tưởng về những gì bạn muốn, vì vậy họ giúp bạn trong lĩnh vực cụ thể đó. Tôi nhận ra rằng hầu hết các liên kết của tôi là hướng dẫn về một chủ đề cụ thể, nhưng tôi nghĩ rằng một hướng dẫn sẽ thành thật giúp bạn nhiều hơn. Một danh sách là một điều, nhưng nếu bạn tự đọc về mỗi gạch đầu dòng, bạn có thể đi đến một quyết định có học thức hơn có thể sẽ phù hợp với nhu cầu của bạn cụ thể hơn.


Quên để thêm phương pháp tôi dựa trên sự va chạm của tôi (Per-Pixel bằng cách sử dụng Thiết kế thân tàu) Hãy tha thứ cho kho lưu trữ, trang web ban đầu đã lên thiên đường trang web. web.archive.org/web/20090126230334/http://www.ziggyware.com/ cho
electroflame
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.