MY BLOG DIRECTORY:

YivanLee:专题概述及目录?

zhuanlan.zhihu.com图标

INTRODUCTION:

上一节介绍了物理模拟的最基本思路:

(1)描述一堆动力学粒子

(2)用动力学粒子和各种约束构建动力学网格

(3)用这个动力学网格构动态模型网格

(4)把动态模型网格塞给渲染管线渲染即可

在我以前的文章中其实还介绍了,可以用动力学网格驱动骨骼模型,即把第三和第四步替换成驱动骨骼模型,这样就可以模拟形状复杂的物体了。具体步骤如下:

(1)描述一堆动力学粒子

(2)用动力学粒子和各种约束构建动力学网格

(3)用动力学网格驱动骨骼模型

我们驱动了骨骼模型之后的事情就交给引擎的管线了。


MAIN CONTENT:

这一节我们是做软体,和之前的思路一样是构造动力学网格。只不过这里需要对距离约束进行修改:

void FDistanceConstraint::SolveDistanceConstraint()
{
if ((ParticleA != nullptr && ParticleB != nullptr)
&&(ParticleA->PinCons.bFree || ParticleB->PinCons.bFree)
)
{
// Find current vector between particles
FVector Delta = ParticleB->CurPos - ParticleA->CurPos;
//
float CurrentDistance = Delta.Size();
float ErrorFactor = (CurrentDistance - DistanceLength) / CurrentDistance;

// Only move free particles to satisfy constraints
if (ParticleA->PinCons.bFree && ParticleB->PinCons.bFree)
{
ParticleA->CurPos += ErrorFactor * 0.5f * Delta * SoftStrenth;
ParticleB->CurPos -= ErrorFactor * 0.5f * Delta * SoftStrenth;
}
else if (ParticleA->PinCons.bFree)
{
ParticleA->CurPos += ErrorFactor * Delta * SoftStrenth;
}
else if (ParticleB->PinCons.bFree)
{
ParticleB->CurPos -= ErrorFactor * Delta * SoftStrenth;
}
}
}

我加入了SoftStrenth这个物理项

在构造距离约束的时候,这个值只要足够小就可以让两个粒子间的作用力不那么强,作用力弱了那么这个物体就软了。

视频封面

00:07

有了软约束,后面的事情就简单了。构建出一个动力学网格,完全就是体力活了。构造完动力学网格然后根据网格拓扑模型,可以得到如下效果:

为了方便看清楚里面的Constraint,上面的效果展示中我只拓扑了Box的一部分三角形。至此我们成功实现了软体模拟的第一步!可以看到这种方式缺点非常明显,那就是一个粒子对应一个模型,如果我想模拟一个1W面的软体,计算量将非常巨大。所以下面我使用粒子驱动骨骼的方式来做软体。

先在三维软体里做个cube,然后再开点细分,然后再蒙皮一下,保持一个根骨然后其余八个子骨骼作为粒子驱动的骨骼。

骨骼的权重分布根据受力的衰减分布来刷即可。具体的蒙皮和骨架约束操作我就不讲了,太简单是个美术都应该会。

不得不说Binding这个事情的确恶心,Max的"辣鸡"蒙皮工具面板十多年没变过,max09和max2018几乎一样,不知道Autodesk是怎么做到的(无力吐槽)。

最后把particlenet的粒子位置数据塞给骨骼即可,关于怎么把数据塞给骨骼可以看我之前的文章:YivanLee:虚幻4渲染编程(动画篇)【第六卷:自定义动画节点】

上面那个效果之所以模型看起来有点变形有凹凸是因为蒙皮权重还是有点瑕疵。


SUMMARY AND OUTLOOK:

这种方法的缺点就在于对蒙皮的要求会比较高,Skin的权重分布必须要按照力的衰减分布来刷。顺便说一下我这个方案适合全平台,因为我只是对骨骼的位置进行了计算,没有任何骚操作,而且计算量也很小。

Enjoy it!


NEXT:

YivanLee:虚幻4渲染编程(物理模拟篇)【第三卷:Fluid Particle Emitter】


推荐阅读:
相关文章