Vertex Animated Plant Cover

使用顶点动画制作随风飘动的植物

动机和想要实现的效果 最直接的动机是看了顽皮狗在Siggraph 2016上的PPT,里面介绍了顽皮狗在神秘海域中是如何让植被随风飘荡的。他们介绍了一种将植被的每一部分的pivot的物体空间坐标写到顶点色里,然后在shader中使用这个坐标进行风的效果的计算的方法。较为震撼在风吹过草原时,植被进行弯曲后,草表面的高光会有一种时空上的起伏感(也就是说神秘海域的植被的法线也会被风影响)。所以我也想要借助写pivot的方法来制作植被受到风吹的效果,通过这个方法计算出正确的风吹之后的植被的法线(同时由于法线贴图的存在,还要计算正确的切线)。 稍微翻了一下网上的资料(也没仔细地去搜索),大部分的就是一个普通的顶点动画,有的是用的sin,有的就直接平移。这就产生了第二个需求,植被在顶点动画中应该保持差不多的长度,不然会发现很明显的拉伸的效果。 当然最好还能投射出正常的影子了,这一步只需要把顶点着色器复制一份到投射影子的pass里就可以了。 这里使用的植被模型是MegaScans上的CORDYLINE模型中的var12这个小模型。 难点和相对应的应对方法 Unity的顶点色限制 稍微测试一下就能发现,Unity的顶点色是UNorm8的格式,也就是说无论你在Maya或是3ds Max里导出的模型的顶点色信息是什么样的,导入到Unity中就会变成只有256精度的UNorm8。顽皮狗使用的是自己的引擎,所以它们能够使用全精度的顶点色,但是由于Unity的引擎限制,我们可以考虑到导出pivot的顶点坐标到模型的UV中。 但是很不幸的是,fbx导入到Unity时,即使UV是float4的类型(也就是16bytes),在Unity中只会识别UV的前两位。所以只能无奈的将pivot的顶点坐标(float3的数据)储存到两个UV的三个通道里,同时将pivot的层级存到剩下的一个通道里。我不知道顽皮狗具体是怎么计算pivot的层级关系的,他在PPT中写的是无需计算,但我在实际操作中只能一层一层的算(而且只能算两层),也希望知道具体怎么操作的人告知一下方法。 所以接下来要做的是在Maya中把pivot的物体空间坐标和pivot的层级写到对应顶点的某两套UV中,本文是写到第二套和第三套UV中(也就是TEXCOORD1和TEXCOORD2)。于是我恶补了一下maya的python脚本的写法,不过在写数值到UV中时,又遇到了一个小问题。Maya的cmds.polyEditUV这个方法,明明能传入uvSetName这个参数,用于操作对应的UV,但我实际使用时只能写数值到当前的UV中,导致最后写的脚本只能僵硬的操作当前UV,每次切换UV时需要重新修改脚本再运行一次。 最终的脚本是这样的: VertexPivotWriteTool.py import maya.cmds as cmds targetVertexStr = "Select any vertex to start." vertexColorStr = "Select any vertex to start." pivotPosition = [0.0, 0.0, 0.0] def ui(): if cmds.window("VertexPivotWriteTool", exists = True): cmds.deleteUI("VertexPivotWriteTool") global targetVertexStr global targetVertexField global vertexColorStr global vertexColorField global pivotLayer vertexPivotWindow = cmds.window("VertexPivotWriteTool", widthHeight = [500, 400]) form = cmds.formLayout(numberOfDivisions = 100) pivotLayerLable = cmds.text("Pivot Layer (0 for root pivot)") pivotLayer = cmds....

January 6, 2022 · zznewclear13
zznewclear13 技术美术 图形学 个人博客 technical art computer graphics