n73手电筒刚体物理系统是Blender动画制作常用工具之一,主要应用场景就是物体碰撞,这涉及到重力、限定空间和粒子碰撞三个概念,而在当下的“版本之子”几何节点里已经有模拟节点可以使用了,那么能不能在几何节点里复现刚体物理效果呢?带着这个脑洞,我们一起来研究一下吧。
几何节点物理模拟的设计逻辑,和“静态”物体设计逻辑有一定的区别,这是需要大家主动适应的,可以当作一个全新的功能来进行重新学习。首先,我们要做一个顶点组,包含数个放置在不同位置的顶点,新建“点”,数量可以选择为多个,比如5个,这个节点比较特殊的地方在于如果想要让点分布在不同位置,不能像以前那样在后面接“设置位置”和“噪波纹理”,这只会让所有顶点都按照相同的位置去偏移。正确的设置方法是在“点”的“位置”前,接一个矢量“随机值”,因为我们是做一个沿着Y轴向下滑落的物理模拟效果,所以Z记得设置为0,X和Y的最大值最小值大家自行选择即可,但建议都不要太大。
接下来就是导入模拟节点,也就是“Simulation Zone”,有输入和输出两个节点,并自带线框,在线框之内,也就是输入输出节点之间的所有功能节点,都会被计算为数值模拟。那么怎样让顶点沿Y轴移动起来呢?
我们需要先定义一个新的矢量属性,可以命名为v,这就是我们的加速度属性,将它连接到“设置位置”的“偏移量”,因为这时候它并没有赋值,所以默认是0/0/0,所以此时播放动画不会有任何变化,但我们只需要在模拟节点区域外给它做一个矢量减法,沿Y轴减0.01,再回到模拟节点区域内,重新“存储已命名属性”,记得设置为“矢量”并正确输入名称v,这时候再输出,并从顶视角俯视播放视频,你就会发现它沿着Y轴向下跑了,具体设置可以参考图1。
如果只是让它往下跑,显然还不是我们想要的结果,我们想要把物理模拟运动范围控制在一个圆圈内,所以接下来要做的就是在“存储已命名属性”之前,重新连接一个“设置位置”,然后定义它的运动范围,这就需要确定两个重要参数,首先是检查顶点位置是否移动到了圆圈外部,如果是,就要强制把这些顶点放回圆圈上。
有了这个逻辑顺序,我们就只需要做好节点设计即可,因为一切都是以“位置”为起点,所以用它来连接矢量计算的“长度(Length)”,选择大于1的所有点,这些点就是已经移动到单位1之外区域的顶点,作为“设置位置”的选中项。
然后重新用位置信息,连接一个“归一化(Normalize)”,这个参数就是定义“圆圈”的关键,默认值为1,如果想要让圆圈大一点,就连接矢量计算的缩放来进行控制。将其连接到“设置位置”的“位置”,就能实现咱们想要的范围限制效果啦,具体设计可以参考图2。
上一步完成后我们发现,虽然顶点运作起来了,但却少了一丝真实感,没错,就是没有惯性。因为是掉落到圆圈上,所以应该会有一种左右摆荡的效果,那么怎样才能人为地制造出惯性呢?
逻辑上也不难,就是重新给v下定义,这就要注意模拟节点的特殊性了,加速度的属性,也就是咱们一开始定义v并沿Y轴减去一个数值的定义,必须要放在整个模拟节点区域的最后才能生效,而想要获取惯性,就需要在定义之前重新赋值,方法也比较特殊,就是用它原始的位置,减去不断变化位置,从而获得加速度,这就意味着我们必须要在节点的一开始就“捕捉属性”,然后通过矢量计算的减法得到数值并“存储已命名属性”v,听上去可能有些不太直观,但模拟节点目前就是这样,大家记住即可,具体设置参考图3,完成后播放视频,你就会看到顶点滑过最底端后又跟随惯性往上跑一段,然后反复摆荡直至停歇的效果了,调整Y轴的被减数就能控制摆荡幅度。
顶点虽然实现了摆荡,但还有一个非常重要的问题没有解决,那就是顶点之间无法形成碰撞,只是各自运动而已,所以为了实现碰撞效果,我们还需要进一步的设计。
顶点的碰撞,从数学上来说就是当两个球体球心之间的距离等于两者半径之和时,就停止运动或反方向弹开,因此我们需要找到的数据就是顶点之间的距离以及顶点的半径,有了这两个数值我们就能进行计算了。
首先,使用“最近的编号(Index of Nearest)”和“位置”,连接“在编号处评估”,这个节点组合的意思就是对每个顶点,取其最近顶点的位置信息,然后两者矢量相减,就能得到一个方向值。此时接矢量计算的“长度”就能得到两个顶点之间的距离。因为我们最开始的“点”节点就定义了半径,所以这时候可以直接使用“半径”节点直接乘以2(因为所有点的半径都是一致的),就能得到两个顶点碰到一起时的距离值,就是当它们碰到一起时所需要反向位移的偏移量,这里可以接一个除法来控制碰撞后的反弹强度,那么这个偏移量怎么使用呢?
回到两个顶点相减得到的方向信息,重新连接一个“归一化”,再连接矢量计算的缩放,缩放的值,就是偏移量的值。
接下来,在模拟节点区域内再新建一个“设置位置”,把缩放输出连接到“偏移量”,此时播放视频,你会发现顶点在一定程度上会乱窜,这是因为当顶点没有碰撞时也会受偏移量的影响,所以还需要手动定义哪些顶点参与碰撞偏移,这时候就很简单了,我们不是已经知道顶点之间的距离,也知道顶点半径之和了么,当顶点之间的距离比半径之和更小时,再启动偏移量就能解决这个问题,最终设计参考图4,这时候再播放视频,就会发现所有顶点都按照正确的碰撞体系开始工作了。
最后就是使用“实例化于点上”等节点,将顶点变成渲染模式可以看到的物体,注意,物体最好是球型,因为咱们的顶点就是球型,半径设置也必须保持一致,否则就会穿模。配合材质和布光,最终效果如图6所示,金属球会在透明球内进行符合限制条件的刚体物理碰撞运动。
这次的几何节点设计从难度来说比以前要高很多,因为模拟节点的很多实现方法比较反常识,而且从实用角度来说,它也有一定的限制,比如它的碰撞只能基于圆形,不像刚体物理模拟可以直接调用网格信息,而且无法定义碰撞边缘,都是以中心点为判断依据,所以在使用时更多需要我们自己准确地找到碰撞边缘,比如在球体内碰撞时,就要适当设置球体半径以符合需求,并且无法让球体尺寸随机大小,因为这样会导致穿模。但无论如何,这是一次很好的头脑风暴,也能大大加深大家对几何节点模拟功能的印象,依然值得学习。
壹零社:用图文、视频记录科技互联网新鲜事、电商生活、云计算、ICT领域、消费电子,商业故事。《中国知网》每周全文收录;中国科技报刊100强;2021年微博百万粉丝俱乐部成员;2022年抖音优质科技内容创作者
|