Я использую библиотеку BulletDynamics для моделирования цепочки связанных твердых тел. И как начало есть только одна революционная ссылка с осью X. Это часть инициализации:
//init the links
btVector3 hingeJointAxis(1.f, 0.f, 0.f);
//y-axis assumed up
btVector3 parentCom(head + (head - tail));
btVector3 thisPivot(head);
btVector3 thisCom(tail);
for (int i = 0; i < numLinks; ++i)
{
float linkMass = 10.f;
btVector3 linkInertiaDiag(0.0001f, 0.0001f, 0.0001f);
pMultiBody->setupRevolute(i,
linkMass,
linkInertiaDiag,
i - 1,
btQuaternion(0.f, 0.f, 0.f, 1.f),
hingeJointAxis,
(tail - head),
0.1f * (tail - head),
false);
}
pMultiBody->finalizeMultiDof();
btMultiBodyDynamicsWorld* world = m_dynamicsWorld;
world->addMultiBody(pMultiBody);
pMultiBody->setCanSleep(canSleep);
pMultiBody->setHasSelfCollision(selfCollide);
pMultiBody->setUseGyroTerm(gyro);
//
if (!damping)
{
pMultiBody->setLinearDamping(0.f);
pMultiBody->setAngularDamping(0.f);
}
else
{
pMultiBody->setLinearDamping(0.1f);
pMultiBody->setAngularDamping(0.9f);
}
setGravityInWorldFrame(IBulletBodyController::gravityVector());
btAlignedObjectArray<btQuaternion> scratch_q;
btAlignedObjectArray<btVector3> scratch_m;
pMultiBody->forwardKinematics(scratch_q, scratch_m);
btAlignedObjectArray<btQuaternion> world_to_local;
btAlignedObjectArray<btVector3> local_origin;
pMultiBody->updateCollisionObjectWorldTransforms(world_to_local, local_origin);
Это взято из примеров библиотек. Так что это должно быть правильно. После этого я постепенно вращаю базу, а затем использую функцию stepSimulation () , чтобы увидеть результат. То, что я вижу, что связь наклоняется назад (как предписывает физика) на углы от 0 до PI и вперед на другой стороне круга от PI до 2PI, что определенно не так, как ожидалось.
auto btEulerSpeed = btVector3(eulerSpeed.x, eulerSpeed.y, eulerSpeed.z);
_multiBody->setBaseOmega(btEulerSpeed);
m_dynamicsWorld->stepSimulation(deltaT, 0);
Любые идеи будут оценены