Phản ứng va chạm trong trò chơi 2D: SAT & chuyển vị tối thiểu dọc theo một trục nhất định?


13

Tôi đang cố gắng thực hiện một hệ thống va chạm trong trò chơi 2D tôi đang thực hiện. Định lý trục tách (như được mô tả trong hướng dẫn va chạm của metanet ) có vẻ như là một cách xử lý phát hiện va chạm hiệu quả và mạnh mẽ, nhưng tôi không thích phương pháp phản ứng va chạm mà họ sử dụng. Bằng cách dịch chuyển một cách mù quáng dọc theo trục ít trùng lặp nhất, thuật toán chỉ cần bỏ qua vị trí trước đó của vật thể chuyển động, điều đó có nghĩa là nó không va chạm với vật thể đứng yên quá nhiều khi nó đi vào nó và sau đó bật ra.

Đây là một ví dụ về tình huống có vấn đề:

Thí dụ

Theo phương pháp SAT được mô tả ở trên, hình chữ nhật đơn giản sẽ bật ra khỏi hình tam giác vuông góc với cạnh huyền của nó:

Phản ứng theo phong cách SAT

Tuy nhiên, trên thực tế, hình chữ nhật nên dừng ở góc dưới bên phải của tam giác, vì đó sẽ là điểm va chạm đầu tiên nếu nó di chuyển liên tục dọc theo vectơ dịch chuyển của nó:

Phản ứng thực tế

Bây giờ, điều này có thể không thực sự quan trọng trong quá trình chơi trò chơi, nhưng tôi muốn biết liệu có cách nào hiệu quả và thường đạt được các chuyển vị chính xác theo cách này. Tôi đã sử dụng bộ não của mình trong vài ngày qua và tôi chưa muốn từ bỏ!

(Đăng chéo từ StackOverflow, hy vọng điều đó không trái với quy tắc!)


Nó là vi phạm các quy tắc. Đừng vượt qua.
Tấn côngHobo

Có, xóa nó khỏi StackOverflow và giữ nó ở đây: P
TravisG

gamedev.stackexchange.com/questions/9144/ Quảng Tôi đã trả lời câu hỏi cụ thể của bạn ở đây.
ultifinitus

Đã xóa khỏi SO.
Archagon

Bắt đầu một tiền thưởng, archagon: P Nếu không, tôi có thể phải. Câu hỏi này thực sự thú vị, và thật tuyệt vời khi thấy một câu trả lời không chỉ liệt kê một vài tài liệu tham khảo.
TravisG

Câu trả lời:


11

Đây là phương pháp tôi tìm thấy. Nó có thể là thiếu sót, nhưng tôi chưa tìm thấy bất kỳ vấn đề nào với nó trong phân tích chữ thảo của tôi. Nó cũng hoạt động cho các đa giác tùy ý với một vài sửa đổi nhỏ.

Trong hình minh họa bên dưới, vật thể màu xanh đang chuyển động và vật thể màu đỏ đứng yên. 1 Bước 1: Đối với mỗi đa giác, tìm hai điểm xa nhất dọc theo hình chiếu của đa giác đó lên đường vuông góc với vectơ chuyển động. 2 Bước 2: Chia từng đa giác dọc theo đường nối các điểm này. Một nửa đa giác đối diện với đa giác khác dọc theo vectơ chuyển động là "thân tàu phía trước". Đây là phần duy nhất của đa giác có thể va chạm. 3 Bước 3:Chiếu một vectơ từ mỗi điểm trên "thân tàu phía trước" của mỗi đa giác dọc theo vectơ chuyển động về phía đa giác đối diện và kiểm tra xem nó có giao nhau với mỗi cạnh của "thân tàu phía trước" của đa giác đối diện không. (Có thể chậm, nhưng máy tính ngày nay khá nhanh - phải không?) (Xin lỗi về mũi tên nghiêng. Tất cả các mũi tên phải song song.) 4 Bước 4: Lấy vectơ ngắn nhất. Đây là khoảng cách va chạm chính xác. 5 Bước 5: Voila! 6


2
Điều đó khá ấn tượng. Bạn có bao giờ so sánh tốc độ của thuật toán của bạn với đa mẫu đơn giản (4x hoặc 8x) không?
TravisG

Tiếc là không có.
Archagon

Thật ấn tượng và tôi chắc rằng toán học cũng không quá phức tạp / chuyên sâu. +1
you786

7

