Va chạm vật thể nhỏ, tốc độ cao: Tránh đào hầm


13

EDIT / CẬP NHẬT: Câu hỏi lớn nhất của tôi bây giờ là liệu phương trình "t = ..." của bước 3 là một ý tưởng hay hay có cách nào tốt hơn để làm điều đó. Hầu hết các vấn đề khác đã được giải quyết một phần hoặc đầy đủ, nhưng không có bình luận hay câu trả lời nào thực sự chạm đến vấn đề này. Một lần nữa, một giải pháp phân tích có thể được yêu cầu, vận tốc và khoảng cách quá lớn và các đối tượng quá nhỏ, đối với bất kỳ giải pháp lặp / đệ quy nào (một số được đề xuất dưới đây trong các nhận xét) mà tôi có thể nghĩ đến (mặc dù nếu có một giải pháp lặp / đệ quy đặc biệt sẽ xử lý tốt các loại tình huống này thì tôi chắc chắn sẽ mở cho nó). Cảm ơn bạn rất nhiều vì sự giúp đỡ của bạn cho đến nay, tất cả các bạn đều tuyệt vời và tôi thực sự đánh giá cao suy nghĩ và sự giúp đỡ của bạn!

Tôi đang cố gắng phát hiện va chạm giữa các vật thể nhỏ, tốc độ cao. Đây là một tình huống mà việc đào hầm có thể xảy ra rất dễ dàng, ngay cả ở tốc độ tương đối thấp.

Đúc tia sẽ không hoạt động, vì điều này đang phát hiện va chạm giữa hai vật thể tốc độ cao, không phải giữa một vật thể và một bức tường đứng yên. (Trừ khi tôi hiểu nhầm việc truyền tia?) Hiệu suất RẤT RẤT NHIỀU; nếu có thể, tôi muốn tránh một cú đánh hiệu suất lớn. Tôi đã có một quadtree chức năng và rất hiệu quả ( http://en.wikipedia.org/wiki/Quadtree ) được triển khai, vì vậy tôi sẽ sửa đổi và sử dụng nó như được mô tả dưới đây.

Chỉnh sửa: Giảm khoảng thời gian sẽ không hoạt động. Tốc độ quá cao đối với giải pháp này, điều đó có nghĩa là các lượt truy cập hiệu suất sẽ quá lớn, trong khi vẫn thiếu phần lớn các va chạm đường hầm . (Ví dụ: tôi có thể có một đối tượng có kích thước khoảng 1 đơn vị với tốc độ được tính bằng hàng triệu đơn vị mỗi khoảng thời gian ...)

GIẢI PHÁP ĐỀ XUẤT:

Bước 1:

Tạo một hộp xung quanh chuyển động của từng đối tượng, sau đó đưa các hộp đó vào góc phần tư để tạo danh sách ban đầu về các va chạm có thể xảy ra. Xem hình ảnh sau (hình ảnh này cho thấy một đối tượng hình tròn di chuyển từ vị trí này sang vị trí khác và chuyển động tạo ra một hình chữ nhật, sẽ được đưa vào góc phần tư):Hình chữ nhật được tạo bởi phong trào

Bước 2: (có thể muốn bỏ qua bước này?)

Đi qua danh sách các va chạm có thể được tạo ra bởi tứ giác. Xem nếu các hình chữ nhật cắt nhau trong mỗi va chạm có thể. Nếu vậy, tiến hành bước 3.

EDIT: Dưới đây, Sean Middleditch đề nghị sử dụng khối lượng quét / giao điểm của viên nang (nếu các đối tượng là hình tròn). Điều đó để lại ba tùy chọn: 1) bỏ qua bước 2 hoàn toàn. 2) Làm bước 2 theo cách của tôi. 3) Làm theo cách của Sean. Cách của Sean sẽ tốn kém hơn về mặt tính toán so với ý tưởng hộp của tôi, tuy nhiên nó sẽ loại bỏ nhiều điểm sai hơn so với cách của tôi, ngăn chúng đi đến bước cuối cùng.

Bất cứ ai cũng có thể nói từ kinh nghiệm như trong số 3 lựa chọn này là tốt nhất? (Tôi dự định sử dụng công cụ vật lý này cho một vài thứ khác nhau, vì vậy tôi đang tìm giải pháp "nói chung là tốt nhất" hoạt động nhanh nhất trong nhiều tình huống rộng nhất, không chỉ một trường hợp thử nghiệm cụ thể mà tôi có thể dễ dàng đo lường giải pháp nào là nhanh nhất).

