Làm thế nào để hoạt hình trừu tượng 2d từ trên xuống dưới kết cấu nước?


24

Tôi hiện đang thực hiện một trò chơi với góc nhìn từ trên xuống của đại dương. Tôi sử dụng như sau, một kết cấu trừu tượng nhỏ:nhập mô tả hình ảnh ở đây

Kết cấu thực tế là trong suốt, tôi đã thêm màu xanh lục cho rõ ràng.

Vấn đề bây giờ tôi gặp phải là, tôi không biết cách làm sống động kết cấu này để nước trông đẹp. Tôi đã cố gắng di chuyển kết cấu với một làn sóng tội lỗi : texture.y += sin(angle). Tất nhiên bây giờ toàn bộ kết cấu đang di chuyển trông có vẻ không thực tế. Điều tiếp theo tôi đã thử là thêm một lớp khác và thực hiện hiệu ứng thị sai. Vì vậy, những phản xạ dưới mặt nước cũng sẽ di chuyển, nhưng chậm hơn nhiều. Nó trông tốt hơn một chút nhưng vẫn không ... đủ đẹp.

Tôi nghĩ rằng hình ảnh động đẹp nhất sẽ là, nếu các ô riêng lẻ sẽ mở rộng và co lại, giống như một trang web hoặc một mảnh vải. Hãy tưởng tượng nếu ai đó kéo nhẹ ở một đỉnh của các ô này và ô lân cận sẽ mở rộng và ô tôi kéo về (hoặc đẩy tới) sẽ co lại. Kiểu như một mạng lưới lò xo (?). Nhưng tôi không biết làm thế nào để thực hiện một cái gì đó như thế này:

  • Mô hình toán học cho cái này là gì? Một cái gì đó với lò xo, nơi lực đẩy / kéo?
  • Và nếu vậy, làm thế nào để tôi ánh xạ mô hình này với kết cấu đã cho? Giữ tất cả các đường cong và những gì không ...

(Tôi cũng mở ra cho những ý tưởng / câu trả lời khác nhau về cách làm động các kết cấu đã cho. Chủ nghĩa hiện thực không phải là vấn đề ở đây, chỉ là một số nước trông đẹp như chuyển động ...)

Giải pháp từ DMGregory

Tôi đã đăng một ví dụ libgdx trong bài đăng này: Hoạt hình nước 2d bị lởm chởm và không mượt mà (xem câu trả lời về lọc kết cấu)

Câu trả lời:


41

Một cách phổ biến được thực hiện là sử dụng tra cứu kết cấu gián tiếp trong trình đổ bóng để làm biến dạng kết cấu hiển thị:

Hoạt hình gif hiển thị hoạt hình nước

Ở đây tôi đang sử dụng một kết cấu với một số nhiễu màu tần số thấp (xếp các đốm màu mịn của các màu ngẫu nhiên) và cuộn nó qua hình dạng hiển thị theo thời gian.

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

Thay vì vẽ các màu từ kết cấu này, thay vào đó tôi lấy các kênh màu đỏ và màu xanh lá cây và trừ đi 0.5fđể biến chúng thành một vectơ 2D giả ngẫu nhiên thay đổi trơn tru theo thời gian và không gian.

Sau đó tôi có thể thêm một bội nhỏ của vectơ này vào tọa độ UV của mình, trước khi lấy mẫu từ kết cấu nước chính. Điều này làm thay đổi một phần của kết cấu mà chúng ta đang đọc và hiển thị, làm cong nó xung quanh.

Bằng cách lấy trung bình hai mẫu từ tiếng ồn này, cuộn theo các hướng ngược nhau, chúng ta có thể ẩn hướng chuyển động để nó trông giống như trượt vô chủ.

Trong Unity, shader sẽ trông như thế này - nó đủ đơn giản để dịch sang ngôn ngữ shader mà bạn chọn:

fixed4 frag (v2f i) : SV_Target
{               
    float2 waveUV = i.uv * _NoiseScale;
    float2 travel = _NoiseScrollVelocity * _Time.x;

    float2 uv = i.uv;
    uv += _Distortion * (tex2D(_Noise, waveUV + travel).rg - 0.5f);
    waveUV += 0.2f; // Force an offset between the two samples.
    uv += _Distortion * (tex2D(_Noise, waveUV - travel).rg - 0.5f);

    // Sample the main texture from the distorted UV coordinates.
    fixed4 col = tex2D(_MainTex, uv);

    return col;
}

1
Điều này trông thực sự tốt đẹp. Tôi không chắc mình hiểu tất cả các thuộc tính: _NoseScale = vô hướng để nhân rộng "bản đồ nhiễu". _NatyScrollVelocity = Vector2 với tốc độ chúng ta di chuyển trên bản đồ tiếng ồn. _Nùa = ?. _Distortion = Vô hướng tôi chọn làm yếu tố biến dạng? v2f = Vertex chúng tôi xác định màu sắc. tôi =?
morpheus05

_Noiselà [một bộ lấy mẫu kết cấu đọc từ] kết cấu ngẫu nhiên blobby nhỏ ở trên. v2f ilà dữ liệu được nội suy từ trình tạo bóng đỉnh - chúng tôi chủ yếu sử dụng dữ liệu đó để lấy tọa độ kết cấu cho pixel mà chúng tôi đang vẽ i.uv. Và bạn chính xác về tất cả phần còn lại.
DMGregory

