gpt4 book ai didi

position - 在子弹物理学中重新定位刚体

转载 作者:行者123 更新时间:2023-12-04 20:49:40 24 4
gpt4 key购买 nike

我正在编写一个角色动画渲染引擎,它使用 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);

问题是有时这行得通,有时则行不通。以模特的裙子为例。有时它会出现在自然位置,有时会稍微错位并落入原位,有时它会完全夹在 body 上,好像碰撞被关闭并且有一些力将它推向那个方向。大多数时候这确实有意义,因为在测试动画中,我使用模型的初始位置在屏幕中央,但动画从屏幕左侧开始。有谁知道如何解决这个问题?

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

编辑:我也有限制,这可能是造成这种情况的原因吗?

最佳答案

这是我的重新定位方法,正是这样做的。

void LimbBt::reposition(btVector3 position,btVector3 orientation) {
btTransform initialTransform;

initialTransform.setOrigin(position);
initialTransform.setRotation(orientation);

mBody->setWorldTransform(initialTransform);
mMotionState->setWorldTransform(initialTransform);
}

运动状态 mMotionState 是您在开始时为 btRigidBody 创建的运动状态。只需将您的 clearForces() 和速度添加到它,以阻止 body 从新位置移动,就像它穿过门户一样。那应该这样做。它在我这里很好用。

编辑:如果您正确地重新定位所有刚体,约束将适应。为此,很容易计算相对位置并据此重新定位整个受约束的刚体构造。如果你做错了,你会得到严重的抽搐,因为约束会尝试在数值上调整你的构造,如果约束间隙很大,会导致很大的力。

Edit2:另一个问题是,如果您需要确定性行为(每次重置 body 时,它们都应该完全相同),那么您将不得不杀死旧的 dynamicsWorld,重新创建它并再次添加所有 body 。世界存储了一些暂时无法清除的尸体信息。这在 future 可能会改变,因为 bullet4 将支持确定性重置。但是现在,如果您使用确定性重置进行实验,则需要放弃世界并重新创建它。

来源: discussion with Erwin Coumans, the developer of Bullet Physics .

关于position - 在子弹物理学中重新定位刚体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12251199/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com