Cách tốt nhất để xử lý các va chạm đồng thời trong một động cơ vật lý là gì?


13

Tôi đang viết một công cụ vật lý 2d bằng javascript để tôi có thể tìm hiểu thêm về vật lý trong các trò chơi video. Tôi có nó hoạt động chính xác cho các va chạm cơ thể cứng nhắc, ngoại trừ nếu bất kỳ cơ thể nào va chạm với hai hoặc nhiều cơ thể khác cùng một lúc.

Hiện tại đối với mỗi cặp vật thể va chạm (A, B) tôi điều chỉnh vận tốc và vận tốc góc của chúng dựa trên xung lực va chạm và đẩy chúng ra khỏi nhau để chúng không xâm nhập. Nhưng sau đó phát hiện va chạm và tính toán xung cho các va chạm khác liên quan đến A sẽ là sai.

Những cách tiếp cận nào tôi có thể khám phá để khiến động cơ của tôi hoạt động cho hơn 3 đối tượng va chạm với nhau?


2
Liên quan: gamedev.stackexchange.com/questions/15836/ Mạnhgamedev.stackexchange.com/questions/26181/ và tôi chắc chắn rằng có nhiều hơn, tôi không thể tìm thấy ngay bây giờ.
MichaelHouse

Câu trả lời:


11

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/Mvà 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 * Mm_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 "


Cảm ơn (+1)! 'Vận tốc bồi thường' và 'chuyển vị hình phạt' là gì? Ngoài ra, tại sao bạn nói rằng tích hợp verlet là 'lạm dụng'? Bạn có nghĩ rằng đó là một phương pháp xấu để sử dụng?
Cam

Vận tốc phục hồi chính xác là những vận tốc mà bạn có được từ các xung, sự khác biệt duy nhất là tôi tính chúng là dư lượng (tức là tôi lưu trữ sự khác biệt giữa vận tốc dựa trên xung lực và vận tốc hiện tại trong khi vẫn giữ tốc độ hiện tại không bị ảnh hưởng cho các tính toán tiếp theo). Chuyển vị hình phạt là các vectơ có độ dài được xác định bằng bao nhiêu đối tượng xen vào nhau và đó là vectơ có độ dài tối thiểu có thể dịch một đối tượng hoàn toàn bên ngoài đối tượng kia. Tôi thường thêm một chuyển vị như vậy cho mỗi đối tượng chia chiều dài cho 2).
teodron

1
Câu trả lời rực rỡ! Tôi có một câu hỏi khác mặc dù. Nói rằng tôi tích lũy vận tốc bồi thường, họ sẽ không cộng vào một con số rất phi thực tế chứ? Nếu tôi xử lý riêng từng va chạm với đối tượng A và chỉ cộng các hiệu ứng lên từng đối tượng thì A sẽ không có xung lực lan truyền giữa các đối tượng? Thay vào đó, sự thúc đẩy hoàn toàn sẽ được áp dụng cho từng điều có vẻ sai đối với tôi bằng trực giác
Cam

Đó là một câu hỏi rất hay .. từ một quan điểm, có vẻ hợp lý cho các xung động đóng góp một cách tích cực vào vận tốc kết quả. Đây là lý do của tôi (có lẽ bị lỗi!): Tưởng tượng ba quả bóng bi-a / bi da va chạm. Một trong số họ sẽ nhận được sự đóng góp từ hai người khác trong thời trang phụ gia này. Ban đầu, tôi nghĩ cân nhắc những đóng góp này và tính trung bình có trọng số cho vận tốc cuối cùng, nhưng vì tôi muốn có kết quả nhanh chóng, tôi đã bỏ qua ý tưởng này. Nói chung, bóng va chạm phải có sự đóng góp vận tốc từ hai người còn lại. Có lẽ một cuốn sách văn bản trường trung học có thể giúp đỡ.
teodron

3
Có lẽ tôi không hiểu những gì bạn đã giải thích, vì ví dụ sau đây vẫn khiến tôi lo lắng: Hãy xem xét một hình chữ nhật dài theo chiều ngang rơi thẳng xuống và giả sử sàn nhà bị lởm chởm (bao gồm nhiều hình tam giác cạnh nhau). Nếu có n hình tam giác, sử dụng phương pháp tích lũy của bạn, hình chữ nhật sẽ bật lại với tốc độ gấp n lần tốc độ cần thiết! Làm thế nào có thể khắc phục tình trạng đó?
Cam

1

Tôi đề nghị rằng, thay vì thay đổi vận tốc, bạn thay đổi các lực tác dụng lên một vật thể. Đừng "nâng niu" chúng ra, thay vào đó, hãy làm thật trơn tru và sử dụng mã đã có sẵn. Bằng cách này, cơ thể sẽ không ngay lập tức (và nhanh chóng, tôi cho rằng) thay đổi vận tốc của chúng.

Kiểm tra Box2DJS để biết ví dụ: http://box2d-js.sourceforge.net/index2.html .


-1

Tôi đã giải quyết một cách phân tích phương trình xung cho các nhóm va chạm. Vấn đề duy nhất tôi gặp phải là thiếu các biến để tìm cường độ tương tác tương đối giữa các liên hệ trong một nhóm, mà tôi đã lấp đầy độ sâu của các giao điểm cơ thể.

Giải pháp cho các liên hệ nhóm không khó hơn nhiều sau đó liên hệ đơn. Thật không may, tôi đã mất một bài báo với các tính toán, do đó không thể chia sẻ nó ở đây.

Chỉnh sửa: Có lẽ tôi đã nghĩ ra thứ gì đó như thế này /physics/296767/multipl-colliding-balls

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.