Bước 3:

Sử dụng phương trình t = bên dưới, nếu phần tử phân biệt (tức là phần dưới căn bậc hai) âm hoặc 0, không có va chạm, nếu dương thì sử dụng giá trị t làm thời gian va chạm (sau đó dễ dàng điều chỉnh vị trí cho phù hợp. .. nếu cả hai đối tượng tiếp tục tồn tại sau vụ va chạm). Phương trình:

t = (-1/2 sqrt ((2 a w - 2 a x + 2 b y - 2 b z - 2 c w + 2 c x - 2 d y + 2 dz) ^ 2-4 (w ^ 2- 2 w x + x ^ 2 + y ^ 2-2 y z + z ^ 2) (a ^ 2-2 a c + b ^ 2-2 b d + c ^ 2 + d ^ 2-r ^ 2-2 r ss ^ 2)) - a w + a xb y + b z + c wc x + d yd z) / (w ^ 2-2 w x + x ^ 2 + y ^ 2-2 y z + z ^ 2 ) .

Trong đó (1 và 2 được sử dụng để biểu thị các đối tượng 1 và 2):

t là giá trị thời gian âm giữa 0 và -1, trong đó 0 là khung hiện tại và -1 là khung trước đó;

a = x vị trí 1;

b = y vị trí 1;

c = x vị trí 2;

d = y vị trí 2;

w = x vận tốc 1;

x = x vận tốc 2;

y = y vận tốc 1;

z = y vận tốc 2;

r = bán kính 1;

s = bán kính 2;

Đạo hàm: (^ 2 có nghĩa là bình phương)

Lấy phương trình tham số (ví dụ: newxpose1 = a + t w) cho chuyển động của các đối tượng và cắm chúng vào công thức khoảng cách (bình phương cả hai bên): công thức khoảng cách bình phương = (a + t w - (c + t x)) ^ 2 + (b + t y - (d + t * z)) ^ 2. Hãy nhớ rằng, t sẽ là tiêu cực. Để tìm thời gian va chạm cho hai vật tròn, chúng ta đặt cạnh trái bằng (r + s) ^ 2. Giải phương trình t bằng phương trình bậc hai (và rất nhiều đại số rất tẻ nhạt), chúng ta có được phương trình "t = ..." ở trên.

Những câu hỏi của tôi:

1) Đây có phải là một cách tốt để làm điều đó? Nó sẽ làm việc ở tất cả? Tôi sẽ gặp phải bất kỳ vấn đề không lường trước? (Tôi biết tôi sẽ gặp rắc rối khi có nhiều hơn 2 vật thể va chạm vào nhau, nhưng tôi không quan tâm vì trường hợp duy nhất tôi thực sự phản đối đó là khi chúng có vận tốc tương đối thấp (nếu vận tốc tương đối cao thì giải pháp "ngớ ngẩn" mà thuật toán đưa ra sẽ "đủ tốt" và con người sẽ không thể thấy lỗi) và nếu có hơn 2 va chạm với vận tốc tương đối thấp trong cùng một bước, hầu hết các giải pháp sẽ dù sao cũng đủ gần, vì tôi không có kế hoạch va chạm không đàn hồi)

2) Hiệu suất của tôi sẽ chịu đựng nhiều? Tôi không nghĩ rằng nó sẽ, nhưng nếu nó sẽ, có cách nào tốt hơn để làm điều đó?

3) Tôi có nên bỏ qua bước 2 và đi thẳng từ bước 1 đến 3 không? Rõ ràng bước 2 không quan trọng, nhưng nó có thể giúp hiệu năng (HOẶC nó có thể tốn nhiều thời gian CPU hơn so với tiết kiệm).

Tất cả các ý kiến, đề xuất hoặc phê bình khác đều rất đáng hoan nghênh. Cảm ơn sự giúp đỡ của bạn!


1
Christer Ericson có một số thông tin về thử nghiệm hình cầu / hình cầu quét trong cuốn sách màu cam của mình. Có khá nhiều cách để giải quyết vấn đề, nhưng tôi tưởng tượng bạn sẽ thích cách biệt một nửa. Thật tốt khi cố gắng tự mình lấy ra thứ này, nhưng bạn thực sự chỉ nên xem cuốn sách màu cam và so sánh để có được thói quen phát hiện thực sự tốt và tìm hiểu thêm.
RandyGaul

