9#include "PxPhysicsAPI.h"
11#include <QtGui/qquaternion.h>
17 return static_cast<
bool>(body.getRigidBodyFlags() & physx::PxRigidBodyFlag::eKINEMATIC);
21 bool isKinematic,
bool worldEnableCCD)
24 case QDynamicRigidBody::CCDType::SweepBasedCCD: {
26 body.setRigidBodyFlag(physx::PxRigidBodyFlag::eENABLE_CCD, !isKinematic);
27 body.setRigidBodyFlag(physx::PxRigidBodyFlag::eENABLE_SPECULATIVE_CCD, isKinematic);
31 case QDynamicRigidBody::CCDType::SpeculativeCCD: {
32 body.setRigidBodyFlag(physx::PxRigidBodyFlag::eENABLE_SPECULATIVE_CCD,
true);
36 case QDynamicRigidBody::CCDType::None: {
39 body.setRigidBodyFlag(physx::PxRigidBodyFlag::eENABLE_CCD, !isKinematic);
40 body.setRigidBodyFlag(physx::PxRigidBodyFlag::eENABLE_SPECULATIVE_CCD, isKinematic);
59 physx::PxRigidBody &body)
64 body.addForce(QPhysicsUtils::toPhysXType(force));
68 const QVector3D &inPosition)
77 physx::PxRigidBody &body)
82 physx::PxRigidBodyExt::addForceAtPos(body, QPhysicsUtils::toPhysXType(force),
83 QPhysicsUtils::toPhysXType(position));
95 physx::PxRigidBody &body)
100 body.addTorque(QPhysicsUtils::toPhysXType(torque));
112 physx::PxRigidBody &body)
117 body.addForce(QPhysicsUtils::toPhysXType(impulse), physx::PxForceMode::eIMPULSE);
121 const QVector3D &inPosition)
130 physx::PxRigidBody &body)
135 physx::PxRigidBodyExt::addForceAtPos(body, QPhysicsUtils::toPhysXType(impulse),
136 QPhysicsUtils::toPhysXType(position),
137 physx::PxForceMode::eIMPULSE);
149 physx::PxRigidBody &body)
155 body.addTorque(QPhysicsUtils::toPhysXType(impulse), physx::PxForceMode::eIMPULSE);
159 const QVector3D &inAngularVelocity)
168 physx::PxRigidBody &body)
171 body.setAngularVelocity(QPhysicsUtils::toPhysXType(angularVelocity));
175 const QVector3D &inLinearVelocity)
184 physx::PxRigidBody &body)
187 body.setLinearVelocity(QPhysicsUtils::toPhysXType(linearVelocity));
197 if (rigidBody.hasStaticShapes()) {
198 qWarning() <<
"Cannot set mass or density on a body containing trimesh/heightfield/plane, "
203 physx::PxRigidBodyExt::setMassAndUpdateInertia(body, mass);
207 physx::PxRigidBody &body)
209 if (rigidBody.hasStaticShapes()) {
210 qWarning() <<
"Cannot set mass or density on a body containing trimesh/heightfield/plane, "
216 body.setCMassLocalPose(
217 physx::PxTransform(QPhysicsUtils::toPhysXType(rigidBody.centerOfMassPosition()),
218 QPhysicsUtils::toPhysXType(rigidBody.centerOfMassRotation())));
219 body.setMassSpaceInertiaTensor(QPhysicsUtils::toPhysXType(inertia));
223 float inMass,
const QMatrix3x3 &inInertia)
232 physx::PxRigidBody &body)
234 if (rigidBody.hasStaticShapes()) {
235 qWarning() <<
"Cannot set mass or density on a body containing trimesh/heightfield/plane, "
240 physx::PxQuat massFrame;
241 physx::PxVec3 diagTensor = physx::PxDiagonalize(QPhysicsUtils::toPhysXType(inertia), massFrame);
242 if (!QPhysicsUtils::isFinite(diagTensor) || diagTensor.x <= 0.0f || diagTensor.y <= 0.0f
243 || diagTensor.z <= 0.0f) {
244 qWarning() <<
"Invalid inertiaMatrix, does not diagonalize to a positive-definite "
249 body.setCMassLocalPose(physx::PxTransform(
250 QPhysicsUtils::toPhysXType(rigidBody.centerOfMassPosition()), massFrame));
252 body.setMassSpaceInertiaTensor(diagTensor);
264 physx::PxRigidBody &body)
266 if (rigidBody.hasStaticShapes()) {
267 qWarning() <<
"Cannot set mass or density on a body containing trimesh/heightfield/plane, "
272 physx::PxRigidBodyExt::updateMassAndInertia(body, density);
277 :
QPhysicsCommand(), isKinematic(inIsKinematic), worldEnableCCD(worldEnableCCD)
285 physx::PxRigidBody &body)
287 if (rigidBody.hasStaticShapes() && !isKinematic) {
288 qWarning() <<
"Cannot make a body containing trimesh/heightfield/plane non-kinematic, "
296 body.setRigidBodyFlag(physx::PxRigidBodyFlag::eENABLE_CCD,
false);
297 body.setRigidBodyFlag(physx::PxRigidBodyFlag::eENABLE_SPECULATIVE_CCD,
false);
298 body.setRigidBodyFlag(physx::PxRigidBodyFlag::eKINEMATIC, isKinematic);
301 resolveCCDFlags(body, rigidBody.ccd(), isKinematic, worldEnableCCD);
317 body.setRigidBodyFlag(physx::PxRigidBodyFlag::eENABLE_CCD,
false);
318 body.setRigidBodyFlag(physx::PxRigidBodyFlag::eENABLE_SPECULATIVE_CCD,
false);
320 resolveCCDFlags(body, ccdType, rigidBody.isKinematic(), worldEnableCCD);
332 physx::PxRigidBody &body)
335 body.setActorFlag(physx::PxActorFlag::eDISABLE_GRAVITY, !gravityEnabled);
349 body.setLinearVelocity(physx::PxVec3(0, 0, 0));
350 body.setAngularVelocity(physx::PxVec3(0, 0, 0));
352 auto *parentNode = rigidBody.parentNode();
353 QVector3D scenePosition = parentNode ? parentNode->mapPositionToScene(position) : position;
356 body.setGlobalPose(physx::PxTransform(
357 QPhysicsUtils::toPhysXType(scenePosition),
358 QPhysicsUtils::toPhysXType(QQuaternion::fromEulerAngles(eulerRotation))));
362 float inMass,
const QVector3D &inInertia)
QPhysicsCommandApplyCentralForce(const QVector3D &inForce)
~QPhysicsCommandApplyCentralForce() override
QPhysicsCommandApplyCentralImpulse(const QVector3D &inImpulse)
~QPhysicsCommandApplyCentralImpulse() override
QPhysicsCommandApplyForce(const QVector3D &inForce, const QVector3D &inPosition)
~QPhysicsCommandApplyForce() override
~QPhysicsCommandApplyImpulse() override
QPhysicsCommandApplyImpulse(const QVector3D &inImpulse, const QVector3D &inPosition)
~QPhysicsCommandApplyTorqueImpulse() override
QPhysicsCommandApplyTorqueImpulse(const QVector3D &inImpulse)
~QPhysicsCommandApplyTorque() override
QPhysicsCommandApplyTorque(const QVector3D &inTorque)
~QPhysicsCommandReset() override
QPhysicsCommandReset(QVector3D inPosition, QVector3D inEulerRotation)
QPhysicsCommandSetAngularVelocity(const QVector3D &inAngularVelocity)
~QPhysicsCommandSetAngularVelocity() override
QPhysicsCommandSetCCD(QDynamicRigidBody::CCDType ccdType, bool worldEnableCCD)
~QPhysicsCommandSetCCD() override
QPhysicsCommandSetDensity(float inDensity)
~QPhysicsCommandSetDensity() override
QPhysicsCommandSetGravityEnabled(bool inGravityEnabled)
~QPhysicsCommandSetGravityEnabled() override
~QPhysicsCommandSetIsKinematic() override
QPhysicsCommandSetIsKinematic(bool inIsKinematic, bool worldEnableCCD)
~QPhysicsCommandSetLinearVelocity() override
QPhysicsCommandSetLinearVelocity(const QVector3D &inLinearVelocity)
~QPhysicsCommandSetMassAndInertiaMatrix() override
QPhysicsCommandSetMassAndInertiaMatrix(float inMass, const QMatrix3x3 &inInertia)
QPhysicsCommandSetMassAndInertiaTensor(float inMass, const QVector3D &inInertia)
~QPhysicsCommandSetMassAndInertiaTensor() override
QPhysicsCommandSetMass(float inMass)
~QPhysicsCommandSetMass() override
virtual ~QPhysicsCommand()
static QT_BEGIN_NAMESPACE bool isKinematicBody(physx::PxRigidBody &body)
static void resolveCCDFlags(physx::PxRigidBody &body, QDynamicRigidBody::CCDType ccd, bool isKinematic, bool worldEnableCCD)