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_EXTENSIONS_JOINT_LIMIT
00032 #define PX_EXTENSIONS_JOINT_LIMIT
00033
00037 #include "foundation/PxMath.h"
00038 #include "PxPhysXConfig.h"
00039 #include "common/PxTolerancesScale.h"
00040 #include "PxJoint.h"
00041
00042 #if !PX_DOXYGEN
00043 namespace physx
00044 {
00045 #endif
00046
00055 class PxJointLimitParameters
00056 {
00057
00058
00059
00060
00061
00062
00063 public:
00083 PxReal restitution;
00084
00085
00090 PxReal bounceThreshold;
00097 PxReal stiffness;
00098
00105 PxReal damping;
00106
00123 PxReal contactDistance;
00124
00125
00126
00127 PxJointLimitParameters()
00128 : restitution(0)
00129 , bounceThreshold(0)
00130 , stiffness(0)
00131 , damping(0)
00132 , contactDistance(0)
00133 {
00134 }
00135
00141 PX_INLINE bool isValid() const
00142 {
00143 return PxIsFinite(restitution) && restitution >= 0 && restitution <= 1 &&
00144 PxIsFinite(stiffness) && stiffness >= 0 &&
00145 PxIsFinite(damping) && damping >= 0 &&
00146 PxIsFinite(bounceThreshold) && bounceThreshold >= 0 &&
00147 PxIsFinite(contactDistance) && contactDistance >= 0;
00148 }
00149
00150 PX_INLINE bool isSoft() const
00151 {
00152 return damping>0 || stiffness>0;
00153 }
00154
00155 protected:
00156 ~PxJointLimitParameters() {}
00157 };
00158
00159
00163 class PxJointLinearLimit : public PxJointLimitParameters
00164 {
00165
00166
00167
00168
00169
00170
00171 public:
00178 PxReal value;
00179
00190 PxJointLinearLimit(const PxTolerancesScale& scale, PxReal extent, PxReal contactDist = -1)
00191 : value(extent)
00192 {
00193 PxJointLimitParameters::contactDistance = contactDist == -1 ? 0.01f*scale.length : contactDist;
00194 }
00195
00196
00206 PxJointLinearLimit(PxReal extent, const PxSpring& spring)
00207 : value(extent)
00208 {
00209 stiffness = spring.stiffness;
00210 damping = spring.damping;
00211 }
00212
00213
00214
00220 PX_INLINE bool isValid() const
00221 {
00222 return PxJointLimitParameters::isValid() &&
00223 PxIsFinite(value) &&
00224 value > 0;
00225 }
00226 };
00227
00228
00233 class PxJointLinearLimitPair : public PxJointLimitParameters
00234 {
00235
00236
00237
00238
00239
00240
00241 public:
00250 PxReal upper, lower;
00251
00252
00264 PxJointLinearLimitPair(const PxTolerancesScale& scale, PxReal lowerLimit, PxReal upperLimit, PxReal contactDist = -1)
00265 : upper(upperLimit)
00266 , lower(lowerLimit)
00267 {
00268 PxJointLimitParameters::contactDistance = contactDist == -1 ? PxMin(scale.length * 0.01f, (upperLimit*0.49f-lowerLimit*0.49f)) : contactDist;
00269 bounceThreshold = 2*scale.length;
00270 }
00271
00272
00283 PxJointLinearLimitPair(PxReal lowerLimit, PxReal upperLimit, const PxSpring& spring)
00284 : upper(upperLimit)
00285 , lower(lowerLimit)
00286 {
00287 stiffness = spring.stiffness;
00288 damping = spring.damping;
00289 }
00290
00291
00297 PX_INLINE bool isValid() const
00298 {
00299 return PxJointLimitParameters::isValid() &&
00300 PxIsFinite(upper) && PxIsFinite(lower) && upper >= lower &&
00301 PxIsFinite(upper - lower) &&
00302 PxIsFinite(contactDistance) && contactDistance <= upper - lower;
00303 }
00304 };
00305
00306
00307 class PxJointAngularLimitPair : public PxJointLimitParameters
00308 {
00309
00310
00311
00312
00313
00314
00315 public:
00323 PxReal upper, lower;
00324
00325
00338 PxJointAngularLimitPair(PxReal lowerLimit, PxReal upperLimit, PxReal contactDist = -1)
00339 : upper(upperLimit)
00340 , lower(lowerLimit)
00341 {
00342 PxJointLimitParameters::contactDistance = contactDist ==-1 ? PxMin(0.1f, 0.49f*(upperLimit-lowerLimit)) : contactDist;
00343 bounceThreshold = 0.5f;
00344 }
00345
00346
00359 PxJointAngularLimitPair(PxReal lowerLimit, PxReal upperLimit, const PxSpring& spring)
00360 : upper(upperLimit)
00361 , lower(lowerLimit)
00362 {
00363 stiffness = spring.stiffness;
00364 damping = spring.damping;
00365 }
00366
00367
00373 PX_INLINE bool isValid() const
00374 {
00375 return PxJointLimitParameters::isValid() &&
00376 PxIsFinite(upper) && PxIsFinite(lower) && upper >= lower &&
00377 PxIsFinite(contactDistance) && contactDistance <= upper - lower;
00378 }
00379 };
00380
00381
00382
00390 class PxJointLimitCone : public PxJointLimitParameters
00391 {
00392
00393
00394
00395
00396
00397
00398 public:
00406 PxReal yAngle;
00407
00408
00416 PxReal zAngle;
00417
00428 PxJointLimitCone(PxReal yLimitAngle, PxReal zLimitAngle, PxReal contactDist = -1):
00429 yAngle(yLimitAngle),
00430 zAngle(zLimitAngle)
00431 {
00432 PxJointLimitParameters::contactDistance = contactDist == -1 ? PxMin(0.1f, PxMin(yLimitAngle, zLimitAngle)*0.49f) : contactDist;
00433 bounceThreshold = 0.5f;
00434 }
00435
00436
00437
00448 PxJointLimitCone(PxReal yLimitAngle, PxReal zLimitAngle, const PxSpring& spring):
00449 yAngle(yLimitAngle),
00450 zAngle(zLimitAngle)
00451 {
00452 stiffness = spring.stiffness;
00453 damping = spring.damping;
00454 }
00455
00456
00462 PX_INLINE bool isValid() const
00463 {
00464 return PxJointLimitParameters::isValid() &&
00465 PxIsFinite(yAngle) && yAngle>0 && yAngle<PxPi &&
00466 PxIsFinite(zAngle) && zAngle>0 && zAngle<PxPi;
00467 }
00468 };
00469
00470 #if !PX_DOXYGEN
00471 }
00472 #endif
00473
00475 #endif