Kiểm tra câu hỏi tương tự này: Giải quyết va chạm

Và ngoài ra, từ http://www.metanetsoftware.com/technique/tutorialA.html#section5 (mà bạn đã đăng một liên kết tới :))

PHẦN 5: Đối tượng chuyển động nhanh

Như đã đề cập ở trên, các vật thể nhỏ và / hoặc chuyển động nhanh có thể gây ra sự cố khi sử dụng thử nghiệm va chạm tĩnh. Có một số cách tiếp cận có thể được thực hiện để xử lý các đối tượng như vậy - đơn giản nhất là hạn chế thiết kế trò chơi của bạn để các đối tượng đó không cần thiết.

Nếu bạn hoàn toàn phải có chúng, có hai phương pháp phổ biến để đối phó với các vật thể nhỏ và / hoặc chuyển động nhanh: thử nghiệm va chạm quét và đa mẫu.

- = kiểm tra quét = -

Thay vì kiểm tra sự giao nhau giữa hai hình dạng tĩnh, thay vào đó chúng ta có thể tạo các hình dạng mới bằng cách quét các hình dạng ban đầu dọc theo quỹ đạo của chúng và kiểm tra sự chồng chéo giữa các hình dạng quét này.

Ý tưởng cơ bản được mô tả trong [Gomez], cho các thử nghiệm quét vòng tròn và AABB-AABB.

- = đa mẫu = -

Một cách khác đơn giản hơn nhiều để kiểm tra quét là đa mẫu; thay vì thực hiện một thử nghiệm tĩnh duy nhất tại vị trí mới của đối tượng, hãy thực hiện một số thử nghiệm tại một số vị trí nằm giữa vị trí mới và trước đó của đối tượng. Kỹ thuật này đã được sử dụng để va chạm với ragdoll ở N.

Nếu bạn chắc chắn rằng các mẫu luôn được đặt cách nhau ở khoảng cách nhỏ hơn bán kính của đối tượng, điều này sẽ tạo ra kết quả tuyệt vời. Trong quá trình thực hiện, chúng tôi giới hạn số lượng mẫu tối đa, do đó tốc độ rất cao đôi khi sẽ dẫn đến sự cố; đây là một cái gì đó có thể được điều chỉnh dựa trên ứng dụng cụ thể của bạn.

BIÊN TẬP

Tóm lại và AFAIK, có một vài giải pháp

  1. Hạn chế trò chơi của bạn không bao giờ có một vật thể nhỏ và / hoặc di chuyển nhanh thậm chí có thể gây ra điều này
  2. Triển khai một hệ thống ngăn chặn va chạm thực sự xảy ra, như được mô tả trong liên kết đầu tiên tôi đã đăng
  3. Tăng tỷ lệ lấy mẫu của bạn cho các đối tượng chuyển động nhanh và / hoặc nhỏ
  4. ... Có thể nhiều hơn, nhưng tôi không phải là một chuyên gia.

1

Nó phụ thuộc nếu bạn chỉ muốn chuyển động tuyến tính, hoặc nếu bạn cần phải đối phó với chuyển động góc là tốt.

Một cách khác để sử dụng SAT:

Trong trường hợp chỉ tuyến tính, bạn chỉ có thể chiếu tia chống lại Sự khác biệt của Minkowski của hai đa giác từ gốc tọa độ theo hướng vận tốc tuyến tính delta của các vật thể.

Nếu tia chạm vào MD, hai vật thể sẽ va chạm và điểm nhấn sẽ cho bạn biết thời gian mà chúng va chạm.

Bây giờ, nếu các đối tượng đang di chuyển và xoay nó sẽ khó khăn hơn, nhưng bạn vẫn có thể sử dụng một kỹ thuật tương tự. Tiến bộ bảo thủ sẽ cho phép bạn đối phó với trường hợp này. Kỹ thuật này là lặp đi lặp lại; mỗi lần lặp sẽ tạo ra một MD mới và đưa bạn đến gần thời điểm giao nhau hơn.

Đây là bản thảo dự thảo ban đầu về Tiến bộ bảo thủ:

http://www.cContuptphysics.com/BONSContinuptCollisionDetection.pdf

Tôi đã viết một bài báo giải thích kỹ thuật này một số chi tiết ở đây:

http://www.wildbunny.co.uk/blog/2011/04/20/collision-detection-for-dummies/

Hy vọng những sự giúp đỡ này!

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.