首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >介绍一种可交互的瀑布水的案例以及制作流程

介绍一种可交互的瀑布水的案例以及制作流程

作者头像
keyle
发布2024-11-01 12:19:45
发布2024-11-01 12:19:45
2170
举报
文章被收录于专栏:礼拜八不工作礼拜八不工作

本篇记录下可交互的瀑布水的案例制作流程。使用的工具为shader graph,制作内容包括流动的水与水流被障碍阻挡分流的逻辑,网上有类似的教程但是只有图没有原理,看本篇就对了该有的都有。

制作流动的水

通用控制UV技巧

控制UV位置变化的节点组合

通过time控制uv朝着Y移动

给水添加顶点动画

算法解析:

代码语言:javascript
复制
计算后的顶点高度 = 当前顶点位置 + Y轴高度(法线(normal) * 噪声随机数(float))

制作水流被阻挡效果

总的思路是做透明遮罩,先画个圆再画个垂直面上的透明遮罩两者拼接

相当于下面的伪代码:

代码语言:javascript
复制
saturate(lerp(TopdownMask,SphereMask,LerpMask))

这个lerpMask参数会判定给定的像素点在当前像素点的上方还是下方(0,1),如果在上方则使用SphereMask计算遮罩参数,反之使用TopdownMask的值,最后将这个值规范到0-1内(clamp截断超过的值)。

计算X轴的遮罩(垂直方向上的透明区)

这里用到distane函数,他会返回两点距离,这个距离永远是正的。所以这边的topdown_radius就是半径.

代码语言:javascript
复制
return distance(target.xz,self.xz) - 1
--将z引入是判定target距离当前plane面的距离

计算球体遮罩

代码语言:javascript
复制
return distance(target.xyz,self.xyz) - 1
--球体的判定有俩个纬度xy

计算差值

我们希望低于当前y轴的部分做矩形遮罩,高于的话做圆形遮罩 相当于下面的伪代码:

代码语言:javascript
复制
if([target].y - [self].y > 0)
    return 0
else
    return 1
--给定的像素点高于当前就返回0 否则返回1

完成

参考链接与资源

本篇资源已经上传github:https://github.com/KeyleXiao/waterfall_effect 参考youtube视频:https://www.youtube.com/watch?v=4X9ak_SjNwU

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-04-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 礼拜八不工作 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 制作流动的水
    • 通用控制UV技巧
    • 通过time控制uv朝着Y移动
    • 给水添加顶点动画
  • 制作水流被阻挡效果
    • 计算X轴的遮罩(垂直方向上的透明区)
    • 计算球体遮罩
    • 计算差值
  • 完成
  • 参考链接与资源
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档