游戏《孢子》的思考 —— Metaball的逻辑,实现及对应思考

本文探讨了游戏《孢子》中Metaball(Blobby implicit surface)的逻辑、实现方式,特别是在UE4中的应用。Metaball是一种通过控制点产生等势面的模型,用于处理不可预测的蒙皮信息。文章讨论了线段控制图元可能导致的融合问题,以及优化计算性能的策略。《孢子》采用了一种特殊的4次多项式公式,以确保导数连续,避免光照不连续。最后,作者分享了在UE4中实现Metaball的方法,并提供了相关插件的链接。
摘要由CSDN通过智能技术生成

这篇博客介绍了Metaball对应的逻辑,以及我相关的思考。


背景

在游戏《孢子》中,由于游戏要处理的是完全不可预测的,由玩家决定的Skeleton Mesh,因此当玩家改动或增减了躯干时,需要实时重新生成对应的蒙皮信息。因此在《孢子》中使用了Blobby implicit surface(一般也被称为Metaball)来表示蒙皮信息。

Metaball的介绍

考虑场函数 D(r)=1r2 和在3D空间中的一系列控制点。其中 r 指的是三维空间中的某一个点到控制点的距离,而在场中对应的强度则可以认为是这一系列控制点所产生的场强度的总和。

那么这样一来,我们预先设定一个强度,并且绘制出三维空间中的等势面,这个等势面就是一个Metaball。

如下图,可以看出来针对于Metaball来说,当他们相互靠近时,对应的那些顶点会被彼此的控制点影响。

Image

当控制的图元不再是点,而是一条线段或者一个平面时,那么 r 通常取空间中的点到这条线段或者平面上的最短距离,例如下图就是不同场强度的Metaball。

Image

对于线段的控制图元来说,一个可能出现的问题在于交界处的融汇。如果只是简单粗暴实现,有可能导致在两根线段交汇处出现鼓起的情况,例如下图的最下面的情况:

Image

有些时候,这种鼓起来的状况并非开发者所期待的,开发者更期待的可能是两条线平滑融合……这种情况可以使用各种不同的Blending Function来解决。

Metaball的实现

Metaball在项目中的实现往往要考虑性能的开销。场函数往往是可以延伸到无限远处的地方,但这样会导致计算量的快速增长。

因此,可以考虑将在一段距离之后,将对应的场强直接设定为0。这样一来,就可以节省一些计算量了。

因此Metaball的公式可以设定为:

f(r)=
  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值