bullet物理 - 采摘后物体稳定

时间:2017-01-22 17:53:02

标签: bulletphysics

许多子弹示例都继承自CommonRigidBodyBase。基于btPoint2PointConstraint挑选对象。 我已经分析了一个SimpleBox示例。

当拾取掉落的物体时,它开始围绕拾取点旋转,但旋转会随着时间的推移而减小。经过一段时间后,拾取的物体应该变得稳定。

在SimpleBox示例中,我将碰撞形状(1,1,1)更改为(2,2,2):

btBoxShape* colShape = createBoxShape(btVector3(2,2,2));

当我在地面以上的同一高度处或多或少地拾取掉落物体(比之前更大)时,它会在拾取点周围旋转更长时间。为什么?

我想知道如何控制拾取后稳定物体所需的时间。让我们假设重力是固定的(9.8)。我只有一个想法:为对象分配更大的质量。还有其他参数吗?

1 个答案:

答案 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);
}