Làm thế nào để mô phỏng áp suất với các hạt?


11

Tôi đang cố gắng mô phỏng áp lực với một tập hợp các hạt hình cầu trong trò chơi Unity mà tôi đang xây dựng. Một vài lưu ý về vấn đề:

  • Mục tiêu là lấp đầy không gian / khoảng trống 2d liên tục bằng các quả cầu nhỏ, không ma sát. Trò chơi đang cố gắng mô phỏng áp lực ngày càng tăng của nhiều vật thể bị đẩy vào không gian này.
  • Bản thân cấp độ liên tục cuộn từ trái sang phải, nghĩa là nếu người dùng không thay đổi kích thước của không gian, nó sẽ tự động nhỏ hơn (phần ngoài cùng của không gian sẽ liên tục cuộn ra khỏi màn hình).

Tôi đang tự hỏi những cách tiếp cận nào mà tôi có thể thực hiện để giải quyết những vấn đề này ...

  1. Biết khi nào cần phát hiện khi có không gian để lấp đầy và sau đó thêm hình cầu vào không gian.
  2. Loại bỏ các hình cầu từ không gian khi nó đang co lại.
  3. Các chiến lược để mô phỏng áp lực lên các quả cầu sao cho chúng "nổ tung ra ngoài" khi có nhiều không gian hơn được tạo ra.

Cách tiếp cận hiện tại tôi đang dự tính là sử dụng một bức tường chuyển động liên tục, đó là tắt màn hình và di chuyển với màn hình, như hình ảnh này minh họa:

sức ép!.

Bức tường chuyển động này sẽ đẩy và bẫy các quả cầu vào không gian. Đối với việc thêm các hình cầu mới, tôi sẽ có (1) hình cầu tự sao chép khi phát hiện không gian trống, HOẶC (2) sinh ra chúng ở phía bên trái của không gian (nơi có bức tường) - đẩy phần còn lại của hình cầu lấp đầy không gian. Tôi thấy trước các vấn đề với ý tưởng số 1 vì điều này có thể sẽ không thực sự tạo ra / mô phỏng áp lực; ý tưởng số 2 có vẻ hứa hẹn hơn, nhưng đặt ra câu hỏi làm thế nào để cung cấp vị trí cho các hạt hình cầu mới này sinh sản (và sự phân nhánh sinh sản chúng khi không có không gian).

Cảm ơn rất nhiều trước sự khôn ngoan của bạn!

Câu trả lời:


6

Tôi không chắc chắn chính xác những gì bạn muốn đạt được, là bức tường đẩy các hạt khi không gian lăn ra khỏi màn hình một cơ chế trò chơi?

Đối với ba điểm của bạn, tôi nghĩ rằng tất cả các hành vi đó sẽ xuất hiện nếu bạn đối xử với các hạt của mình như vậy: Mỗi hạt sẽ đẩy từng hạt khác tỷ lệ nghịch với khoảng cách, và cũng có thể chúng va chạm với các bức tường trong không gian của bạn để ngăn chặn chúng.

Các hạt gần nhau sẽ đẩy nhau và do đó lan ra để lấp đầy khoảng trống cho đến khi bị chặn bởi chướng ngại vật. Nếu / khi các bức tường di chuyển để làm cho không gian nhỏ hơn và đẩy các hạt, chúng sẽ bị đẩy lại gần các hạt khác, đẩy chúng mạnh hơn, từ đó sẽ đẩy các hạt khác, làm tăng áp lực chung.

Điều này sẽ khá giống với mô phỏng cơ thể n có lực hút âm, vì vậy tùy thuộc vào số lượng hạt, có thể khá tốn kém để tính lực đẩy cho mọi hạt với mọi hạt khác. Bạn có thể cố gắng đơn giản hóa điều này bằng cách mỗi hạt bị đẩy lùi chỉ bằng trọng tâm trung bình của khối lượng hạt của bạn, điều đó có thể tạo ra hành vi kỳ lạ ở những khu vực mỏng dài có uốn cong (khí của bạn không mở rộng ra khỏi khu vực uốn cong ra khỏi trọng tâm, ví dụ).

