Tôi sử dụng cách tiếp cận sau (tương tự như thuật toán phân tách hàng loạt của Tonge http://www.richardtonge.com/ ):
- phát hiện tất cả các cặp va chạm trong cảnh / bối cảnh của bạn. Đặt (A, B) là một cặp như vậy. Áp dụng ý tưởng phân tách khối / ma: nếu A tiếp xúc với các cơ thể M và B tiếp xúc với N các cơ quan khác, thì tạm thời đặt khối lượng của A thành
m_A/M
và của B thànhm_B/N
- tính toán đóng góp lực phản ứng / bồi thường cho mỗi cặp (A, B) và lưu trữ những đóng góp này trong các tích lũy riêng của A và B
- tính toán vận tốc phục hồi từ các xung (như bạn đã nêu) và lưu trữ chúng theo cùng một cách (như dư lượng vận tốc deltaV trong các bộ tích lũy riêng của chúng cho mỗi cặp (A, B))
- tính toán chuyển vị hình phạt (một lần nữa, tích lũy chuyển vị, không áp dụng chúng ngay lập tức!)
- đặt lại khối lượng của tất cả các cơ quan trước đây được chỉ định là các bên trong các cặp va chạm (
m_A = m_A * M
và m_B = m_B * N
)
Cách tiếp cận này tương tự như cách thuật toán lặp Jacobi hoạt động với các hệ phương trình tuyến tính đồng thời. Và nó không được đảm bảo để hội tụ, nhưng trong trình giả lập của tôi, nó thực hiện công việc khá trơn tru .. ở chế độ 3D (vâng, một kích thước phụ tăng thêm gấp đôi độ khó!).
Hãy cẩn thận : đúng vị trí và vận tốc chỉ sau khi giai đoạn phát hiện / xử lý va chạm của bạn kết thúc! Bằng cách đó bạn đồng thời cập nhật các diễn viên va chạm của bạn. Ngoài ra, các lực lượng bồi thường phải được tính đến vào lần tới khi bạn tích hợp cho các vị trí và vận tốc.
EDIT: Chà, tôi đoán bạn đang sử dụng phương thức tích hợp Verlet đã bị lạm dụng (cái này trở thành một cái tên quen thuộc trong những người đam mê gamedev). Trong bóng ma của xử lý va chạm và tích hợp, bạn có thể muốn xem ở đây .
CẬP NHẬT: Một số thông tin về cách tiếp cận va chạm (và tự va chạm cho vấn đề thực tế đó) có thể được tìm thấy trong các giấy tờ này:
Cách tiếp cận mà tôi đề xuất không phải là một đóng góp ban đầu, nhiều trò chơi sử dụng nó với kết quả hợp lý và nó được Jakobsen sử dụng tốt nhất trong công cụ trò chơi Hitman của mình.
Từ một kinh nghiệm thực tế, các lực phạt (tương tự như các lò xo tuyến tính hoặc hàm mũ nhận đầu vào từ khoảng cách thâm nhập) không giải quyết đúng cách các xuyên thấu khi các lực khác từ các cơ quan va chạm quản lý lớn hơn chúng. Đó là lý do tại sao tôi chọn kết hợp ba cách tiếp cận (gần như dư thừa): lực phản ứng Newton (bạn đẩy tường, đẩy tường), vận tốc xung lực (bóng bi da va chạm) và "không tự nhiên" di chuyển các cơ thể ra khỏi nhau về mặt hình học " giải pháp. Họ dường như cùng nhau cung cấp mọi thứ: loại bỏ hầu hếtCác tạo tác xen kẽ xấu xí, các cơ quan va chạm có xu hướng tương tác với nhau trong thời gian dài (do vận tốc và lực lượng phục hồi - ít nhất là các lực có xu hướng kéo các cơ thể trong kịch bản va chạm bị hủy bỏ và các cơ thể bật ra khỏi nhau) . Cuối cùng, để hiểu rõ hơn về các khái niệm đơn giản nhưng phổ biến này, tôi đề nghị phân tích các slide này .
Văn bia "phương pháp bị lạm dụng" của tôi mô tả các bước tích hợp Verlet được nhắm vào một niềm tin văn hóa phổ biến rằng đây là Chén Thánh của các phương pháp tích hợp. Nó chỉ tốt hơn một chút so với Euler Symplectic của nó (còn được gọi bởi một số anh em Euler bán ẩn). Cách tồn tại các phương thức tích hợp phức tạp hơn (và tất cả đều mang tên ẩn trong chúng). Các công cụ trò chơi mạnh mẽ sử dụng chúng, nhưng các nhà phát triển độc lập không có thời gian để thử nghiệm những thứ đó kể từ Verlet, khi được điều chỉnh theo một kịch bản cụ thể, thực sự rất tuyệt vời. Ngoài ra, hoàn toàn không có phương pháp tích hợp nào có thể xử lý các ràng buộc cứng nhắc mà không có một chút gian lận nào liên quan (không thể tìm thấy liên kết, nhưng bài báo mà tôi đang đề cập nên được gọi là "X.Provot -" Biến dạng biến dạng trong một khối Mô hình trẻ em để mô tả hành vi vải cứng nhắc "