【问题标题】:How to set a constraint's motor target?如何设置约束的运动目标?
【发布时间】:2021-04-10 11:14:26
【问题描述】:

我正在尝试在 Bullet Physics 中实现布娃娃,模仿我在使用 PhysX 的 Maya 插件中创建的布娃娃。除了约束马达,我拥有 1:1 的一切。

在 physX 中,电机仅具有线性和角度阻尼/刚度以及表示为 mat4(位置和旋转)的目标。

理想情况下我会使用btConeTwist,但它似乎没有线性/角电机设置,所以我切换到btGeneric6DofConstraint,它确实提供了可访问性,我设置如下,我认为它是正确的。 ..

// Angular
joint.dof6->getRotationalLimitMotor(0)->m_damping = joint.drive_angularDamping;
joint.dof6->getRotationalLimitMotor(1)->m_damping = joint.drive_angularDamping;
joint.dof6->getRotationalLimitMotor(2)->m_damping = joint.drive_angularDamping;
joint.dof6->getRotationalLimitMotor(0)->m_limitSoftness = (1 / joint.drive_angularStiffness);
joint.dof6->getRotationalLimitMotor(1)->m_limitSoftness = (1 / joint.drive_angularStiffness);
joint.dof6->getRotationalLimitMotor(2)->m_limitSoftness = (1 / joint.drive_angularStiffness);

// Linear
joint.dof6->getTranslationalLimitMotor()->m_damping = joint.drive_linearDampening;
joint.dof6->getTranslationalLimitMotor()->m_limitSoftness = (1 / joint.drive_linearStiffness);

问题是我找不到任何方法来设置电机目标。它必须有一个,即电机的唯一用途,将刚体旋转/平移到目标旋转/平移。

Bullet 文档至少可以说缺乏,任何见解或建议都会令人难以置信。

【问题讨论】:

    标签: c++ bulletphysics physx


    【解决方案1】:

    您应该使用btGeneric6DofSpring2Constraint。它是所有 Bullets 约束中最灵活、功能最丰富的,也是我经验中最稳定的。据我所知,您了解如何设置约束框架和约束的其余部分,因此我将跳过该部分。设置与其他所有设置相同。

    从那里开始很直接。让我们从一个简单的约束目标速度开始。您必须启用电机,设置最大电机力,最后设置目标速度。索引对应于约束中的轴。线性 X、Y 和 Z 是 0、1 和 2。旋转 X、Y 和 Z 是 3、4 和 5。旋转的目标速度以弧度秒为单位。所以这个例子在约束框架中创建了一个围绕 X 轴的旋转电机,它试图以每秒 180 度的速度移动。

    pConstraint->enableMotor(3, true);
    pConstraint->setMaxMotorForce(3, 10000.0);
    pConstraint->setTargetVelocity(3, M_PI);
    

    伺服或带有目标的电机稍微复杂一些,但并不多。它与上一节相同,但有两个补充。首先,启用伺服,并设置伺服目标。请注意,您仍然必须设置目标速度才能使其工作。伺服目标以弧度为单位进行旋转。所以在这个例子中,伺服系统试图绕约束 X 轴旋转 90 度。

    pConstraint->enableMotor(3, true);
    pConstraint->setMaxMotorForce(3, 10000.0);
    pConstraint->setTargetVelocity(3, 10.0);
    pConstraint->setServo(3, true);
    pConstraint->setServoTarget(3, M_PI / 2.0);
    

    请注意btGeneric6DofSpring2Constraint 使用欧拉角,因此会受到云台锁定。一个轴被限制为 [-PI / 2, PI / 2] 而不是完整的 360 度运动。该轴是旋转顺序中的中间轴。默认情况下,顺序为 X、Y、Z,因此 Y 轴受到约束。如果这是一个问题,您可以使用其他轮换顺序之一。

    约束代码注释得体。我想你会在那里找到任何其他问题的答案。 Bullet 论坛也有一些关于约束的对话,这些对话很有用。

    【讨论】:

      猜你喜欢
      • 2017-12-24
      • 1970-01-01
      • 1970-01-01
      • 2018-06-26
      • 1970-01-01
      • 2014-10-25
      • 2016-10-20
      • 2020-02-27
      相关资源
      最近更新 更多