Giải quyết va chạm


23

Tôi biết khá rõ cách kiểm tra va chạm, nhưng tôi không biết cách xử lý va chạm theo cách tốt.

Đơn giản hóa, nếu hai vật thể va chạm vào nhau, tôi sử dụng một số tính toán để thay đổi hướng vận tốc. Nếu tôi không di chuyển hai vật thể chúng vẫn sẽ chồng lên nhau và nếu vận tốc không đủ lớn thì chúng vẫn va chạm sau lần cập nhật tiếp theo. Điều này có thể khiến các đối tượng bị mắc kẹt trong nhau.

Nhưng điều gì sẽ xảy ra nếu tôi cố gắng di chuyển hai đối tượng để chúng không trùng nhau. Điều này nghe có vẻ là một ý tưởng tốt nhưng tôi đã nhận ra rằng nếu có nhiều hơn hai đối tượng thì điều này trở nên rất phức tạp. Điều gì sẽ xảy ra nếu tôi di chuyển hai vật thể và một trong số chúng va chạm với các vật thể khác vì vậy tôi cũng phải di chuyển chúng và chúng có thể va chạm với các bức tường, v.v.

Tôi có một trò chơi 2D từ trên xuống trong đầu nhưng tôi không nghĩ điều đó có liên quan đến nó. Va chạm thường được xử lý như thế nào?

Câu hỏi này được hỏi thay mặt cho Wooh


1
Bạn có thể làm rõ loại trò chơi? "Từ trên xuống 2D" có thể có nhiều ý nghĩa: trò chơi phiêu lưu hành động theo phong cách Zelda, game bắn súng cuộn dọc hoặc trò chơi bi-a bỏ túi. Tất cả những thứ này sẽ có phong cách xử lý va chạm tiêu chuẩn rất khác nhau!
Ian Schreiber

2
Tôi không thể làm rõ điều đó. Câu hỏi không phải là về những gì sẽ xảy ra do một vụ va chạm, mà là về việc xử lý nhiều vấn đề chồng chéo. Tôi nghĩ rằng đủ để biết tôi đang đẩy các đối tượng ra khỏi nhau và tôi muốn họ cư xử thực tế để trả lời câu hỏi này.
CiscoIPPhone

Câu trả lời:


16

Daniel Kodicek bao quát chủ đề này rất chi tiết trong cuốn sách của ông, Toán học & Vật lý cho các lập trình viên .

Kodicek thực hiện hai điều để đạt được độ phân giải va chạm trông tự nhiên:

  • Chức năng phát hiện va chạm của anh ta tính toán thời gian chính xác hai vật thể sẽ va chạm.
  • Anh ta tính toán lại vận tốc mới tại thời điểm va chạm, vì vậy các vật thể không bao giờ trùng nhau.

Tôi đã tải lên bản demo dựa trên phát hiện và giải quyết va chạm của Kodicek .

cập nhật: Đây là một thuật toán phát hiện và giải quyết va chạm rất giống với phương pháp của Kodicek. Với mã nguồn . Tôi vẫn đề xuất cuốn sách của Kodicek, vì thuật toán của anh ấy được triển khai hơi khác và được giải thích kỹ lưỡng hơn nhiều.


1
Liên kết demo của bạn dường như bị hỏng.
tro999

@ tro999: liên kết cố định ngay bây giờ!
Leftium

Đó là một thuật toán cho các vòng tròn. Làm thế nào về hộp?
Anton Chikin

@AntonChikin: Thuật toán giải quyết va chạm của Kodicek chỉ mất ba đầu vào: khối lượng, vận tốc và bình thường tại điểm va chạm. Kodicek luôn tính toán bình thường tại điểm va chạm khi phát hiện va chạm. Ông giải thích nhiều loại phát hiện va chạm khác nhau, bao gồm một hộp đánh vào hộp khác. Chỉ cần cắm thuật toán phát hiện va chạm đó vào thuật toán giải quyết va chạm. Xem chương 8-10 của cuốn sách Kodicek để được giải thích đầy đủ. (Lưu ý vật lý quay đòi hỏi nhiều toán học hơn, cũng sẽ được đề cập sau trong cuốn sách ...)
Leftium

1
@ThomasHilbert: demo mã nguồn và Windows thực thi bây giờ đã có tại leftium.com/asteroid
Leftium

6

Điều gì nếu bạn kiểm tra va chạm trước khi các đối tượng di chuyển, thay vì sau đó? Hay nói cách khác, bạn từ chối vị trí mới nếu các đối tượng va chạm, tái sử dụng vị trí cũ trong trường hợp đó?

Mã giả:

  tmpPosition1 = Obj1.position
  tmpPosition2 = Obj2.position
  updatePosition(Obj1)
  updatePosition(Obj2)
  if collided(Obj1,Obj2) then
      updateVelocities( Obj1, Obj2 )
      Obj1.position = tmpPosition1
      Obj2.position = tmpPosition2
  endif

Bằng cách này, các vật thể sẽ va vào nhau khi chúng sắp va chạm , nếu bước cập nhật của bạn đủ nhỏ, người chơi sẽ không nhận thấy bất cứ điều gì lạ trong bản trình bày.


