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ư):
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!