Âm thanh như bạn đã có một kế hoạch .. hãy thử xem nó hoạt động như thế nào?
Trevor Powell

Tôi nghĩ rằng cách "thông thường" là có một khoảng thời gian tối đa nhỏ trên thời gian delta của bạn. Vì vậy, nếu bạn có 1000ms trôi qua, chỉ cần mô phỏng 10 x 100ms (hoặc 100x 10ms, hoặc 33x 30ms, hoặc một cái gì đó tương tự).
tro999

@RandyGaul Tôi đã xem qua thuật toán được mô tả ở trang 215-218, đặc biệt là trang 218 (bản xem trước của Google). Nó khá thanh lịch, mặc dù tôi chưa nghĩ qua tất cả ý nghĩa, điểm mạnh và điểm yếu của nó. Nó sẽ nhanh hơn tôi nhiều? Nếu vậy, phần nào trong thuật toán của tôi chậm so với đệ quy của Ericson? Là phương trình trong bước 3 sẽ quá chậm? Đệ quy làm cho tôi do dự, vì một số đối tượng có thể di chuyển RẤT nhanh, và do đó rất nhiều đệ quy có thể là cần thiết trong một số trường hợp. (Ngoài ra, NGOÀI, $ 70 cho cuốn sách đó ...)
MindSeeker

1
@MindSeeker Tôi không có thời gian để xem xét đạo hàm của bạn, nhưng tôi khẳng định rằng các thuật toán trong cuốn sách của Ericson, bất kỳ trong số chúng, sẽ hoạt động thực sự tốt và có thể nhanh hơn và mạnh hơn công cụ của bạn. Bạn có thể tìm thấy các phiên bản PDF trực tuyến miễn phí, nếu bạn muốn demo các trang khác. Ngoài ra nếu bạn thường xuyên phát hiện va chạm, cuốn sách màu cam là một mặt hàng chủ lực.
RandyGaul

Câu trả lời:


9

Về cơ bản, bạn đã tạo ra một phiên bản hơi quá nhiệt tình của khối lượng quét .

Lấy hai vị trí của đối tượng. "Quét" đối tượng từ đầu đến cuối. Đối với một hình cầu, điều này sẽ tạo ra một viên nang. Đối với một hộp, điều này sẽ tạo ra một hình lục giác (hoặc hộp dài hơn là chuyển động dọc theo một trục). Đối với đa giác lồi chung, điều này sẽ tạo ra một đa giác lồi khác nhau.

Bây giờ bạn có thể thực hiện các bài kiểm tra giao nhau (bao gồm cả truy vấn bốn phương) bằng cách sử dụng khối lượng quét này. Bạn có thể tính toán khi xảy ra va chạm, chuyển tiếp mô phỏng từ thời điểm bắt đầu đến thời gian va chạm và lặp lại.

Một tùy chọn khác, có phần đơn giản hơn, là thực hiện những gì @ as999999 đã nêu và chỉ cần sử dụng khoảng thời gian nhỏ hơn hoặc tốc độ nhỏ hơn. Có một tốc độ tối đa lý tưởng xuất phát từ khoảng thời gian trong đó không có vật thể nào có thể di chuyển xa hơn phía hẹp nhất của nó trong một tương tác vật lý duy nhất. Đối với các đối tượng đặc biệt nhỏ hoặc đặc biệt nhanh, bạn có thể không thể tìm thấy một khoảng thời gian hợp lý nhỏ hoạt động tốt.

Xem Phát hiện va chạm trong thời gian thực để biết một trong những cuốn sách giới thiệu / trung gian tốt hơn về chủ đề phát hiện va chạm.


Cảm ơn cho đầu vào tuyệt vời! Phá vỡ câu trả lời của bạn để tôi có thể đặt câu hỏi về nó: "" Quét "đối tượng từ đầu đến cuối." Cho đến nay tôi đang theo dõi; chắc chắn là một cải tiến so với phương pháp hộp của tôi. Tôi sẽ cung cấp các hình dạng này cho đến bốn phần tư và sau đó kiểm tra các va chạm chính xác hơn. "Bạn có thể tính toán khi vụ va chạm đã xảy ra." Haha nói dễ hơn làm :) Bạn có khuyên tôi nên gắn bó với phương trình của tôi từ bước 3 cho bước không? đây có phải là cách tốt hơn không? Đây là phần thực sự quan trọng.
MindSeeker

