Bullet 学习笔记之 Soft Body Physics Pipeline
在最近几个新的版本中,Bullet 物理引擎逐步加入并完善了软体形变的仿真。btSoftBody
类用于软体的模拟,仿真场景则通过 btSoftRigidDynamicsWorld
搭建。下面简单介绍一下 Soft Body Physics Pipeline 。
0、Overview
软体仿真的场景类 btSoftRigidDynamicsWorld
继承自 btDiscreteDynamicsWorld
,主要添加了存放软体对象的数组 m_softBodies
、软体对像的求解器 m_softBodySolver
类,并重载了函数 predictUnconstraintMotion
、 internalSingleStepSimulation
,添加了成员函数 solveSoftBodiesConstraints
、 rayTest
、 rayTestSingle
等。
在初始化阶段,新建了软体对象的求解器为 m_softBodySolver = new btDefaultSoftBodySolver()
。当向场景中添加刚体时,调用的是 btDiscreteDynamicsWorld::addRigidBody()
,向场景中添加软体时,一方面,向 btDiscreteDynamicsWorld
添加碰撞对象,同时将该软体添加到 btSoftRigidDyanmicsWrold.m_softBodies
中。
在仿真步骤的执行阶段,仍然是通过 btDiscreteDynamicsWorld::stepSimulation()
函数完成。只是,这里面的一些补充,重新改写了。
1、仿真流程及函数分解
仿真步骤总体上仍包含在 btDiscreteDynamicsWorld::stepSimulation()
函数中,其中的部分细分函数相较于刚体仿真 场景有所变化。下面分层次列出 stepSimulation()
中的内容:
[1] btDiscreteDynamicsWorld::saveKinematicState(..);
[2] btDiscreteDynamicsWorld::applyGravity();
[3] btSoftRigidDynamicsWorld::internalSingleStepSimulation();
*
[3.1] m_softBodySolver->optimize(getSoftBodyArray());
*
[3.2] btDiscreteDynamicsWorld::internalSingleStepSimulation(timeStep);
[3.2.1] btSoftRigidDynamicsWorld::predictUnconstraintMotion(..);
*
[3.2.1.1] btDiscreteDynamicsWorld::predictUnconstraintMotion(timeStep);
[3.2.1.2] m_softBodySolver->predictMotion(float(timeStep));
*
[3.2.2] btDiscreteDynamicsWorld::createPredictiveContacts(timeStep);
[3.2.3] btCollisionWorld::performDiscreteCollisionDetection();
[3.2.4] btDiscreteDynamicsWorld::calculateSimulationIslands();
[3.2.5] btDiscreteDynamicsWorld::solveConstraints(getSolverInfo());
[3.2.6] btDiscreteDynamicsWorld::integrateTransforms(timeStep);
[3.2.7] btDiscreteDynamicsWorld::updateActions(timeStep);
[3.2.8] btDiscreteDynamicsWorld::updateActivationState(timeStep);
[3.3] btSoftRigidDynamicsWorld::solveSoftBodiesConstraints(timeStep);
*
[3.4] 遍历 btSoftRigidDynamicsWorld.m_softBodies
,执行 psb->defaultCollisionHandler(psb);
*
[3.5] m_softBodySolver->updateSoftBodies();
*
[4] btDiscreteDynamicsWorld::synchronizeMotionStates();
[5] btDiscreteDynamicsWorld::clearForces();
以上便是软体场景的仿真步骤及框架。
总体上来说,涉及软体的部分有:(1)预测软体位移 predict motion;(2)求解软体约束 solve softbodies constraints;(3)求解软体的碰撞(好像是碰撞处理,而不是求解) soft body collision handle;(4)更新软体的最终状态 update soft body。
此外,在软体-刚体 、软体-软体 的碰撞检测阶段,内部函数好像还附带了碰撞求解。
2、软体形变仿真相关的类 btSoftBody
及 btSoftBodySolver
在软体形变仿真场景中,新加入的类主要是 btSoftBody
和 btSoftBodySolver
。
具体内容参见:
3、SoftBody->predictMotion
在软体形变仿真中,首先涉及到的是无约束状态下的形变计算,即 m_softBodySolver->predictMotion(float(timeStep));