首页 > 其他分享 >UE4弹簧草及扩展

UE4弹簧草及扩展

时间:2024-12-12 11:46:33浏览次数:5  
标签:RT Volecity 弹簧 草及 Offset UE4 材质 振子

【USparkle专栏】如果你深怀绝技,爱“搞点研究”,乐于分享也博采众长,我们期待你的加入,让智慧的火花碰撞交织,让知识的传递生生不息!


如果草交互想实现回弹效果,就不能纯靠材质,而要有办法记录历史状态。

找了一圈,发现下面这种在RT上做物理迭代的方案最便捷:【UE5 模拟交互篇】(五)物理场方式实现植被交互

本文复现此法,并做一些简单扩展。

一、弹簧草

基本思路与参考文章相同,只记录一下差异点及注意事项。

1.参考文章中算了多层弹簧,我只算了一层。即将草的尖端看作一层水平弹簧振子。另外参考文章中并没有将弹簧振子锁定在水平平面上,我这里是为了简单而且省通道,直接看作水平弹簧振子。

2.用Offset代替POS。

同参考文章一样,用到posRT和volRT两个RT,前者存位置,后者存速度。但我posRT里存的不是Position,而是Offset,就是此纹素代表的弹簧振子偏离平衡位置的Offset,这样数值范围更小,精度更高,而且方便Debug。

3.Offset和Volecity编码。

我是将Offset分解成offsetDir和offsetLen,然后再将offsetDir乘以0.5+0.5,这样,就全都变成了正值,再写入RT的。从RT采出来则需要进行解码再用。由于我简化为水平弹簧振子,所以offsetDir是二维的,再加上offsetLen,占三个通道。Volecity同理。

当然,如果用RT存负值,就用不着编解码了,也无需将Dir和Len分开存。

关于UE中RT如何存负值,搜到下面帖子(我还没试):

 

 

 

 

4.在DrawMaterialToRenderTarget材质中通过UV和预设的Box框范围来计算WorldPosition,然后用WorldPosition与传进来的playerPos计算距离,决定哪里下压。

5.分为stampPos、stampVol、updatePos和updateVol四个过程。

  • stampPos是将最新的压草偏移量覆盖到原RT上。
  • stampVol是将覆盖了最新压草偏移量的地方的Volecity清零,避免压草处速度持续积累失控。

6.deltaTime限制最大值,比如deltaTime=min(0.02,deltaTime),这样可以避免卡的时候因deltaTime过大而使速度增量过大。

7.在草的Shader里采样posRT,根据采到的Offset计算Bend。

视频

 

二、扩展1:弹簧草+Billboard

如果想表达海葵之类的管状生物,且不想用管状模型嫌面数太高,可以用Billboard来实现不管从哪个角度看,都保持恒定的宽度。

在草/海葵材质中,WPO计算如下:

 

视频 

 

三、扩展2:弹簧香菇

回想上面弹簧草的实现思路,是将平面上每个点看成一个弹簧振子,在RT上去迭代。

那么,如果把模型上每个点看成一个弹簧振子,RT上每个像素对应模型表面一点,对RT进行迭代,岂不是就能实现类似软体的效果了。

这里说“类似”,是因为相比于“正确”的软体实现方法——质点弹簧系统而言,它少了质点之间的相互影响,而只是各质点独立的振荡。这是一个非常大的简化,所以效果上一定会打折扣,但从发散思维角度讲,感觉又是一个不错的联想,所以尝试了一下。

主要问题是如何在DrawMaterialToRenderTarget过程中拿到WorldPosition(因为Blit时材质不是应用在模型上,所以无法在材质中直接拿到模型的WorldPosition)。解决办法是将WorldPosition预烘焙到贴图上,然后在DrawMaterialToRendeTarget的材质中采样此贴图。这个思路跟顽皮狗的车辆战损效果类似:

 


https://youtu.be/aZJQuHZQakQ?t=2153

 

只不过,战损效果是把铁皮撞凹陷以后就固定住了,而我们要回弹。

另外前面弹簧草是简化为只在xy平面运动的水平弹簧振子,所以存Offset只需三通道(offsetDir.x,offsetDir.y和offsetLen),Volecity同理。但弹簧香菇表面的振子就不能再看成二维的,而需要是三维的,Offset和Volecity都需要用四通道来存(假设不用RT存负值)。

如何写入RT的a通道,参考:Draw Material To Render Target impossible to control alpha - always fully transparent

即Blit材质Blend Mode选Masked,Shading Model选Unlit,则emissiveColor引脚输出RGB,OpacityMask引脚输出Alpha。另外还需要:勾选Used with Editor Compositing,OpacityMaskClipValue设置为-0.01。

其余就和弹簧草实现一样了。

最终效果

 


