Ý tưởng cho mô phỏng nước 2D


18

Tôi đang tìm kiếm bất kỳ đầu vào nào trên mô phỏng nước ở dạng 2D, dựa vào một mảng khá lớn (gọi nó) bị chặn / không bị chặn (nhìn từ bên cạnh). Tôi đã đưa ra những ý tưởng sau đây:

Tế bào tự động

Thực hiện mô phỏng parralel ồ ạt trên CPU, sử dụng cell automata . Với các quy tắc đơn giản như:

  • Nếu có một ô mở xuống phía dưới di chuyển đến nó.
  • Kiểm tra các ô bên trái và bên phải, chọn một ô ngẫu nhiên trong số hai ô và di chuyển đến ô đó.

Ưu

  • Đơn giản để thực hiện.
  • Có ý nghĩa / xác định trong một hệ thống nhiều người chơi.

Nhược điểm

  • Có lẽ thực sự chậm.
  • Không thuyết phục.

Động lực học trên GPU

Thực hiện xấp xỉ sơ bộ động lực học chất lỏng trên GPU dựa trên kết cấu như sau:

+------+-----+-----+-------+
|R     |G    |B    |A      |
+------+-----+-----+-------+
|vX    |vY   |NULL |Density|
+------+-----+-----+-------+

Ưu

  • Có lẽ thực sự nhanh chóng.
  • Có thể khá thuyết phục.
  • Một pixel shader tiếp theo có thể khiến nó trực tiếp.

Nhược điểm

  • Khó thực hiện.
  • Khó chỉnh.
  • Tôi không thể phân bổ một kết cấu duy nhất kích thước của cấp độ của tôi.
    • Tôi có thể chồng lấp các khu vực lưới, nhưng điều này sẽ thêm phức tạp.

Các hạt

Sử dụng các hạt để mô phỏng nước. Trong quá trình kết xuất bằng cách sử dụng trộn phụ gia và sau đó áp dụng hàm nhân cho kênh alpha để tạo ra các cạnh sắc nét.

Ưu

  • Có lẽ sẽ nhìn tốt đẹp.
  • Dễ để thực hiện.
  • Dễ dàng để kết xuất.
  • Có ý nghĩa trong một hệ thống nhiều người chơi, mặc dù sẽ cần khá nhiều băng thông để chuyển.

Nhược điểm

  • Hiệu ứng liên hạt có thể sẽ chậm (tra cứu khu phố).
  • Có thể dẫn đến nước 'rò rỉ' qua các không gian rắn (vì không gian rắn nhỏ, ví dụ 1px).
  • Có thể dẫn đến các lỗ lạ trong nước tùy thuộc vào kích thước hạt.
  • Cả hai điều trên có thể được giảm thiểu bằng cách cho phép các hạt trôi gần nhau hơn kích thước thật của chúng, tuy nhiên sẽ gây ra vấn đề với hiệu suất giữa các hạt và hạt / cảnh.

Còn ý tưởng nào nữa không?

Lưu ý: Đây là một xấp xỉ, tôi không tìm kiếm nước chính xác ở đây - chỉ là thứ gì đó 'đủ tốt' (điểm thưởng cho nhanh và bẩn). Trò chơi là nhiều người chơi, vì vậy thật không may, toàn bộ cấp độ cần phải được mô phỏng liên tục.

Câu trả lời:


12

mỗi lần tôi cố gắng mô phỏng nước, cuối cùng tôi lại áp dụng bộ lọc thông thấp trên kết cấu đại diện cho mực nước. Việc thực hiện rất đơn giản nhưng thất bại bất cứ khi nào bạn có những thay đổi lớn về mực nước có thể tạo ra sóng lớn. Trong phương pháp này có một số nơi nước luôn có một số mức không đổi, như đầu sông. trong những trường hợp đó, bạn chỉ cần tô đúng màu cho pixel cụ thể đó.

Ưu điểm:

  • dễ để thực hiện
  • kết quả thực tế trong trường hợp nước lặng
  • tính toán nhanh bằng GPU
  • Dễ dàng xác định mực nước tĩnh hoặc nguồn nước

Nhược điểm:

  • không thể mô phỏng sóng

đối với vùng nước lượn sóng tôi sử dụng một số cách tương tự như thuật toán Cell Automata của bạn nhưng với một thay đổi nhỏ sẽ cho phép tôi sử dụng trình đổ bóng để tính bước tiếp theo từ tình huống hiện tại, đây là mã sudo, một lần nữa tôi đã có một kết cấu đại diện cho mực nước màu pixel:

foreach (pixel p) in oldTexture
{
    newtexture.pixels[p.x,p.y]    += p.color / 5;
    newtexture.pixels[p.x+1,p.y]  += p.color / 5;
    newtexture.pixels[p.x-1,p.y]  += p.color / 5;
    newtexture.pixels[p.x,p.y+1]  += p.color / 5;
    newtexture.pixels[p.x,p.y-1]  += p.color / 5;
}

thuật toán này có các tính năng tương tự như trước đây nhưng nó hoạt động tốt hơn trong vùng nước lượn sóng thay vì bình tĩnh. đó là lựa chọn của bạn dựa trên biển mà bạn đang mô phỏng để sử dụng một trong số chúng.

Cuối cùng, bạn đã có một kết cấu cho bạn biết mực nước cho từng vị trí, trong bước tiếp theo bạn phải rút ra kết quả bằng cách nào đó, cách dễ nhất là tạo lưới dựa trên dữ liệu mực nước.


Cảm ơn, đó là một câu trả lời tuyệt vời. Tôi sẽ để câu hỏi mở lâu hơn một chút; nhưng có vẻ như tôi có một sở trường để hỏi một câu trả lời ở đây :).
Jonathan Dickinson

bạn cũng có thể trộn các thuật toán này để có kết quả tốt hơn.
Ali1S 232

Làm thế nào về một ảnh chụp màn hình?
tro999

@ as999999 Tôi không có ảnh chụp màn hình, nhưng ở đây thuật toán tương tự được thực hiện! youtube.com/watch?v=avJPrL9UJ28
Ali1S232
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.