【问题标题】:bullet physics - object stabilization after picking子弹物理 - 拾取后的物体稳定
【发布时间】:2017-01-22 17:53:02
【问题描述】:

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

当一个下落的物体被拾取时,它开始围绕一个拾取点旋转,但随着时间的推移旋转减少。一段时间后,拾取的对象应该会变得稳定。

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

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

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

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

【问题讨论】:

    标签: bulletphysics


    【解决方案1】:

    我使用btGeneric6DofConstraint 代替btPoint2PointConstraint,并抑制所有角运动。

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

    【讨论】:

    • 你还能回答为什么吗?我也想知道。
    • 点对点约束实际上只是试图使两个不同参考框架中的两个点尽可能靠近。所以你拾取的对象只是被拉向你的拾取点,但它的旋转不受影响。这就是为什么上面的解决方案建议使用角运动抑制。如果拾取某些东西,您也可以通过将角速度设置为零来手动执行此操作。这更像是您对用手“抓住”它的期望。
    猜你喜欢
    • 2013-12-24
    • 1970-01-01
    • 2011-03-02
    • 2019-04-02
    • 1970-01-01
    • 2015-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多