Tôi đã triển khai trình đổ bóng và bằng cách nào đó nó không hoạt động (nó không di chuyển hoặc biến dạng là lớn), tôi cho rằng tôi đã không đặt đúng các giá trị. thời gian = sự khác biệt từ khung cuối cùng trong ms. noise_scale = 1 (Tôi sử dụng kết cấu của bạn, lặp lại chế độ quấn) noise_scroll_velocity = [0,01, 0,01] méo = 0,02
morpheus05

Lưu ý rằng biến được gọi là Thời gian, không phải DeltaTime. Nếu bạn sử dụng chênh lệch về thời gian và tốc độ khung hình của bạn là nhất quán, thì bạn sẽ luôn nhận được cùng một số và bạn sẽ chạy lại trình đổ bóng với cùng một đầu vào, nhận cùng một đầu ra (không có gì di chuyển). Tồi tệ hơn, nếu tốc độ khung hình của bạn không nhất quán thì bạn sẽ bị rung trở lại. Bạn muốn tổng thời gian trôi qua, không phải thời gian delta.
DMGregory

Ngay sau khi tôi nhấn gửi tôi đã nhận ra điều đó và bây giờ nó gần như hoạt động. Hình ảnh động dường như tạo ra các sóng từ góc dưới bên phải và sau đó, khoảng 10 giây, nó chỉ mờ dần, giống như sóng dừng lại. Điều gì có thể là lý do cho điều này?
morpheus05

6

Đây được gọi là hiệu ứng ăn da và việc tạo ra các hiệu ứng này trong thời gian chạy khá tốn thời gian, do đó, điều này thường được thực hiện với hoạt ảnh theo từng khung hình được kết xuất trước. Có những công cụ sẽ tạo ra khung hoạt hình caustic cho bạn, chẳng hạn như Caustics Generator , có phiên bản miễn phí cho mục đích phi thương mại. Ngoài ra còn có một số cái được làm sẵn mà bạn có thể mua với giá rẻ hơn đáng kể so với phiên bản pro của công cụ tôi đã đề cập.

Lưu ý rằng hiệu ứng ăn da cũng thường là một hiệu ứng được áp dụng như một cookie nhẹ trên địa hình dưới nước hoặc trên bề mặt dưới nước. Đó là, đặt nó trên bề mặt nước trong khi nhìn xuống nó thường không giống như nước.


Điều đó rất thú vị, tôi cũng sẽ xem xét trình tạo này (mặc dù vậy, tôi sẽ thử biến thể shader nếu tôi hiểu nó ...)
morpheus05

4

Đây trông giống như một kết cấu bạn có thể tạo từ biểu đồ voronoi, ví dụ:

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

Bạn có thể thực hiện các điều chỉnh nhỏ, trơn tru cho biểu đồ bằng cách di chuyển các điểm; vẽ lại biểu đồ mỗi khung hình sẽ khá tốn kém, vì vậy bạn có thể muốn kết xuất lại hoạt hình.


4
Tôi thực sự đã đưa ra tụ quang theo cách này trong một shader trong quá khứ. Nó không nhất thiết phải đắt như bạn nghĩ ( đây là một ví dụ biểu hiện Voronoi cạnh thời gian thực trong trình tạo bóng WebGL ), mặc dù việc có được hình dạng mịn đúng trên các cạnh - chứ không phải là đa giác nhọn - có thể là thách thức.
DMGregory

Ôi, thật tuyệt vời; Tôi đã có một số máy phát điện địa hình rất tiện dụng.
FacticiusVir

0

Có một phương pháp oldschool, bao gồm một lớp kết cấu dưới cùng, và hai nửa kết cấu trong suốt để phản chiếu trên đầu.

Nếu bạn muốn đi tất cả các con đường và muốn nước trông không đầy sóng vô tính hoặc súp màu xanh da trời là những mục tiêu phải đạt được.

https://steamcdn-a.akamaihd.net/apps/valve/2010/siggraph2010_vlachos_waterflow.pdf


3
Mặc dù các liên kết có thể giúp đỡ, họ không bao giờ đưa ra câu trả lời tốt. Bạn có thể mở rộng trên cả hai phương pháp luận án không? Làm thế nào để đi về thực hiện nó?
Vaillancourt

Phương pháp đầu tiên, về cơ bản là một phương pháp rất cũ được sử dụng để làm động nước - bạn lấy kết cấu nước lớp cơ sở có tọa độ UVW được chuyển sang hướng bạn chọn. Bây giờ bạn áp dụng thêm một bản đồ / bản đồ thông thường mà bạn chuyển sang hướng khác - nếu được thực hiện tốt, điều này có vẻ thuyết phục đối với các dòng sông nhỏ. Mặc dù rất hạn chế đối với các khối nước lớn - vì bất kỳ thứ gì mà sóng phát lại sẽ có hiệu ứng moire. Liên kết giải thích việc sử dụng sơ đồ khối tốt hơn nhiều so với tôi có thể.
Pica

Vui lòng sử dụng tính năng chỉnh sửa để cải thiện câu hỏi với những gì bạn đã thêm ở đây :) Mọi người được sử dụng để tìm kiếm câu trả lời trong bài đăng, không phải trong các nhận xét.
Vaillancourt
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.