虚幻4渲染编程(物理模拟篇)【第二卷:Soft Body Simulation】
MY BLOG DIRECTORY:
YivanLee:专题概述及目录
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这个物理项