9#include "PxPhysicsAPI.h"
11#include <QtGui/qquaternion.h>
17 return static_cast<
bool>(body.getRigidBodyFlags() & physx::PxRigidBodyFlag::eKINEMATIC);
33 physx::PxRigidBody &body)
38 body.addForce(QPhysicsUtils::toPhysXType(force));
42 const QVector3D &inPosition)
51 physx::PxRigidBody &body)
56 physx::PxRigidBodyExt::addForceAtPos(body, QPhysicsUtils::toPhysXType(force),
57 QPhysicsUtils::toPhysXType(position));
69 physx::PxRigidBody &body)
74 body.addTorque(QPhysicsUtils::toPhysXType(torque));
86 physx::PxRigidBody &body)
91 body.addForce(QPhysicsUtils::toPhysXType(impulse), physx::PxForceMode::eIMPULSE);
95 const QVector3D &inPosition)
104 physx::PxRigidBody &body)
109 physx::PxRigidBodyExt::addForceAtPos(body, QPhysicsUtils::toPhysXType(impulse),
110 QPhysicsUtils::toPhysXType(position),
111 physx::PxForceMode::eIMPULSE);
123 physx::PxRigidBody &body)
129 body.addTorque(QPhysicsUtils::toPhysXType(impulse), physx::PxForceMode::eIMPULSE);
133 const QVector3D &inAngularVelocity)
142 physx::PxRigidBody &body)
145 body.setAngularVelocity(QPhysicsUtils::toPhysXType(angularVelocity));
149 const QVector3D &inLinearVelocity)
158 physx::PxRigidBody &body)
161 body.setLinearVelocity(QPhysicsUtils::toPhysXType(linearVelocity));
171 if (rigidBody.hasStaticShapes()) {
172 qWarning() <<
"Cannot set mass or density on a body containing trimesh/heightfield/plane, "
177 physx::PxRigidBodyExt::setMassAndUpdateInertia(body, mass);
181 physx::PxRigidBody &body)
183 if (rigidBody.hasStaticShapes()) {
184 qWarning() <<
"Cannot set mass or density on a body containing trimesh/heightfield/plane, "
190 body.setCMassLocalPose(
191 physx::PxTransform(QPhysicsUtils::toPhysXType(rigidBody.centerOfMassPosition()),
192 QPhysicsUtils::toPhysXType(rigidBody.centerOfMassRotation())));
193 body.setMassSpaceInertiaTensor(QPhysicsUtils::toPhysXType(inertia));
197 float inMass,
const QMatrix3x3 &inInertia)
206 physx::PxRigidBody &body)
208 if (rigidBody.hasStaticShapes()) {
209 qWarning() <<
"Cannot set mass or density on a body containing trimesh/heightfield/plane, "
214 physx::PxQuat massFrame;
215 physx::PxVec3 diagTensor = physx::PxDiagonalize(QPhysicsUtils::toPhysXType(inertia), massFrame);
216 if ((diagTensor.x <= 0.0f) || (diagTensor.y <= 0.0f) || (diagTensor.z <= 0.0f))
219 body.setCMassLocalPose(physx::PxTransform(
220 QPhysicsUtils::toPhysXType(rigidBody.centerOfMassPosition()), massFrame));
222 body.setMassSpaceInertiaTensor(diagTensor);
234 physx::PxRigidBody &body)
236 if (rigidBody.hasStaticShapes()) {
237 qWarning() <<
"Cannot set mass or density on a body containing trimesh/heightfield/plane, "
242 const float clampedDensity = qMax(0.0000001, density);
243 if (clampedDensity != density) {
244 qWarning() <<
"Clamping density " << density;
248 physx::PxRigidBodyExt::updateMassAndInertia(body, clampedDensity);
260 physx::PxRigidBody &body)
262 if (rigidBody.hasStaticShapes() && !isKinematic) {
263 qWarning() <<
"Cannot make a body containing trimesh/heightfield/plane non-kinematic, "
268 body.setRigidBodyFlag(physx::PxRigidBodyFlag::eKINEMATIC, isKinematic);
280 physx::PxRigidBody &body)
283 body.setActorFlag(physx::PxActorFlag::eDISABLE_GRAVITY, !gravityEnabled);
297 body.setLinearVelocity(physx::PxVec3(0, 0, 0));
298 body.setAngularVelocity(physx::PxVec3(0, 0, 0));
300 auto *parentNode = rigidBody.parentNode();
301 QVector3D scenePosition = parentNode ? parentNode->mapPositionToScene(position) : position;
304 body.setGlobalPose(physx::PxTransform(
305 QPhysicsUtils::toPhysXType(scenePosition),
306 QPhysicsUtils::toPhysXType(QQuaternion::fromEulerAngles(eulerRotation))));
310 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()
Combined button and popup list for selecting options.
static QT_BEGIN_NAMESPACE bool isKinematicBody(physx::PxRigidBody &body)