重新定位刚体在子弹物理学中的位置

bea*_*omg 5 physics position set bullet rigid-bodies

我正在编写一个使用Bullet Physics作为物理模拟引擎的角色动画渲染引擎。

序列将在屏幕上没有模型的情况下开始,然后将动画分配给该模型,模型将移至动画的第0帧,引擎将开始使用动画渲染模型。

在第0帧初始化刚体时,在刚体模型上重新放置刚体的正确方法是什么?

当前,我正在使用此代码,在将动画分配给模型并将骨骼移动到第0帧位置后立即调用该代码:

_world->removeRigidBody(_body);
bool k = (_type == Kinematics);
_body->setCollisionFlags(_body->getCollisionFlags() & ~btCollisionObject::CF_NO_CONTACT_RESPONSE);
btTransform tr = BulletPhysics::ConvertD3DXMatrix(&(_bone->getCombinedTrans()));
tr *= _trans;
_body->setCenterOfMassTransform(tr);
_body->clearForces();
_body->setLinearVelocity(btVector3(0,0,0));
_body->setAngularVelocity(btVector3(0,0,0));
_world->addRigidBody(_body, _groupID, _groupMask);
Run Code Online (Sandbox Code Playgroud)

问题是有时候这行得通,有时则行不通。例如,以模特的裙子为例。有时它会以自然位置显示,其他时候略微偏离并落入到位,而其他时候它会完全夹在整个身体中,就像碰撞被关闭并且有些力将其推向那个方向一样。在大多数情况下,这确实很有意义,因为在测试动画中,我使用的模型的初始位置位于屏幕的中央,但是动画从屏幕的左侧开始。有谁知道如何解决这个问题?

我知道裙子上的骨骼不是问题,因为我关闭了物理功能,并强迫它在每个帧中手动更新骨骼位置,并且整个动画中的所有位置都正确。

编辑:我也有约束,可能是什么原因造成的?

0to*_*bo0 0

我无法告诉您移动刚体时导致异常结果的原因,但我绝对可以表示同情!

为了解决这个问题,您需要做三件事:

  1. 将刚体转换为运动体
  2. 调整物体运动状态的世界变换而不是刚体
  3. 将运动体转换回刚体