Trong một công cụ vật lý 2D, làm cách nào để tránh các độ phân giải va chạm vô dụng khi các vật thể nghỉ ngơi?


9

Trong một công cụ vật lý mà tôi đang phát triển (để học) sử dụng love-2d , tôi đã thực hiện các giải pháp va chạm theo cách này:

FixedUpdate(dt)  // I use fixed timestep
 foreach collide c1 in allNotStaticColliders
   c1.integartePhysic // i.e. apply gravitational force..
   foreach collider c2 "near" c1 // "near"= I use spatial hashing 
      if collide(c1,c2)
        resolve collision (c1,c2)  // the heavy operation
        collison callbacks c1
        collison callbacks c2
        ...

hoạt hình của các vật thể rơi xuống và dừng lại

Như bạn có thể thấy ở phần cuối của hình ảnh động gif, có một phân rã FPS khi tất cả các trình thu thập gần như được nối đất trên một vật thể tĩnh.

trạng thái tĩnh cuối cùng, với 2 FPS

Điều này là do số lượng độ phân giải va chạm tăng lên khi các đối tượng dành nhiều thời gian chạm vào khi chúng giải quyết. Tuy nhiên, nhiều tính toán là "vô dụng" vì các đối tượng đã ổn định vị trí ổn định với nhau.

Cách thực hành tốt nhất (hy vọng không yêu cầu bằng cấp vật lý) để tránh những phát hiện va chạm "vô dụng" này là gì?

Chỉnh sửa: gợi ý DMGregory được chấp nhận và đi đến kết quả này (chưa tối ưu)

nhập mô tả hình ảnh ở đây

(Đỏ = tĩnh, Xanh lam = hoạt động, Xanh lục = ngủ)


1
Cách tiếp cận thông thường là "ngủ" các đối tượng nghỉ ngơi và không xem xét các tương tác giữa các đối tượng ngủ / tĩnh (nhưng một đối tượng ngủ vẫn có thể bị đánh thức bởi sự tương tác từ một đối tượng động vẫn còn thức & di chuyển). Thật không may, điều này chỉ giúp một khi một đối tượng hoàn toàn nghỉ ngơi. Nếu tôi đọc ví dụ của bạn một cách chính xác, có vẻ như các rắc rối về hiệu suất của bạn bắt đầu khi các đối tượng vẫn đang ổn định và di chuyển nhẹ. Tất cả những gì tôi có thể nghĩ phải làm ở đây là thêm ma sát / giảm xóc vào hệ thống (có thể với ngưỡng vận tốc) để các chuyển động nhỏ phân rã thành phần còn lại thực sự nhanh hơn.
DMGregory

@DMGregory Nghe có vẻ như là một câu trả lời hay. Thêm nó?
Anko

Câu trả lời:


9

Tôi nghi ngờ OP đã biết cách tiếp cận này vì vậy tôi đã đề cập đến nó trong một bình luận chỉ là điểm khởi đầu, nhưng tôi sẽ cố gắng làm rõ hơn một chút ...

Hầu hết các động cơ vật lý chia các vật thể động thành hai nhóm, " thức " và " ngủ ".

Đối tượng ngủ khi họ ngồi nghỉ, và thức dậy khi di chuyển hoặc tăng tốc bởi một số ảnh hưởng bên ngoài.

Một giấc ngủ đối tượng cư xử như một đối tượng tĩnh trong hầu hết các khía cạnh - phong trào của nó không được tích hợp theo thời gian (vì đó là lúc nghỉ ngơi, vì vậy nó không có phong trào) và bỏ qua của động cơ va chạm giữa các đối tượng đó đang ngủ hoặc tĩnh.

Một vật thể ngủ trên sàn tĩnh không rơi qua nó, mặc dù không có phản ứng va chạm, bởi vì tất cả sự tích hợp chuyển động được bỏ qua cho các vật thể ngủ, bao gồm cả trọng lực.

Vì vậy, chỉ có các va chạm liên quan đến ít nhất một đối tượng động tỉnh táo cần được kiểm tra:

Collisions    Static          Sleeping           Awake
          ------------------------------------------------
Awake     |    Check        Check & Wake         Check
Sleeping  |     No               No
Static    |     No

Điều này có thể làm giảm đáng kể số lượng các đối tượng cần mô phỏng hoạt động, đặc biệt là trong các cọc như minh họa trong câu hỏi có rất nhiều va chạm lẫn nhau để kiểm tra ít hoặc không có chuyển động ròng.

Ngủ chỉ giúp một khi các đối tượng thực sự đạt được nghỉ ngơi, có thể mất một lúc.

Một số điều bạn có thể làm để đạt được nghỉ ngơi sớm hơn:

  • Có tốc độ hoặc động lượng tối thiểu khác không, và kẹp bất cứ thứ gì nằm dưới nó về không. (Đây cơ bản là một epsilon, thường được sử dụng để so sánh phao)

  • Sử dụng ma sát, giảm xóc và va chạm không đàn hồi để năng lượng nhựa ra khỏi hệ thống và giúp nó đạt được phần còn lại nhanh hơn.

  • Tăng ma sát / giảm xóc / không co giãn một cách có chọn lọc đối với các vật chuyển động chậm để cho chúng nũng nịu cuối cùng để nghỉ ngơi, mà không ảnh hưởng đến hành vi của các cơ thể năng lượng hơn.


Câu trả lời tốt. Bạn chỉ ra một ý tưởng hay. Đối với kiểm tra giấc ngủ / thức tôi thấy 2 điểm yếu: 1) nếu đối tượng ngủ o1 dưới objet ngủ o2 thức dậy di chuyển khỏi o2, nó không đánh thức o2; 2) nếu tôi loại bỏ một nền tảng tĩnh dưới một vật thể ngủ, vật thể đó không tỉnh dậy (dưới lực hấp dẫn)
dnk drone.vs.drones 16/1/2016

1
@ dnkdrone.vs.drones Quan sát tốt. Chưa bao giờ tự mình viết một công cụ vật lý, tôi không chắc nó được xử lý như thế nào. Một khả năng là, khi đặt một đối tượng thành chế độ ngủ, chúng ta lưu trữ một danh sách các đối tượng mà nó chạm vào (hoặc thêm nó vào một cụm đối tượng cục bộ). Khi chúng ta đánh thức một đối tượng đang ngủ, chúng ta cũng đánh thức mọi thứ trong danh sách / cụm của nó. Có thể có nhiều lựa chọn thanh lịch hơn, như kiểm tra các liên hệ gần đó tại thời điểm thức dậy (trước khi nó chuyển đi).
DMGregory
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.