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 đề:

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ó:

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ó:

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!)
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.
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.
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.)
Bước 4: Lấy vectơ ngắn nhất. Đây là khoảng cách va chạm chính xác.
Bước 5: Voila!
