Bullet Physics - получить мировую позицию оси вращения - PullRequest
0 голосов
/ 18 июня 2020

enter image description here

Я работаю над тряпичной куклой, и мне нужно получить мировое положение оси поворота между двумя ограниченными твердыми телами. Ограничение имеет тип btGeneric6DofConstraint, и я настраиваю его так ...

localA.setIdentity(); 
localA.setOrigin(btVector3(btScalar(-0.2), btScalar(0.15), btScalar(0.)));

localB.setIdentity();
localB.getBasis().setEulerZYX(SIMD_HALF_PI, 0, -SIMD_HALF_PI);
localB.setOrigin(btVector3(btScalar(0.), btScalar(-0.18), btScalar(0.)));

joint6DOF = new btGeneric6DofConstraint(*m_bodies[BODYPART_SPINE], *m_bodies[BODYPART_LEFT_UPPER_ARM], localA, localB, useLinearReferenceFrameA);
joint6DOF->setAngularLowerLimit(btVector3(-SIMD_PI * 0.8f, -SIMD_EPSILON, -SIMD_PI * 0.5f));
joint6DOF->setAngularUpperLimit(btVector3(SIMD_PI * 0.8f, SIMD_EPSILON, SIMD_PI * 0.5f));

m_joints[JOINT_LEFT_SHOULDER] = joint6DOF;
m_ownerWorld->addConstraint(m_joints[JOINT_LEFT_SHOULDER], true);

Ближайший ответ, который я смог найти в другом месте, - this , который намекает, что математика находится внутри btConeTwistConstraint::buildJacobian(), который устанавливает начальную позицию для точки поворота (я думаю), но я не смог получить от нее каких-либо значимых результатов. Вот что я пробовал.

btVector3 originA = ragdoll->m_joints[i]->getRigidBodyA().getWorldTransform().getOrigin();
btVector3 originB = ragdoll->m_joints[i]->getRigidBodyB().getWorldTransform().getOrigin();
btTransform comA = ragdoll->m_joints[i]->getRigidBodyA().getCenterOfMassTransform();
btTransform comB = ragdoll->m_joints[i]->getRigidBodyB().getCenterOfMassTransform();

btVector3 relPos = (comA * originA) - (comB * originB);
...