// 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;
}
Example #2
0
/** 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
}