做水的人大概都有过这种时刻:镜头里浪花翻得挺猛,气泡一出来就露馅了——一颗颗大小一模一样,像有人往水里撒了把塑料珠。Alexander Vasilenko 显然也被这个问题折磨过,他干脆自己写了一个解算器,名字叫 Guided Bubbles & Wet Foam Solver,专门用来做 Houdini 里的白水模拟。
这个工具不是凭空冒出来的。它的底子是 Wētā 的一篇研究论文,标题叫《Guided Bubbles and Wet Foam for Realistic Whitewater Simulation》,研究的就是怎么让水里的气泡和泡沫看起来更像真的。Vasilenko 做的事,是把论文里的思路翻译成了能跑的解算器。
先说说它到底解决了什么
Houdini 用户对 POP Fluid 应该不陌生,它最大的一个短板就是不支持可变粒子半径。这意味着什么?意味着你想让气泡有大有小、有疏有密,基本没戏,只能接受一堆尺寸统一的粒子在水里飘。Vasilenko 的这套解算器就是冲着这个限制去的,把可变半径的支持补上了,设置模拟的时候创作空间一下子打开了。
论文里给出的核心思路是:把气泡当成水里离散的空气粒子来处理,等它们浮到水面之后,再转换成泡沫,单独做模拟。Vasilenko 的实现沿用了这个逻辑,水下气泡系统带一个局部重模拟的流体,并且对气泡施加双向耦合。
泡沫部分则是另一套做法。按他的说法,泡沫通过 SPH 模拟来处理,再投影到水面的二维流形上。解算器里实现了标准的 SPH 力,包括黏度、内聚力,以及水面对泡沫的表面摩擦力。
他和 Wētā 团队不一样的一个选择
有意思的地方在这里。Wētā 的研究是一套方案,Vasilenko 在实现的时候做了一个自己的判断:他认为内聚力用邻居粒子的体积乘数效果更好,而不是用活跃粒子自己的体积乘数。当然,两种方式他都放进了解算器里,用哪个由使用者自己决定。
他的理由是,用邻居粒子的数据能让泡沫结团得更自然。这个细节听起来很技术,但落到画面上就是泡沫是抱成团还是散成沙的区别。
泡沫怎么老老实实待在水面上?他用的办法是流形平流:把力分解成切向和法向两个分量,法向那一份直接丢掉,然后用牛顿迭代把粒子重新投影回水面。翻译成人话就是——泡沫被"按"在水面上,不会莫名其妙飘走。
为什么这事值得关注
白水模拟一直是特效里比较难啃的部分。浪、泡沫、气泡、水花,这几样东西物理行为不一样,硬凑在一起就容易出戏。Wētā 那篇论文的价值在于把气泡和泡沫拆开处理,各自用合适的方法模拟,而不是一锅炖。
Vasilenko 这套解算器的意义,是把这套研究思路从论文变成了 Houdini 里能直接用的工具。对做水的人来说,少了一层"从公式到节点"的翻译工作。
他本人也在 LinkedIn 上分享 Houdini 模拟相关的内容,想找更多类似的东西可以去那边翻。
顺着这条线还能看什么
如果你对 Wētā 在水模拟上的研究感兴趣,还有几个方向可以顺着往下挖:
- Moisè Asta 做的一个水波模拟
- Pavel Morozov 做的一个气泡解算器
- Fred Bello 做的一个河流模拟
这几个都是围绕同一套研究脉络展开的实践,放在一起看能大致摸清水模拟这个方向最近在往哪走。
说回 Vasilenko 这个工具本身,它最让人兴奋的点其实不是某个参数调得多妙,而是那种"论文读完直接动手做出来"的劲头。Wētā 的研究摆在那儿有段时间了,真正把它变成 Houdini 里能跑的东西,需要的不只是看懂公式,还得理解做特效的人在实际项目里卡在哪儿。可变粒子半径这个痛点,做水的人心里都有数,他显然是知道的。
至于效果到底能到什么程度,还得看实际项目里跑出来的画面。但至少从技术路线上看,气泡和泡沫分开处理、泡沫约束在水面流形上、内聚力用邻居体积乘数——这几步走得挺清楚。
热门跟贴