/** Applies torques - Assumes caller has obtained writer lock */ void FPhysSubstepTask::ApplyTorques_AssumesLocked(const FPhysTarget& PhysTarget, FBodyInstance* BodyInstance) { #if WITH_PHYSX /** Apply Torques */ PxRigidBody* PRigidBody = BodyInstance->GetPxRigidBody_AssumesLocked(); for (int32 i = 0; i < PhysTarget.Torques.Num(); ++i) { const FTorqueTarget& TorqueTarget = PhysTarget.Torques[i]; PRigidBody->addTorque(U2PVector(TorqueTarget.Torque), TorqueTarget.bAccelChange ? PxForceMode::eACCELERATION : PxForceMode::eFORCE, true); } #endif }
void PhysActor_PhysX::AddTorque(vec3f torque, PhysForceMode::Enum mode) { if (!impl->physActor) { LOG("Cannot add torque to actor because physActor is null!"); return; } PxRigidBody* actor = nullptr; PxVec3 pushDir; pushDir.x = torque.x; pushDir.y = torque.y; pushDir.z = torque.z; PxForceMode::Enum physXMode; switch (mode) { case PhysForceMode::Acceleration: physXMode = PxForceMode::eACCELERATION; break; case PhysForceMode::Force: physXMode = PxForceMode::eFORCE; break; case PhysForceMode::VelocityChange: physXMode = PxForceMode::eVELOCITY_CHANGE; break; case PhysForceMode::Impulse: default: physXMode = PxForceMode::eIMPULSE; break; } if (impl->physActor->isRigidDynamic() || impl->physActor->isRigidBody()) { actor = (PxRigidBody*)impl->physActor; } else { LOG("Cannot add force to actor because actor is not a Rigid Dynamic or Rigid Body actor."); return; } if (actor) actor->addTorque(pushDir, physXMode); }
PX_INLINE void addForceAtPosInternal(PxRigidBody& body, const PxVec3& force, const PxVec3& pos, PxForceMode::Enum mode, bool wakeup) { if(mode == PxForceMode::eACCELERATION || mode == PxForceMode::eVELOCITY_CHANGE) { Ps::getFoundation().error(PxErrorCode::eINVALID_PARAMETER, __FILE__, __LINE__, "PxRigidBodyExt::addForce methods do not support eACCELERATION or eVELOCITY_CHANGE modes"); return; } const PxTransform globalPose = body.getGlobalPose(); const PxVec3 centerOfMass = globalPose.transform(body.getCMassLocalPose().p); const PxVec3 torque = (pos - centerOfMass).cross(force); body.addForce(force, mode, wakeup); body.addTorque(torque, mode, wakeup); }