Làm thế nào để giải quyết sự xâm nhập của hai cơ thể va chạm


9

Tôi đã triển khai công cụ vật lý trò chơi 3D đơn giản. Tôi đã phát hiện va chạm khá tốt, bây giờ tôi đang cố gắng tìm ra phần phản ứng va chạm. Tôi đang sử dụng phương pháp dựa trên xung để tính vận tốc sau va chạm. Điều này hoạt động khá tốt, tuy nhiên, nó không hoàn toàn ngăn chặn các cơ thể tiếp tục thâm nhập. Vì vậy, tôi có thêm đoạn mã để giải quyết sự thâm nhập. Hiện tại, tôi chỉ di chuyển các cơ thể dọc theo tiếp xúc bình thường bằng một nửa độ sâu thâm nhập - cơ thể thứ nhất theo hướng tiếp xúc bình thường, cơ thể thứ hai theo hướng ngược lại.

Điều này là ok hầu hết thời gian, nhưng có một số tác dụng không mong muốn. Ví dụ, hãy tưởng tượng một hành lang hẹp và một vật thể di chuyển qua nó. Nếu đối tượng va vào một trong các bức tường của hành lang, độ phân giải thâm nhập sẽ di chuyển nó vào bức tường đối diện, sau đó trong khung tiếp theo quay lại bức tường đầu tiên và cứ thế. Hiệu ứng là đối tượng rung động rất nhanh giữa các bức tường không đẹp.

Vì vậy, câu hỏi của tôi là liệu có cách nào tốt hơn để giải quyết sự thâm nhập? Có lẽ không di chuyển các cơ thể, chỉ bằng cách nào đó điều chỉnh vận tốc của chúng (ngoài tính toán xung lực) để chúng ngừng di chuyển về phía nhau và sự xâm nhập sẽ tự giải quyết trong một vài khung hình tiếp theo. Tôi chỉ đoán ở đây. Có ý kiến ​​gì không?

Câu trả lời:


3

Khi bạn phát hiện va chạm, hãy xác định thời điểm / điểm nào các cơ thể bắt đầu va chạm và xử lý vụ va chạm vào thời điểm này. Bạn vẫn có thể có một sự thâm nhập nhẹ để giải quyết vào thời điểm này, nhưng nó sẽ nhỏ hơn nhiều và [thường] sẽ không mang lại các vấn đề dao động mà bạn gặp phải.

Hãy nói rằng bạn có các bước mô phỏng 100ms và trong một số khung hình, bạn có hai quả bóng va chạm một nửa (50ms) vào khung hình. Đầu tiên, bạn sẽ phát hiện ra rằng chúng va chạm tại bất kỳ điểm nào trong khung (mà tôi tin rằng bạn đã làm việc hiệu quả). Họ sẽ xác định tại thời điểm nào trong khung mà họ va chạm. Bây giờ xử lý va chạm, bao gồm 50ms đầu tiên của khung mà chúng không va chạm. Bây giờ bạn sẽ có vận tốc mới của quả bóng và bạn cũng có thể thực hiện các bước ngay bây giờ để đảm bảo rằng chúng không xâm nhập (những thứ này sẽ rất nhỏ vì nó "vừa mới xảy ra.") Cuối cùng, bạn sẽ mô phỏng 50 giây tiếp theo khung. Lưu ý rằng trong giai đoạn này, rất có thể có một vụ va chạm khác với một hoặc cả hai quả bóng này.


1
Vì vậy, về cơ bản, bạn đang đề xuất thực hiện phát hiện va chạm liên tục và sau đó xử lý các sự xâm nhập vẫn còn giống như tôi đã làm, vì chúng có thể sẽ rất nhỏ. Điều này có thể làm việc tôi cho rằng. Bây giờ tôi chỉ phải tìm ra cách để phát hiện va chạm của mình liên tục :)
adam

Không chắc chắn những gì bạn có nghĩa là liên tục. Nói đúng ra, không có gì liên tục trong mô phỏng vật lý, vì mọi thứ luôn được chia thành các bước rời rạc kích thước. Thực hiện các bước nhỏ hơn, về cơ bản là những gì tôi đề xuất, sẽ mang lại các lỗi nhỏ hơn (và dễ sửa hơn). Một cách khác để suy nghĩ về điều này là có một mối quan hệ trực tiếp giữa kích thước bước và lỗi (chẳng hạn như thâm nhập). Vì vậy, khi bạn phát hiện ra một lỗi như vậy, hãy chia thành các bước nhỏ hơn cho đến khi lỗi có thể sửa được.
thịt

Phát hiện va chạm liên tục có nghĩa là thay vì kiểm tra giao điểm giữa hai đối tượng tĩnh (vấn đề 3d), bạn kiểm tra liên hệ của hai đối tượng chuyển động (về cơ bản, vấn đề 4d). Thông thường chỉ đủ để xem xét vận tốc không đổi, bởi vì bạn có thể ước chừng các quỹ đạo với các đường cong tuyến tính từng phần. Ưu điểm là khoảng cách thâm nhập sẽ luôn bằng 0 (hoặc gần, do lỗi làm tròn số float). Tôi mặc dù bạn đang nói về điều này, nhưng có lẽ tôi đã hiểu sai câu trả lời của bạn?
adam

@adam Vâng, đó là những gì tôi đang nói.
thịt

2

Kiểm tra bài viết này - đã được đăng ở đây nhiều lần trước đây, chỉ cần tìm kiếm thông qua Hỏi & Đáp được gắn thẻ phát hiện va chạm - nó cho bạn biết cách thực hiện giải quyết va chạm "liên tục" mà steprcton đang nói đến:

http://www.gamasutra.com/view/feature/3383/simple_intersection_tests_for_games.php?page=3

Về cơ bản, bạn giải quyết một số phương trình động học cơ bản cho thời gian chính xác khi hai hộp giới hạn của bạn bắt đầu giao nhau. Bạn giải quyết các va chạm của mình tại thời điểm chính xác đó và sau đó tiến hành thời gian còn lại trong khung hình của bạn. Bạn có thể phải mô phỏng lại những gì xảy ra sau khoảnh khắc va chạm, vì vận tốc / gia tốc của các vật thể của bạn sẽ thay đổi. Nhưng có điểm bắt đầu của bạn, dù sao thì ... chúc mừng!


Cảm ơn, đã kiểm tra bài viết. Điều tôi đang sử dụng đại diện khác nhau của các đối tượng của tôi. Tôi đang sử dụng khối đa diện lồi và kiểm tra va chạm bằng định lý trục tách. Điều này có thể được mở rộng để xử lý các cơ thể chuyển động với vận tốc tuyến tính không đổi (mà tôi biết cách thực hiện), nhưng không biết làm thế nào để xử lý cả vận tốc góc. Nhưng tôi sẽ hỏi câu hỏi riêng nếu tôi quyết định đi theo con đường này.
adam
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.