unity3d 刷草地贴图为什么是竖着的 unity怎么添加草地效果_Max


前面两篇文章(草地的顶点动画实现风吹草动和Unity草地交互的实现)中介绍了在Unity中怎么实现草地的摆动和交互的效果,今天我们在UE4中来看下要怎么实现,实现的原来其实都差不多,所以就不在详细讲了,主要给大家看下具体的节点怎么连接。

首先我们通过WorldAlignedTexture这个节点来采样一张贴图,然后修改WorldPosition的偏移值来让贴图动起来,再通过采样的值来修改模型的顶点动画。


unity3d 刷草地贴图为什么是竖着的 unity怎么添加草地效果_ue4 怎么修改骨骼动画_02


WaveControl的R和G用来控制风浪的方向和速度,B用来控制强度,A用来控制采样的大小,值越小草摆动的越无序,反之值越大摆动的越整体。


unity3d 刷草地贴图为什么是竖着的 unity怎么添加草地效果_ue4 点击某一物体触发事件_03


接下来我们来做交互的部分,也是要通过Blueprint在运行的时候给材质球传递一个player的position值,通过这个值来计算草散开的方向。


unity3d 刷草地贴图为什么是竖着的 unity怎么添加草地效果_ue4 点击某一物体触发事件_04


“PlayerPos”这个节点是一个MaterialParameterCollection,需要手动先创建出来。在资源管理面板中右键选择“Materials&Textures”再找到“MaterialParameterCollection”点击就创建出来了。


unity3d 刷草地贴图为什么是竖着的 unity怎么添加草地效果_ue4 怎么修改骨骼动画_05


双击创建出来的MaterialParameterCollection,在参数面板里面添加一个VectorParameter,设置好参数的名字,后面在Blueprint中会要调用。


unity3d 刷草地贴图为什么是竖着的 unity怎么添加草地效果_世界坐标_06


打开Player的Blueprint,我们将位置信息传递给上面创建的这个参数值,这里我是用一个Sphere来代替的,如果是角色的话一般会分左右脚来分别设置。


unity3d 刷草地贴图为什么是竖着的 unity怎么添加草地效果_ue4 点击某一物体触发事件_07


好了,现在我们运行起来就可以看到交互的效果了。


unity3d 刷草地贴图为什么是竖着的 unity怎么添加草地效果_世界坐标_08


最后我们把风浪吹动的效果和交互的效果加起来就行了。完整的Material如下:


unity3d 刷草地贴图为什么是竖着的 unity怎么添加草地效果_ue4 点击某一物体触发事件_09


unity3d 刷草地贴图为什么是竖着的 unity怎么添加草地效果_ue4 怎么修改骨骼动画_10


这种实现方法是最简单的,但是有个不好的地方,就是强度过大的时候避免不了模型顶点的拉伸。


unity3d 刷草地贴图为什么是竖着的 unity怎么添加草地效果_ue4 怎么修改骨骼动画_11


所以为了更好的效果可以使用PivotPainter和Rotate About Axis,通过旋转模型的方式来实现,这样就可以避免顶点拉伸的问题。由于时间关系我没有去完整的测试过这个方案,所以先在这里记录一下思路,以后要是有合适的机会在回来完整的实现一遍。

这个方案主要是将每根草的顶点的旋转中心轴记录在第二和第三套UV里面,然后每个顶点通过这个中心轴来旋转实现摆动和交互。下面是PivotPainter_PerObjectFoliageData节点中PivotPosition的实现:


unity3d 刷草地贴图为什么是竖着的 unity怎么添加草地效果_世界坐标_12


好了现在我们的主要问题就是如何将每根草顶点的中心轴坐标写入到模型的第二和第三套UV里面。为什么要两套UV?很简单,UV只有x,y两个坐标,所以只能是坐标的xy写入到第二套UV里面,z坐标写入到第三套坐标里面。

其实官方已经为Max的用户提供了插件工具,可以直接通过插件烘焙就行了。打开UE4的帮助文档,快捷键是F1。在搜索栏里面直接搜索PivotPainter,就能找到了相关的资料了。


unity3d 刷草地贴图为什么是竖着的 unity怎么添加草地效果_ue4 怎么修改骨骼动画_13


Max的脚本其实也在本地,软件安装目录下“UE_xxxEngineExtras3dsMaxScriptsPivotPainter2.ms”,大家可以看下官方的资料介绍来使用这个工具。

既然官方提供了工具给Max的用户,那我们就来说下Maya的用户这么实现。

每根草顶点的中心点其实就是最底部的那个点的坐标,可以通过pointPosition命令获取到这个点的世界坐标,然后再通过polyEditUV命令将这个点的xy坐标写入到第二套UV里面,z写入到第三套UV里面。如果草的模型被合并了,可以先打散开来再通过for循环完成上面的操作,最后再把模型合并。

写入到UV里面之后,我们打开UV编辑器来看下。可能第一眼觉得什么都没有,还以为自己出错了。其实并不是,这里写入的都是世界坐标的位置,所以在默认的0-1的范围中是看不到有东西的,选择模型所有的UV点然后在编辑器中按F就可以看到这些写入点坐标了。


unity3d 刷草地贴图为什么是竖着的 unity怎么添加草地效果_ue4 点击某一物体触发事件_14


注意下,每根草上的那几个顶点的中心点位置是相同的,所以写入到UV坐标里面时位置也是一样的。也就是说,如下图选中点的UV在把中心点坐标写入到第二和第三套UV里面后,位置都是一样的。


unity3d 刷草地贴图为什么是竖着的 unity怎么添加草地效果_贴图_15


好了就先到这里吧,等有机会再来完整的实现下这套方案,脚本代码都是一些临时写的,也不能直接拿出来就用,所以还是不放上来了,等以后完善了一起放出来吧。