// spherical joint limited to an angle of at most pi/4 radians (45 degrees) PxJoint* createLimitedSpherical(PxRigidActor* a0, const PxTransform& t0, PxRigidActor* a1, const PxTransform& t1) { PxSphericalJoint* j = PxSphericalJointCreate(*gPhysics, a0, t0, a1, t1); j->setLimitCone(PxJointLimitCone(PxPi / 4, PxPi / 4, 0.05f)); j->setSphericalJointFlag(PxSphericalJointFlag::eLIMIT_ENABLED, true); return j; }
/** Scale Angular Limit Constraints (as defined in RB_ConstraintSetup) */ void FConstraintInstance::SetAngularDOFLimitScale(float InSwing1LimitScale, float InSwing2LimitScale, float InTwistLimitScale) { #if WITH_PHYSX if (PxD6Joint* Joint = GetUnbrokenJoint()) { if ( AngularSwing1Motion == ACM_Limited || AngularSwing2Motion == ACM_Limited ) { // PhysX swing directions are different from Unreal's - so change here. if (AngularSwing1Motion == ACM_Limited) { Joint->setMotion(PxD6Axis::eSWING2, PxD6Motion::eLIMITED); } if (AngularSwing2Motion == ACM_Limited) { Joint->setMotion(PxD6Axis::eSWING1, PxD6Motion::eLIMITED); } //The limite values need to be clamped so it will be valid in PhysX PxReal ZLimitAngle = FMath::ClampAngle(Swing1LimitAngle * InSwing1LimitScale, KINDA_SMALL_NUMBER, 179.9999f) * (PI/180.0f); PxReal YLimitAngle = FMath::ClampAngle(Swing2LimitAngle * InSwing2LimitScale, KINDA_SMALL_NUMBER, 179.9999f) * (PI/180.0f); PxReal LimitContractDistance = 1.f * (PI/180.0f); Joint->setSwingLimit(PxJointLimitCone(YLimitAngle, ZLimitAngle, LimitContractDistance)); } if ( AngularSwing1Motion == ACM_Locked ) { Joint->setMotion(PxD6Axis::eSWING2, PxD6Motion::eLOCKED); } if ( AngularSwing2Motion == ACM_Locked ) { Joint->setMotion(PxD6Axis::eSWING1, PxD6Motion::eLOCKED); } if ( AngularTwistMotion == ACM_Limited ) { Joint->setMotion(PxD6Axis::eTWIST, PxD6Motion::eLIMITED); const float TwistLimitRad = TwistLimitAngle * InTwistLimitScale * (PI/180.0f); PxReal LimitContractDistance = 1.f * (PI/180.0f); Joint->setTwistLimit(PxJointAngularLimitPair(-TwistLimitRad, TwistLimitRad, LimitContractDistance)); } else if ( AngularTwistMotion == ACM_Locked ) { Joint->setMotion(PxD6Axis::eTWIST, PxD6Motion::eLOCKED); } } #endif }