00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #ifndef PX_PHYSICS_EXTENSIONS_RIGIDBODY_H
00032 #define PX_PHYSICS_EXTENSIONS_RIGIDBODY_H
00033
00037 #include "PxPhysXConfig.h"
00038 #include "PxRigidBody.h"
00039 #include "PxQueryReport.h"
00040 #include "PxQueryFiltering.h"
00041 #include "extensions/PxMassProperties.h"
00042
00043 #if !PX_DOXYGEN
00044 namespace physx
00045 {
00046 #endif
00047
00048 class PxScene;
00049 struct PxQueryCache;
00050 class PxShape;
00051
00058 class PxRigidBodyExt
00059 {
00060 public:
00094 static bool updateMassAndInertia(PxRigidBody& body, const PxReal* shapeDensities, PxU32 shapeDensityCount, const PxVec3* massLocalPose = NULL, bool includeNonSimShapes = false);
00095
00096
00110 static bool updateMassAndInertia(PxRigidBody& body, PxReal density, const PxVec3* massLocalPose = NULL, bool includeNonSimShapes = false);
00111
00112
00134 static bool setMassAndUpdateInertia(PxRigidBody& body, const PxReal* shapeMasses, PxU32 shapeMassCount, const PxVec3* massLocalPose = NULL, bool includeNonSimShapes = false);
00135
00136
00155 static bool setMassAndUpdateInertia(PxRigidBody& body, PxReal mass, const PxVec3* massLocalPose = NULL, bool includeNonSimShapes = false);
00156
00157
00167 static PxMassProperties computeMassPropertiesFromShapes(const PxShape* const* shapes, PxU32 shapeCount);
00168
00169
00196 static void addForceAtPos(PxRigidBody& body, const PxVec3& force, const PxVec3& pos, PxForceMode::Enum mode = PxForceMode::eFORCE, bool wakeup = true);
00197
00224 static void addForceAtLocalPos(PxRigidBody& body, const PxVec3& force, const PxVec3& pos, PxForceMode::Enum mode = PxForceMode::eFORCE, bool wakeup = true);
00225
00252 static void addLocalForceAtPos(PxRigidBody& body, const PxVec3& force, const PxVec3& pos, PxForceMode::Enum mode = PxForceMode::eFORCE, bool wakeup = true);
00253
00280 static void addLocalForceAtLocalPos(PxRigidBody& body, const PxVec3& force, const PxVec3& pos, PxForceMode::Enum mode = PxForceMode::eFORCE, bool wakeup = true);
00281
00292 static PxVec3 getVelocityAtPos(const PxRigidBody& body, const PxVec3& pos);
00293
00304 static PxVec3 getLocalVelocityAtLocalPos(const PxRigidBody& body, const PxVec3& pos);
00305
00316 static PxVec3 getVelocityAtOffset(const PxRigidBody& body, const PxVec3& pos);
00317
00318
00347 static bool linearSweepSingle(
00348 PxRigidBody& body, PxScene& scene, const PxVec3& unitDir, const PxReal distance,
00349 PxHitFlags outputFlags,
00350 PxSweepHit& closestHit, PxU32& shapeIndex,
00351 const PxQueryFilterData& filterData = PxQueryFilterData(),
00352 PxQueryFilterCallback* filterCall = NULL,
00353 const PxQueryCache* cache = NULL,
00354 const PxReal inflation=0.0f);
00355
00388 static PxU32 linearSweepMultiple(
00389 PxRigidBody& body, PxScene& scene, const PxVec3& unitDir, const PxReal distance,
00390 PxHitFlags outputFlags,
00391 PxSweepHit* touchHitBuffer, PxU32* touchHitShapeIndices, PxU32 touchHitBufferSize,
00392 PxSweepHit& block, PxI32& blockingShapeIndex, bool& overflow,
00393 const PxQueryFilterData& filterData = PxQueryFilterData(),
00394 PxQueryFilterCallback* filterCall = NULL,
00395 const PxQueryCache* cache = NULL, const PxReal inflation = 0.0f);
00396
00397
00413 static void computeVelocityDeltaFromImpulse(const PxRigidBody& body, const PxVec3& impulsiveForce, const PxVec3& impulsiveTorque, PxVec3& deltaLinearVelocity, PxVec3& deltaAngularVelocity);
00414
00432 static void computeVelocityDeltaFromImpulse(const PxRigidBody& body, const PxTransform& globalPose, const PxVec3& point, const PxVec3& impulse, const PxReal invMassScale,
00433 const PxReal invInertiaScale, PxVec3& deltaLinearVelocity, PxVec3& deltaAngularVelocity);
00434
00449 static void computeLinearAngularImpulse(const PxRigidBody& body, const PxTransform& globalPose, const PxVec3& point, const PxVec3& impulse, const PxReal invMassScale,
00450 const PxReal invInertiaScale, PxVec3& linearImpulse, PxVec3& angularImpulse);
00451
00452
00453 };
00454
00455 #if !PX_DOXYGEN
00456 }
00457 #endif
00458
00460 #endif