1
Điều này khá khó chịu, vì bạn không thể dễ dàng di chuyển song song với các đối tượng vì bạn không thể di chuyển tại al nếu bạn chạm vào các đối tượng khác.
Ikke

Trừ khi bạn giải quyết riêng x và y
Instantaphex

6

Bất cứ khi nào hai vật thể chồng lên nhau, hãy kiểm tra xem chúng đang di chuyển về phía trước hay cách xa nhau. Chỉ va chạm nếu chúng di chuyển về phía nhau.

Nó khá dễ với toán học vectơ, chỉ cần tính toán:

dot_product (B.poseition - A.poseition, A.velocity - B.velocity)

Nếu kết quả là dương tính, các đối tượng di chuyển về phía nhau.


4

Tôi có thể hiểu nhầm, nhưng có vẻ như bạn đang hỏi hai câu hỏi: 1. một số cách chung để giải quyết va chạm, thuật ngữ bạn đang tìm kiếm là 'mô phỏng dựa trên xung lực', và có một loạt các bài báo có thể làm điều đó công lý tốt hơn tôi có thể.

Tóm lại, bạn muốn điều chỉnh bước mô phỏng vật lý của mình trong không gian động lượng, đó là vận tốc nhân khối lượng (đừng làm những việc dựa trên lực lượng, tích hợp của bạn dù sao cũng không làm đúng).

Đối với phản ứng góc, may mắn là các mômen quán tính lớn nhất và nhỏ nhất luôn có thể được giảm xuống thành hai trục trực giao (ở dạng 2D), có nghĩa là một ma trận nhân sẽ hoạt động chung và nếu bạn xếp chúng theo trục X và Y, nó sẽ biến thành một vectơ 2D.

Khi bạn va chạm, bạn tìm ra phản ứng dựa trên các khoảnh khắc tuyến tính và góc tại điểm va chạm, và một yếu tố tốt là, nếu bạn có sự thâm nhập lẫn nhau, để áp dụng một số lực phạt (như đã đề cập ở trên) để tách rời hai cơ thể.

Từ thời điểm cuối cùng, bạn sẽ thêm ngày càng nhiều quy tắc để kiểm soát hành vi bất thường, như giới hạn động lượng góc tối đa để mọi thứ không quay như ngọn, v.v., nhưng đây là một khởi đầu tốt.

Giữ nó đơn giản nếu bạn có thể.

  1. Làm thế nào để bạn giải quyết vấn đề va chạm đa cơ thể

Cách thực sự duy nhất để làm điều này là với một hệ phương trình tuyến tính và rất nhiều cách giải. Cách thực tế để làm điều đó là có một hệ thống giống như ở trên, và có vật lý chỉ tự nhiên giải quyết theo thời gian.

Hầu hết các trò chơi làm những việc như lăn, hoặc đứng trên bề mặt chuyển động, đều có mô hình lai trong đó bàn chân của bạn được gắn vào một bề mặt (hoặc bánh xe trên đường) để đệm cho bước thời gian vật lý (sẽ dẫn đến chu kỳ phản ứng xen kẽ và sẽ không làm việc).

Hi vọng điêu nay co ich. Nếu bạn cần bất kỳ ví dụ toán học, cho tôi biết.


3

Cách thức này thường được giải quyết trong các động cơ vật lý là bằng cách áp dụng một lực phạt. Di chuyển cơ thể cứng nhắc sau khi thâm nhập sẽ không tốt nếu cơ thể cứng nhắc của bạn di chuyển với vận tốc cao hơn (bạn sẽ thấy chuyển động giật trong giây lát), mặc dù là bước đầu tiên, bạn nên thử điều đó và xem liệu nó có phù hợp với yêu cầu của bạn không.

A penalty forceđược áp dụng như một bộ giảm xóc lò xo, trong đó lực phạt được tăng lên, bạn càng thâm nhập vào cơ thể cứng nhắc và được giảm bớt trong các khung tiếp theo. Hãy nghĩ về nó như lò xo. Khi hai cơ thể cứng nhắc xâm nhập với nhau, chúng gặp phải một lò xo vô hình làm giảm tiến trình của chúng (nghĩa là ngăn chặn sự xâm nhập nhiều hơn) và áp dụng các đề cập trước đó penalty forcecho đến khi các cơ thể không còn xâm nhập.

Đây là một chủ đề rộng nhưng hy vọng những thông tin trên sẽ giúp bạn bắt đầu.


Vì vậy, thay vì ngăn chặn sự thâm nhập, phương pháp này cho phép nhưng cung cấp sức đề kháng, gần giống như các đối tượng đang bị nén?
CiscoIPPhone

Nó cung cấp sức đề kháng, vâng, sức đề kháng tăng lên khi cơ thể đang cố gắng thâm nhập. Trong thực tế, nếu bạn có thời gian delta đủ thấp (ví dụ 10ms), nó sẽ không tạo ra bất kỳ sự thâm nhập nào. Tuy nhiên, lợi thế thực sự của phương pháp này là khi bạn có các cơ thể đã thâm nhập vì nhiều lý do (vị trí đã thay đổi, chúng là các cơ thể cứng nhắc nối mạng và vị trí của chúng đã được sửa chữa) và bây giờ cần phải tách ra, bởi vì không có kỹ thuật này, các cơ quan sẽ nổ tung chứ không phải dần dần tách ra.
Samaursa
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.