Làm thế nào tôi có thể xác định các khu vực chứa đầy nước?


9

Tôi muốn tăng cường công cụ trò chơi nhỏ của mình với mô phỏng nước đẹp mắt. Để bắt đầu làm việc, tôi cần tìm một cách thích hợp để thể hiện nước trong trò chơi. Thật không may, tôi không biết nhiều cách trình bày khác nhau, vì vậy tôi sẽ hỏi bạn. Có một câu hỏi tương tự tôi đã hỏi một thời gian trước đây. Nhưng vì tôi đã không đưa ra vấn đề rõ ràng, câu trả lời là đúng nhưng không phải là điều tôi đang tìm kiếm.

Trong một số trò chơi, nước chỉ được xác định theo mức độ cao. Ví dụ, mọi thứ dưới độ cao bằng không là dưới nước. Tôi thấy đại diện này trong các trò chơi (chủ yếu là cũ). Vấn đề là tôi muốn các hang động trong thế giới ngoài trời không bị ngập lụt và mực nước khác nhau cho mỗi hồ và biển.

Một đại diện khác, chính xác hơn, sự xuất hiện của nước là các hạt. Mỗi giọt nước được lưu trữ như một điểm trong không gian thế giới. Để kết xuất chúng, tôi có thể sử dụng các kỹ thuật như siêu dữ liệu để chúng xây dựng một lưới duy nhất. Đại diện này sẽ là tuyệt vời cho chủ nghĩa hiện thực vì tôi có thể dễ dàng tính toán động lực học giữa chúng. Đáng buồn thay, không có máy tính có thể tính toán một đại dương của siêu thị trong thời gian thực.

Có những cách khác để đại diện cho nước trong một động cơ? Tôi muốn có các hồ động, vì vậy việc xác định vùng nước bằng hình học tĩnh là không có tùy chọn. Ví dụ: nếu người chơi sửa đổi địa hình để mở rộng một hồ nước, nước sẽ lấp đầy vịnh đó và mực nước chung của hồ đó sẽ giảm nhẹ.


2
Làm thế nào là địa hình của bạn được tổ chức trong động cơ? Có các kỹ thuật khác nhau cho địa hình voxel so với heightmap so với polysoup (lưới).
Exilyth

Nó được đưa ra dưới dạng lưới và nước không nên trao đổi lưới địa hình khác với các lưới tĩnh khác.
danijar

1
Thương hay xử?
Tom 'Blue' Piddock

1
Có một số bản demo rất hay của một aproach metaball như vậy, nhưng tôi không thấy nó có thể sử dụng được trong bất kỳ trò chơi thực tế nào mà không hoàn toàn tập trung vào thực tế là mô phỏng nước ở một số điểm có thể tin được. Tôi không thấy một lý do chống lại chỉ một lưới, nó cũng không phải là một vấn đề để nó điều chỉnh theo các nền tảng hoặc thậm chí tạo ra nó dựa trên một số mô phỏng vật lý. Nhưng đó là điều bạn chỉ muốn làm nếu thực sự cần thiết. Để tham khảo mô phỏng nước bán thực tế, bạn có thể muốn kiểm tra "Từ bụi".
Slin

1
Giải pháp kích thước thay đổi là vấn đề "đại dương của siêu thị". Ngoài ra, tất nhiên sẽ có giới hạn đối với phương sai kích thước tùy thuộc vào thể tích, vì đó là phương tiện tối ưu hóa hiệu suất, không làm thay đổi thể tích nước. Chỉ cần thêm một sự xem xét đặc biệt, như gần với người chơi và bề mặt, cho các khu vực cần chi tiết như thác nước, phụ lưu, bờ biển hoặc suối.
Attackfarm

Câu trả lời:


3

Tôi không thể nói những gì thường được sử dụng, nhưng suy nghĩ đầu tiên của tôi sẽ là sử dụng một hệ thống hạt với các hạt có kích cỡ khác nhau đại diện cho nước có khối lượng khác nhau. Phần đỉnh của nước sẽ sử dụng các hạt nhỏ hơn để tạo thành các gợn sóng của bề mặt và sóng, nước gần nhất người chơi sẽ sử dụng các hạt nhỏ nhất để mô phỏng các vệt bắn và nhấp nhô nhỏ, trong khi nước càng sâu hay sâu thì các hạt càng lớn . Điều này sẽ cho phép một số lượng lớn các hạt mô phỏng nước ở mọi kích cỡ, động lực học của nước khi nó thay đổi, và một số mức hiệu suất hợp lý và được kiểm soát.

Tôi có thể thấy các vấn đề với việc triển khai này, nhưng nó chắc chắn là một giải pháp tương đối đơn giản và "đủ tốt" mà người xem / người chơi sẽ nghi ngờ khi nhận thấy sự sai lệch trong mô phỏng.


2

Nếu bạn đang sử dụng địa hình dựa trên voxel, ngoài việc lưu trữ mật độ mặt đất trên mỗi voxel, bạn cũng có thể lưu trữ giá trị nước được kẹp giữa 01 - groundDensity. Vẽ nước sẽ đơn giản như chạy một khối hành quân vượt qua các giá trị nước. Mô phỏng nước sẽ khó khăn hơn một chút, nhưng tiền đề cơ bản là bạn muốn giải quyết hệ thống sao cho:

  1. Nước dưới bề mặt sẽ lấp đầy phần còn lại của voxel
  2. Nước cấp bề mặt phải có cùng mật độ groundDensity + waterDensity, như các nước láng giềng
  3. Nước có thể được chuyển sang bất kỳ voxel nào ngay lập tức và bên dưới nó, với điều kiện là tổng mật độ của neighbour nhỏ hơn tổng mật độ của nó

Thuật toán lý tưởng sẽ chạy trong một shader tính toán, một đường dẫn thực thi cho mỗi voxel. Nếu bạn muốn trở nên lạ mắt, bạn cũng có thể lưu trữ vận tốc của nước trong voxel đó để có thêm hiệu ứng mô phỏng: ví dụ: cố gắng phân phối một lượng nước tỷ lệ thuận với vận tốc đến các ô "được chỉ" bởi vectơ vận tốc. Dữ liệu vận tốc này cũng có thể được sử dụng để di chuyển sóng, vẽ ghềnh, v.v.


Thật không may, tôi không có địa hình voxel, như được chỉ ra trong các ý kiến ​​dưới câu hỏi. Dù sao cũng cảm ơn bạn.
danijar
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.