许多子弹示例都继承自CommonRigidBodyBase。基于btPoint2PointConstraint挑选对象。 我已经分析了一个SimpleBox示例。
当拾取掉落的物体时,它开始围绕拾取点旋转,但旋转会随着时间的推移而减小。经过一段时间后,拾取的物体应该变得稳定。
在SimpleBox示例中,我将碰撞形状(1,1,1)更改为(2,2,2):
btBoxShape* colShape = createBoxShape(btVector3(2,2,2));
当我在地面以上的同一高度处或多或少地拾取掉落物体(比之前更大)时,它会在拾取点周围旋转更长时间。为什么?
我想知道如何控制拾取后稳定物体所需的时间。让我们假设重力是固定的(9.8)。我只有一个想法:为对象分配更大的质量。还有其他参数吗?
答案 0 :(得分:1)
而不是btPoint2PointConstraint
,我使用btGeneric6DofConstraint
来抑制所有角度运动。
m_pickedRigidBody->setActivationState(DISABLE_DEACTIVATION);
btTransform pivot;
pivot.setIdentity();
btVector3 localPivot = m_pickedRigidBody->getCenterOfMassTransform().inverse() * rayCast.point;
pivot.setOrigin(localPivot);
btGeneric6DofConstraint* DOF6 = new btGeneric6DofConstraint(*m_pickedRigidBody, pivot, true);
bool bLimitAngularMotion = true;
if (bLimitAngularMotion) {
DOF6->setAngularLowerLimit(btVector3(0, 0, 0));
DOF6->setAngularUpperLimit(btVector3(0, 0, 0));
}
m_dynamicWorld->addConstraint(DOF6, true);
m_pickedConstraint = DOF6;
float cfm = 0.5f;
float erp = 0.5f;
for (int i = 0; i < 6; i++) {
DOF6->setParam(BT_CONSTRAINT_STOP_CFM, cfm, i);
DOF6->setParam(BT_CONSTRAINT_STOP_ERP, erp, i);
}