这是侑虎科技第1731篇文章,感谢作者杨超wantnon供稿。欢迎转发分享,未经作者授权请勿转载。如果您有任何独到的见解或者发现也欢迎联系我们,一起探讨。(QQ群:793972859)

作者主页:https://www.zhihu.com/people/wantnon

再次感谢杨超wantnon的分享,如果您有任何独到的见解或者发现也欢迎联系我们,一起探讨。(QQ群:793972859)

标签:RT,Volecity,弹簧,草及,Offset,UE4,材质,振子
From: https://www.cnblogs.com/uwatech/p/18602100

相关文章

  • UE4云渲染多机输出,效率惊人!
    在当今的游戏开发和实时3D可视化领域,虚幻引擎(UnrealEngine,简称UE)以其强大的功能和灵活性而广受欢迎。随着云计算技术的飞速发展,云渲染作为一种新兴的服务模式,为UE开发者提供了更多的可能性。核心优势:高性能与低延迟UE4云渲染技术的核心优势在于其能够提供高性能的渲染......
  • UE4.26 Emissive Decal(发光贴花)模拟Light Function
    【USparkle专栏】如果你深怀绝技,爱“搞点研究”,乐于分享也博采众长,我们期待你的加入,让智慧的火花碰撞交织,让知识的传递生生不息!主要是想用EmissiveDecal(发光贴花)来模拟出SpotLight的LightFunction效果。原因是SpotLight的LightFunction依赖于阴影,而SpotLight开阴影比较费,且U......
  • 层式弹簧发展趋势与挑战分析-聚亿信息咨询
    【出版机构】:聚亿信息咨询 (广东) 有限公司聚亿信息咨询(Market Monitor Global)调研机构最新发布了【层式弹簧市场调研报告,全球行业规模展望2024-2030】。本市场调研报告为读者提供专业且深入的产品销量、收入、价格、增长率、市场占有规模及竞争对手等数据分析,包含分析过去5......
  • ANSYS实用功能详解(一)——弱弹簧
    我们在做静力学分析时,有时会遇到这种情况:一个结构,在对其进行受力分析时,它是平衡的,但在ANSYS中计算的时候,软件会报错,求不出结果来。比如下图所示一根杆,两端受到等值反向共线的力F作用,根据二力平衡公理,这根杆是平衡的。下面,我们使用ANSYS计算一下这个结构。Step1:建立模型。在......
  • UE4 CharacterMovementComponent
    之前在学习网络通信时,经常需要对客户端上的行为进行预测,来降低延迟带来的比较差的体验。而UE4为角色移动提供了CharacterMovementComponent这个组件,其在移动时可以发现已经实现了客户端预测。现在可以通过对CharacterMovementComponent进行扩展,实现我们自定义的运动模式,并且还能......
  • UE5学习笔记3-关于charactor的相机和弹簧臂组件
    一、环境说明,UE5.4+ vs2022 +win11二、相机和弹簧臂的作用    个人理解上,相机的作用相当于一个视角,我将其理解成是一个人在哪个地方朝向哪个方向看,弹簧臂的用用我将其理解成为一个将人的视角和人物模型或其他模型连接的桥梁三、相机和弹簧臂的代码    ......
  • [UnrealCircle]腾讯 罗谦 | UnLua-UE4下的Lua脚本插件
    传送门:[UnrealCircle]腾讯罗谦|UnLua-UE4下的Lua脚本插件_哔哩哔哩_bilibili参考PPT:UnrealCircle921北京PPT_免费高速下载|百度网盘-分享无限制一.UnLua基础1.1概念UnLua是一个脚本插件UnLua不是蓝图的替代,而是一种补充没有Asset预览不支持nativization......
  • UE4 Dash功能实现
    主要实现主要是两点一个是Dash的实现效果,一种是直接Dash到目的地,第二种则是在Dash过程中实现动画的播放显示第二点则是障碍物的检测,对Dash的一个阻挡效果的实现Dash实现效果为了实现Dash过程中的动画显示,可以利用时间轴组件实现Location的移动,从而避免直接对角色的Location的......
  • UE4 C++ 多人游戏中的简单聊天窗口
    本质不管是客户端还是服务器在输入文字后,按下回车发送,将触发RPC调用。然后通过RPC将发送者,输入文本等信息,传入到服务器,然后通过多播RPC传播到所有客户端的聊天框。UIUI利用三个组件ScrollBox用于在服务器以及每个客户端上显示消息的载体TextBlock本地将信息通过一个一个的T......
  • 关于MP4文件在ue4中导出的方式
    关于ue中使用播放器播放影片,在打包后,发现无法播放的解决办法:在打包设置中引入以下设置,当然GPROGame.mp4 在/game/gprogames/GPROgames.mp4,这里只用复制名称 打包后会有这个目录: 当然此时在播放的时候是正常的我们直接用 我们也可以做如下设置:这个时候打包会有这个......