我正在模拟水,并且试图可视化速度场。在此演示中,我不断在图像的中心添加水,蓝色的“雨滴”就是这里。
我有一个纹理,其中rg
是速度的X和Y方向,而ba
是水在其中通过的总运动量(即,每一步ba = ba + rg * delta_time
)。 / p>
我正在使用Unity Shader Graph。
我想沿速度方向旋转“波纹”纹理,然后也沿该方向平移。为了防止着色器在速度发生变化时跳动,我想到使用ba
通道(以前未使用过)来保持如上所述的总速度。
但是,旋转(仅基于速度)和平移(基于“总速度”)两者都可以很好地运行 。但是当我将它们加在一起时,看起来平移也在旋转。我不确定为什么会这样。
这就是我要做的:
第一部分::沿速度方向旋转我的水纹理,看起来还不错:
着色器本身看起来像这样:
因此,基本上,我将uv(右边的自定义函数)离散化,获得速度的角度(使用arctan2
),然后使用Rotate
块旋转每个离散块。这可以按预期工作。
第二部分:基于总速度(在ba
通道中)转换纹理,也可以按预期工作:
着色器本身看起来像这样:
同样,我使用离散的uv,现在我基于ba
通道转换每个块,其中包含速度的总和(每个时间步长ba = ba + rg * delta_time
)。如您所见,这显示出纹理从中心流出(不断添加水)。这就是我所期望的。
现在,当我组合它们时,出现了错误:
我用红色圈出的圆圈最能说明问题(尽管所有方块似乎都有一定程度,取决于它们旋转了多少)。箭头指向右下角,这似乎是正确的,但是现在流到了顶部。
着色器:
所以在这里,我将旋转的离散块添加到平移中。但是,即使我在旋转块的之后将它们加在一起,看起来平移部分现在也已经旋转了。因此,虽然旋转不旋转,但看起来却是。
为什么会这样?以及我该如何解决。
我希望我能充分解释它,因为要在图片和gif中显示并不容易。
谢谢!
答案 0 :(得分:0)
因此,我解决了问题,而不是将{strong> offset 的x
和y
存储在b
和a
渠道中,只需存储在b通道中移动的总距离即可(因此b += length(rg)
)。
然后我使用float2(0,b)`作为偏移量。
然后由于某种原因,它也会旋转,并且在视觉上可以按我的意愿工作。
但是,我仍然不太明白为什么,有时我想我明白了,然后我想了更多,而我不再。 因此,如果有人知道为什么会发生这种情况并且可以解释,那么我很乐意接受这个答案。 但是,目前已解决。