我正在编写一个使用 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);
问题是有时这有效,有时则无效。以模特的裙子为例。有时它会出现在自然位置,有时会稍微错位并落入到位,有时它会完全穿过身体,好像碰撞已关闭,并且有一些力将它推向那个方向。这在大多数情况下确实有意义,因为在测试动画中,我使用模型的初始位置在屏幕中央,但动画从屏幕左侧开始。有谁知道如何解决这个问题?
我知道裙子上的骨骼不是问题,因为我关闭了物理并强制它在每一帧手动更新骨骼位置,并且在整个动画中一切都在正确的位置。
编辑:我也有限制,这可能是造成这种情况的原因吗?