8#include "PxPhysicsAPI.h"
10#include <QtGui/qquaternion.h>
16 return static_cast<
bool>(body.getRigidBodyFlags() & physx::PxRigidBodyFlag::eKINEMATIC);
32 physx::PxRigidBody &body)
37 body.addForce(QPhysicsUtils::toPhysXType(force));
41 const QVector3D &inPosition)
50 physx::PxRigidBody &body)
55 physx::PxRigidBodyExt::addForceAtPos(body, QPhysicsUtils::toPhysXType(force),
56 QPhysicsUtils::toPhysXType(position));
68 physx::PxRigidBody &body)
73 body.addTorque(QPhysicsUtils::toPhysXType(torque));
85 physx::PxRigidBody &body)
90 body.addForce(QPhysicsUtils::toPhysXType(impulse), physx::PxForceMode::eIMPULSE);
94 const QVector3D &inPosition)
103 physx::PxRigidBody &body)
108 physx::PxRigidBodyExt::addForceAtPos(body, QPhysicsUtils::toPhysXType(impulse),
109 QPhysicsUtils::toPhysXType(position),
110 physx::PxForceMode::eIMPULSE);
122 physx::PxRigidBody &body)
128 body.addTorque(QPhysicsUtils::toPhysXType(impulse), physx::PxForceMode::eIMPULSE);
132 const QVector3D &inAngularVelocity)
141 physx::PxRigidBody &body)
144 body.setAngularVelocity(QPhysicsUtils::toPhysXType(angularVelocity));
148 const QVector3D &inLinearVelocity)
157 physx::PxRigidBody &body)
160 body.setLinearVelocity(QPhysicsUtils::toPhysXType(linearVelocity));
170 if (rigidBody.hasStaticShapes()) {
171 qWarning() <<
"Cannot set mass or density on a body containing trimesh/heightfield/plane, "
176 physx::PxRigidBodyExt::setMassAndUpdateInertia(body, mass);
180 physx::PxRigidBody &body)
182 if (rigidBody.hasStaticShapes()) {
183 qWarning() <<
"Cannot set mass or density on a body containing trimesh/heightfield/plane, "
189 body.setCMassLocalPose(
190 physx::PxTransform(QPhysicsUtils::toPhysXType(rigidBody.centerOfMassPosition()),
191 QPhysicsUtils::toPhysXType(rigidBody.centerOfMassRotation())));
192 body.setMassSpaceInertiaTensor(QPhysicsUtils::toPhysXType(inertia));
196 float inMass,
const QMatrix3x3 &inInertia)
205 physx::PxRigidBody &body)
207 if (rigidBody.hasStaticShapes()) {
208 qWarning() <<
"Cannot set mass or density on a body containing trimesh/heightfield/plane, "
213 physx::PxQuat massFrame;
214 physx::PxVec3 diagTensor = physx::PxDiagonalize(QPhysicsUtils::toPhysXType(inertia), massFrame);
215 if ((diagTensor.x <= 0.0f) || (diagTensor.y <= 0.0f) || (diagTensor.z <= 0.0f))
218 body.setCMassLocalPose(physx::PxTransform(
219 QPhysicsUtils::toPhysXType(rigidBody.centerOfMassPosition()), massFrame));
221 body.setMassSpaceInertiaTensor(diagTensor);
233 physx::PxRigidBody &body)
235 if (rigidBody.hasStaticShapes()) {
236 qWarning() <<
"Cannot set mass or density on a body containing trimesh/heightfield/plane, "
241 const float clampedDensity = qMax(0.0000001, density);
242 if (clampedDensity != density) {
243 qWarning() <<
"Clamping density " << density;
247 physx::PxRigidBodyExt::updateMassAndInertia(body, clampedDensity);
259 physx::PxRigidBody &body)
261 if (rigidBody.hasStaticShapes() && !isKinematic) {
262 qWarning() <<
"Cannot make a body containing trimesh/heightfield/plane non-kinematic, "
267 body.setRigidBodyFlag(physx::PxRigidBodyFlag::eKINEMATIC, isKinematic);
279 physx::PxRigidBody &body)
282 body.setActorFlag(physx::PxActorFlag::eDISABLE_GRAVITY, !gravityEnabled);
296 body.setLinearVelocity(physx::PxVec3(0, 0, 0));
297 body.setAngularVelocity(physx::PxVec3(0, 0, 0));
299 auto *parentNode = rigidBody.parentNode();
300 QVector3D scenePosition = parentNode ? parentNode->mapPositionToScene(position) : position;
303 body.setGlobalPose(physx::PxTransform(
304 QPhysicsUtils::toPhysXType(scenePosition),
305 QPhysicsUtils::toPhysXType(QQuaternion::fromEulerAngles(eulerRotation))));
309 float inMass,
const QVector3D &inInertia)
QPhysicsCommandApplyCentralForce(const QVector3D &inForce)
void execute(const QDynamicRigidBody &rigidBody, physx::PxRigidBody &body) override
~QPhysicsCommandApplyCentralForce() override
QPhysicsCommandApplyCentralImpulse(const QVector3D &inImpulse)
~QPhysicsCommandApplyCentralImpulse() override
void execute(const QDynamicRigidBody &rigidBody, physx::PxRigidBody &body) override
QPhysicsCommandApplyForce(const QVector3D &inForce, const QVector3D &inPosition)
~QPhysicsCommandApplyForce() override
void execute(const QDynamicRigidBody &rigidBody, physx::PxRigidBody &body) override
void execute(const QDynamicRigidBody &rigidBody, physx::PxRigidBody &body) override
~QPhysicsCommandApplyImpulse() override
QPhysicsCommandApplyImpulse(const QVector3D &inImpulse, const QVector3D &inPosition)
~QPhysicsCommandApplyTorqueImpulse() override
QPhysicsCommandApplyTorqueImpulse(const QVector3D &inImpulse)
void execute(const QDynamicRigidBody &rigidBody, physx::PxRigidBody &body) override
void execute(const QDynamicRigidBody &rigidBody, physx::PxRigidBody &body) override
~QPhysicsCommandApplyTorque() override
QPhysicsCommandApplyTorque(const QVector3D &inTorque)
void execute(const QDynamicRigidBody &rigidBody, physx::PxRigidBody &body) override
~QPhysicsCommandReset() override
QPhysicsCommandReset(QVector3D inPosition, QVector3D inEulerRotation)
QPhysicsCommandSetAngularVelocity(const QVector3D &inAngularVelocity)
void execute(const QDynamicRigidBody &rigidBody, physx::PxRigidBody &body) override
~QPhysicsCommandSetAngularVelocity() override
QPhysicsCommandSetDensity(float inDensity)
~QPhysicsCommandSetDensity() override
void execute(const QDynamicRigidBody &rigidBody, physx::PxRigidBody &body) override
QPhysicsCommandSetGravityEnabled(bool inGravityEnabled)
~QPhysicsCommandSetGravityEnabled() override
void execute(const QDynamicRigidBody &rigidBody, physx::PxRigidBody &body) override
void execute(const QDynamicRigidBody &rigidBody, physx::PxRigidBody &body) override
~QPhysicsCommandSetIsKinematic() override
QPhysicsCommandSetIsKinematic(bool inIsKinematic)
void execute(const QDynamicRigidBody &rigidBody, physx::PxRigidBody &body) override
~QPhysicsCommandSetLinearVelocity() override
QPhysicsCommandSetLinearVelocity(const QVector3D &inLinearVelocity)
~QPhysicsCommandSetMassAndInertiaMatrix() override
QPhysicsCommandSetMassAndInertiaMatrix(float inMass, const QMatrix3x3 &inInertia)
void execute(const QDynamicRigidBody &rigidBody, physx::PxRigidBody &body) override
void execute(const QDynamicRigidBody &rigidBody, physx::PxRigidBody &body) override
QPhysicsCommandSetMassAndInertiaTensor(float inMass, const QVector3D &inInertia)
~QPhysicsCommandSetMassAndInertiaTensor() override
QPhysicsCommandSetMass(float inMass)
~QPhysicsCommandSetMass() override
void execute(const QDynamicRigidBody &rigidBody, physx::PxRigidBody &body) override
virtual ~QPhysicsCommand()
static QT_BEGIN_NAMESPACE bool isKinematicBody(physx::PxRigidBody &body)