// create constraint void MBulletContext::createConstraint(unsigned int * constraintId, unsigned int parentObjectId, unsigned int objectId, const MVector3 & pivot, bool disableParentCollision) { btRigidBody * bA = btRigidBody::upcast(m_collisionObjects[parentObjectId]); btRigidBody * bB = btRigidBody::upcast(m_collisionObjects[objectId]); if(bA && bB) { bA->setActivationState(DISABLE_DEACTIVATION); bB->setActivationState(DISABLE_DEACTIVATION); *constraintId = m_constraints.size(); MVector3 position, euler; MQuaternion rotation; MMatrix4x4 matrix, matrix1, matrix2, rotMatrix; rotMatrix.setRotationEuler(90, 0, 0); getObjectTransform(parentObjectId, &position, &rotation); matrix1.setRotationAxis(rotation.getAngle(), rotation.getAxis()); matrix1.setTranslationPart(position); getObjectTransform(objectId, &position, &rotation); matrix2.setRotationAxis(rotation.getAngle(), rotation.getAxis()); matrix2.setTranslationPart(position + matrix2.getRotatedVector3(pivot)); matrix = (matrix1.getInverse() * matrix2) * rotMatrix; euler = matrix.getEulerAngles(); position = matrix.getTranslationPart(); rotation.setFromAngles(euler.x, euler.y, euler.z); btTransform frameInA, frameInB; frameInA = btTransform::getIdentity(); frameInA.setOrigin(btVector3(position.x, position.y, position.z)); frameInA.setRotation(btQuaternion(rotation.values[0], rotation.values[1], rotation.values[2], rotation.values[3])); rotation.setFromAngles(90, 0, 0); frameInB = btTransform::getIdentity(); frameInB.setOrigin(btVector3(pivot.x, pivot.y, pivot.z)); frameInB.setRotation(btQuaternion(rotation.values[0], rotation.values[1], rotation.values[2], rotation.values[3])); btGeneric6DofSpringConstraint * constraint = new btGeneric6DofSpringConstraint( *bA, *bB, frameInA, frameInB, true ); m_constraints.push_back(constraint); m_dynamicsWorld->addConstraint(constraint, disableParentCollision); } }