1

我的问题简单来说是这样的:详细来说,沿着人物表面流的血是怎么做的?它从 0:34 开始在此视频中显示。

好的,现在关于我所调查的内容的更多细节(我已经尝试实现这种效果几个星期了,但没有成功):我尝试了一种蛮力方法,我得到了三角形(字符网格三角形) 与平面相交并计算每个三角形的线方程以绘制一条线(用于斜线)。然而,为了从表面上滴下来,我尝试创建一个三角形映射,该映射包含三角形的索引,这些三角形通过边缘连接到每个三角形。然后我沿着重力方向沿着每个三角形的表面做了线。这需要大量的处理器能力,并且通常会产生不良影响。当试图增加滴水的厚度时,它会产生很多额外的问题,因此根本不起作用。

我研究了八叉树纹理及其在模拟流过表面的液体中的用途,但是我不确定如何实现这一点,据我所知,这不适用于重力。

我目前正在研究 Cg 着色器,并认为这就是解决方案所在。我发现同一团队(Wolfire)的另一个视频暗示使用着色器来制作此处显示的血液效果。我一直在寻找着色器示例,这些示例可能会给我一个线索来了解它是如何完成的,但到目前为止我还没有运气。

我正在使用语言 C# 和 Cg 进行着色器。如果有人想提供任何代码来帮助解释等,那么任何语言都可以,我会尝试转换:-)

感谢任何帮助我的人,因为就像我在这篇文章前面所说的那样,我花了相当多的时间试图解决这个问题,但我的大脑开始受伤了。

4

2 回答 2

1

这更像是一种着色器技巧,而不是平滑粒子流体动力学等动态流体。

首先,上面的视频是由一位非常优秀的图形程序员 (IMO) 创建的。请注意,获得相同或相似的效果并非易事。

他说他存储了一个独特的“血液纹理”,它存储了每个纹素的血液量。

添加伤害时,您会增加伤口位置的血量(到血图)。

给定几个标准,每一帧都会更新血图:

  • 对于每个纹素 - > 如果上面的纹素中有很多血...增加当前纹素的血量。

  • 您需要通过检查着色器中的世界坐标来确定“上方”是什么

  • 如果要匹配视频,还必须检查垂直间隙。滴水。

  • 将所有纹素的总血量减少到一定的最小值(以使系统随着时间的推移而减慢)

当滴血碰到“水平表面”时会发生什么?看起来他在水平表面上添加了一个贴花,每次“滴”都会增加。

祝你好运

编辑:这是我刚刚制作的滑动血液的糟糕(1 小时开发时间)示例......它在 GLSL 中......你需要一个像样的显卡和一个兼容 webGL 的浏览器才能查看它。 http://glsl.heroku.com/e#6237.48

于 2013-01-24T00:15:00.020 回答
0

这太晚了,但我会把它留给后代。Wolfire 血液飞溅效果似乎是 nVidia Gravity Maps 样本的(非常)升级版。样本可以在这里找到:

http://developer.download.nvidia.com/SDK/9.5/Samples/samples.html#HLSL_BloodShader

这里还有 GDC 演示文稿中的幻灯片:

ftp://download.nvidia.com/developer/presentations/GDC_2004/gdc2004_BloodShader.pdf

于 2015-09-16T20:24:22.737 回答