如何设置约束的电机目标?

How to set a constraint's motor target?

我正在尝试在 Bullet Physics 中实现布娃娃,模仿我在使用 PhysX 的 Maya 插件中创建的布娃娃。除了约束电机,我什么都有1:1。

在 physX 中,电机仅具有线性和 angular damping/stiffness 以及一个表示为 mat4(位置和旋转)的目标。

理想情况下我会使用 btConeTwist 但它似乎没有 linear/angular 电机设置所以我切换到 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);

问题是我找不到任何方法来设置电机目标。它必须有一个,即电机的唯一目的,rotating/translating 一个朝向目标的刚体 rotation/translation。

至少可以说,Bullet 文档缺乏任何见解或建议。

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

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

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 论坛也有一些有用的约束对话。