Đối với việc tạo và xóa các hạt (để đảm bảo có đủ số lượng phù hợp để lấp đầy khoảng trống mà tôi đoán?), Bạn có thể muốn đảm bảo không chỉ đơn giản thêm hoặc xóa các hạt khi thiếu mật độ, vì điều đó sẽ giới thiệu nhiều hạt đẩy lùi các hạt khác, và do đó tăng hoặc giảm áp suất.

Vì vậy, bạn có thể muốn đưa một yếu tố vào tính toán lực đẩy, giả sử bắt đầu bằng 1.0 và khi bạn thêm các hạt x, hãy tạo hệ số mới n / (n + x) trong đó n là số lượng hạt tổng số trước khi thêm các hạt mới.


2

Áp suất (như trong khí) chỉ là kết quả của sự va chạm đàn hồi đơn giản giữa các hạt của bạn và giữa các hạt và tường. Bạn chỉ cần đo lượng va chạm mỗi lần với các bức tường để có được giá trị cho áp lực của mình.

Hai ý tưởng bạn đưa ra không có mối liên hệ trực tiếp nào với áp lực, vì áp lực được đưa ra với một lượng hạt không đổi trong một volumina kín và nhiệt độ nhất định (dẫn đến các hạt chuyển động nhanh hơn hoặc chậm hơn).

Nếu bạn thêm các hạt vào hệ thống kín này, áp suất sẽ tăng lên, bởi vì có nhiều năng lượng hơn trong toàn hệ thống (bạn vừa thêm một hạt mới với nhiệt độ <-> nhất định).


các hạt phải có khối lượng cho các va chạm đàn hồi, vì các bức tường được giả định là có khối lượng gần + vô cực
Aron_dc

Tôi đã nói "áp lực là hàng loạt các vụ va chạm mỗi lần với các bức tường" không chính xác 100%. Trong một va chạm đàn hồi, bạn lấy xung của hạt đó và đo xem xung lực được cung cấp cho tường bao nhiêu. Vì vậy, nếu một hạt va chạm theo hướng thẳng đứng với tường, tường sẽ có xung 2mv (m = khối lượng của hạt; v = vận tốc của hạt). Vì vậy, bạn thực sự đo các xung đến trên tường. Hạt chỉ được phản xạ (v trước va chạm = -v sau va chạm). Điều này thậm chí còn giúp đo áp suất của hỗn hợp các khí khác nhau (m khác nhau đối với các hạt).
Aron_dc

0

Mỗi vòng lặp, bạn nên lặp qua tất cả các hạt của mình và sau đó tính toán một lực cuối cùng lên hạt đó. Về cơ bản, bức tường luôn cung cấp cho chúng một vectơ lực dương trên trục x, nếu chúng va chạm với nó (partic.x - partic.r <= 0).

Sau đó, mỗi hạt mà chúng va chạm cũng tạo cho chúng một vectơ lực, tùy thuộc vào góc giữa chúng. Bạn thu thập các góc này cho tất cả các hạt, tính trung bình, và bạn đi!

Có nhiều kỹ thuật tối ưu hóa bạn có thể sử dụng ở đây, chỉ cần tìm một số hướng dẫn vật lý bóng. Về cơ bản, bạn muốn lặp lại qua từng cặp hạt một lần và tính toán vectơ lực cho cả hai và lưu trữ nó trong chúng.

Điều này sẽ mô phỏng các khí, về cơ bản, và nếu bạn cho chúng một lực không đổi, chất lỏng cũng vậy, tôi đoán vậy.

Đối với việc tạo và xóa các hạt, tôi triển khai lớp ParticleEuctor, có vị trí, hướng và một số công cụ hữu ích khác. Ví dụ của bạn sẽ tốt hơn với một bộ phát có thể tạo các hạt trong một phạm vi nhất định, hoặc thậm chí tốt hơn, một hình chữ nhật.

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.