599physx::PxJoint *QD6Joint::createPhysxJoint(physx::PxRigidActor *actorA,
600 physx::PxRigidActor *actorB,
601 const physx::PxTransform &trfA,
602 const physx::PxTransform &trfB)
604 return physx::PxD6JointCreate(*StaticPhysXObjects::getReference().physics,
605 actorA, trfA, actorB, trfB);
608void QD6Joint::setJointProperties()
610 auto *d6Joint =
static_cast<physx::PxD6Joint *>(m_joint);
614 const physx::PxTolerancesScale scale =
615 StaticPhysXObjects::getReference().physics->getTolerancesScale();
617 d6Joint->setMotion(physx::PxD6Axis::eX, toPxEnum(m_xMotion));
618 d6Joint->setMotion(physx::PxD6Axis::eY, toPxEnum(m_yMotion));
619 d6Joint->setMotion(physx::PxD6Axis::eZ, toPxEnum(m_zMotion));
620 d6Joint->setMotion(physx::PxD6Axis::eTWIST, toPxEnum(m_twistMotion));
621 d6Joint->setMotion(physx::PxD6Axis::eSWING1, toPxEnum(m_swingMotionY));
622 d6Joint->setMotion(physx::PxD6Axis::eSWING2, toPxEnum(m_swingMotionZ));
624 if (m_xMotion == Motion::Limited) {
625 physx::PxJointLinearLimitPair limit(scale, qMin(m_linearLimitXLower, m_linearLimitXUpper),
626 qMax(m_linearLimitXLower, m_linearLimitXUpper));
627 limit.stiffness = m_linearStiffness;
628 limit.damping = m_linearDamping;
629 d6Joint->setLinearLimit(physx::PxD6Axis::eX, limit);
632 if (m_yMotion == Motion::Limited) {
633 physx::PxJointLinearLimitPair limit(scale, qMin(m_linearLimitYLower, m_linearLimitYUpper),
634 qMax(m_linearLimitYLower, m_linearLimitYUpper));
635 limit.stiffness = m_linearStiffness;
636 limit.damping = m_linearDamping;
637 d6Joint->setLinearLimit(physx::PxD6Axis::eY, limit);
640 if (m_zMotion == Motion::Limited) {
641 physx::PxJointLinearLimitPair limit(scale, qMin(m_linearLimitZLower, m_linearLimitZUpper),
642 qMax(m_linearLimitZLower, m_linearLimitZUpper));
643 limit.stiffness = m_linearStiffness;
644 limit.damping = m_linearDamping;
645 d6Joint->setLinearLimit(physx::PxD6Axis::eZ, limit);
648 if (m_twistMotion == Motion::Limited) {
649 physx::PxJointAngularLimitPair limit(qMin(m_twistLimitLower, m_twistLimitUpper),
650 qMax(m_twistLimitLower, m_twistLimitUpper));
651 limit.stiffness = m_angularStiffness;
652 limit.damping = m_angularDamping;
653 d6Joint->setTwistLimit(limit);
656 if (m_swingMotionY == Motion::Limited || m_swingMotionZ == Motion::Limited) {
658 const float angleY = qBound(0.0001f, m_swingLimitAngleY,
float(M_PI) - 0.0001f);
659 const float angleZ = qBound(0.0001f, m_swingLimitAngleZ,
float(M_PI) - 0.0001f);
661 physx::PxJointLimitCone limit(angleY, angleZ);
662 limit.stiffness = m_angularStiffness;
663 limit.damping = m_angularDamping;
664 d6Joint->setSwingLimit(limit);