PhysXSphericalJoint::PhysXSphericalJoint(PxPhysics* physx, const SPHERICAL_JOINT_DESC& desc) :SphericalJoint(desc) { PxRigidActor* actor0 = nullptr; if (desc.bodies[0].body != nullptr) actor0 = static_cast<PhysXRigidbody*>(desc.bodies[0].body)->_getInternal(); PxRigidActor* actor1 = nullptr; if (desc.bodies[1].body != nullptr) actor1 = static_cast<PhysXRigidbody*>(desc.bodies[1].body)->_getInternal(); PxTransform tfrm0 = toPxTransform(desc.bodies[0].position, desc.bodies[0].rotation); PxTransform tfrm1 = toPxTransform(desc.bodies[1].position, desc.bodies[1].rotation); PxSphericalJoint* joint = PxSphericalJointCreate(*physx, actor0, tfrm0, actor1, tfrm1); joint->userData = this; mInternal = bs_new<FPhysXJoint>(joint, desc); PxSphericalJointFlags flags; if (((UINT32)desc.flag & (UINT32)Flag::Limit) != 0) flags |= PxSphericalJointFlag::eLIMIT_ENABLED; joint->setSphericalJointFlags(flags); // Calls to virtual methods are okay here setLimit(desc.limit); }
// 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; }