C++ 如何设置约束';什么是机动目标?

C++ 如何设置约束';什么是机动目标?,c++,bulletphysics,physx,C++,Bulletphysics,Physx,我试图在Bullet Physics中实现一个碎布玩偶,模仿我在使用PhysX的Maya插件中创建的碎布玩偶。除了强制马达,我什么都有 在physX中,电机仅具有线性和角度阻尼/刚度,目标表示为mat4(位置和旋转) 理想情况下,我会使用btconnetwest,但它似乎没有直线/角度电机设置,所以我切换到了btGeneric6DofConstraint,它确实提供了可访问性,我设置如下,我认为它是正确的 // Angular joint.dof6->getRotationalLimitM

我试图在Bullet Physics中实现一个碎布玩偶,模仿我在使用PhysX的Maya插件中创建的碎布玩偶。除了强制马达,我什么都有

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

理想情况下,我会使用
btconnetwest
,但它似乎没有直线/角度电机设置,所以我切换到了
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 docs一点也不说,任何见解或建议都是难以置信的。

您应该使用
btGeneric6DofSpring2Constraint
。它是所有子弹约束中最灵活、功能最丰富的,也是我的经验中最稳定的。从我能告诉你的,你了解如何设置约束框架和约束的其余部分,所以我将跳过这一部分。设置与所有其他设置相同

从那里直截了当地往前走。让我们从约束的简单目标速度开始。您必须启用电机,设置最大电机力,最后设置目标速度。索引对应于约束中的轴。线性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论坛也有一些关于约束的对话,这些对话很有用