[tiếp tục] "Một lựa chọn khác ..." Tôi nghĩ về tùy chọn đó, nhưng tiếc là tốc độ quá cao. Xem phản hồi bình luận của tôi với @ as999 và chỉnh sửa ở trên để biết thêm. Cảm ơn bạn rất nhiều vì đã giúp đỡ của bạn!
MindSeeker

Cách duy nhất để biết về hiệu suất là thử nó, đo lường và xem. Tôi đã thấy một số mã "rõ ràng" không hiệu quả ồ ạt thực hiện các phiên bản hiệu quả trước đây, thường là vì những lý do không trực quan. Đừng hỏi cái gì là nhanh nhất; kiểm tra và tìm hiểu
Sean Middleditch

Đủ công bằng, tôi sẽ tiếp tục và thử phương pháp của tôi, sửa đổi như bạn đề xuất. Câu hỏi của tôi trong bình luận vẫn đứng: "Bạn có thể tính toán khi xảy ra va chạm." Bạn có khuyên tôi nên gắn bó với phương trình của tôi từ bước 3 cho bước đó không? đây có phải là cách tốt hơn không? Đây là phần khó khăn nhất của vấn đề tôi nghĩ. Các khối lượng quét, nếu tôi hiểu chúng một cách chính xác, có thể cho tôi biết rằng các đường dẫn của các đối tượng giao nhau, nhưng không thể cho tôi biết nếu / khi các đối tượng tự va chạm.
MindSeeker

1
@MindSeeker Hình học quét là phát sóng trừ khi bạn đang tạo hình thay vì tia. Vì vậy, phương pháp sẽ trông tương tự như sử dụng phương pháp đúc tia với "tia" cho tất cả các vật thể chuyển động nhanh thay vì chỉ một tia so với vật thể đứng yên. Sau khi bạn xác định các va chạm tiềm ẩn từ các "tia", bạn cần giải quyết kịp thời trên cả hai "tia" để đảm bảo chúng ở cùng một vị trí cùng một lúc.
ném đá

2

Thuật toán được đề xuất trong câu hỏi hoạt động rất tốt: nó nhanh và hoàn toàn chính xác , ngay cả khi các đối tượng đang đi với tốc độ cực cao. Tôi đã thực hiện một phần tư, vì vậy sau khi cho các hộp từ bước 1 vào phần tư, tôi thấy bước 2 là không cần thiết: chương trình của tôi đã chạy gần như nhanh như trước.

Tôi đã sử dụng thuật toán này được vài tháng rồi và dường như nó hoàn toàn chính xác trong việc xác định thời gian va chạm. Vì dường như không có gì trên web tốt hơn, tôi khuyên bạn nên sử dụng cái này. . ).


1

Tôi chưa có đủ danh tiếng để bình luận, nhưng tôi chỉ muốn nói thêm rằng việc sử dụng những gì Sean Middleditch đã đề cập ở trên giúp tính toán "t" của bạn. Ít nhất nếu tôi hiểu câu trả lời của anh ấy và bạn đặt câu hỏi chính xác.

Đây là một liên kết đến một câu trả lời tuyệt vời của sam hocevar cung cấp lời giải thích tốt nhất về nó mà tôi từng tìm thấy (anh ấy cũng đã vẽ tranh, vội vàng!)

/gamedev//a/55991/112940

Nếu điều đó nhanh hơn phương pháp của riêng bạn thì tôi không thể nói, nhưng anh ấy chắc chắn cung cấp cho bạn mọi thứ bạn cần để thực hiện nó và so sánh với phương pháp của bạn.

Chỉ để tránh để lại "câu trả lời chỉ liên kết", tôi sẽ cung cấp tóm tắt nhanh về ý tưởng của anh ấy:

  1. tính toán sự khác biệt giữa Minkowski giữa hai hộp giới hạn
  2. sử dụng vận tốc tương đối giữa lúc đó, tạo một phân đoạn tia / đường thẳng từ điểm gốc đến hộp được tạo bởi Chênh lệch Minkowski để có được điểm giao nhau
  3. Nếu tia tới, chia khoảng cách tia của bạn đi theo chiều dài của vectơ biểu thị vận tốc tương đối và bạn sẽ có "t"
  4. nhấp vào liên kết tôi cung cấp ở trên và xem sam giải thích tuyệt vời về tất cả điều này, với rất nhiều hình ảnh. Thật là tuyệt vời
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.