首页 > 其他 > 详细

Bullet 学习笔记之 Soft Body Physics Pipeline

时间:2020-05-04 14:53:10      阅读:82      评论:0      收藏:0      [点我收藏+]

在最近几个新的版本中,Bullet 物理引擎逐步加入并完善了软体形变的仿真。btSoftBody 类用于软体的模拟,仿真场景则通过 btSoftRigidDynamicsWorld 搭建。下面简单介绍一下 Soft Body Physics Pipeline 。


0、Overview

软体仿真的场景类 btSoftRigidDynamicsWorld 继承自 btDiscreteDynamicsWorld ,主要添加了存放软体对象的数组 m_softBodies 、软体对像的求解器 m_softBodySolver 类,并重载了函数 predictUnconstraintMotioninternalSingleStepSimulation ,添加了成员函数 solveSoftBodiesConstraintsrayTestrayTestSingle 等。

在初始化阶段,新建了软体对象的求解器为 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、软体形变仿真相关的类 btSoftBodybtSoftBodySolver

在软体形变仿真场景中,新加入的类主要是 btSoftBodybtSoftBodySolver

具体内容参见:

Bullet 学习笔记之 btSoftBody

Bullet 学习笔记之 btSoftBodySolver


3、SoftBody->predictMotion

在软体形变仿真中,首先涉及到的是无约束状态下的形变计算,即 m_softBodySolver->predictMotion(float(timeStep));

Bullet 学习笔记之 Soft Body Physics Pipeline

原文:https://www.cnblogs.com/wghou09/p/12826275.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!