PxJointLimit.h
Go to the documentation of this file.00001 // This code contains NVIDIA Confidential Information and is disclosed to you 00002 // under a form of NVIDIA software license agreement provided separately to you. 00003 // 00004 // Notice 00005 // NVIDIA Corporation and its licensors retain all intellectual property and 00006 // proprietary rights in and to this software and related documentation and 00007 // any modifications thereto. Any use, reproduction, disclosure, or 00008 // distribution of this software and related documentation without an express 00009 // license agreement from NVIDIA Corporation is strictly prohibited. 00010 // 00011 // ALL NVIDIA DESIGN SPECIFICATIONS, CODE ARE PROVIDED "AS IS.". NVIDIA MAKES 00012 // NO WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO 00013 // THE MATERIALS, AND EXPRESSLY DISCLAIMS ALL IMPLIED WARRANTIES OF NONINFRINGEMENT, 00014 // MERCHANTABILITY, AND FITNESS FOR A PARTICULAR PURPOSE. 00015 // 00016 // Information and code furnished is believed to be accurate and reliable. 00017 // However, NVIDIA Corporation assumes no responsibility for the consequences of use of such 00018 // information or for any infringement of patents or other rights of third parties that may 00019 // result from its use. No license is granted by implication or otherwise under any patent 00020 // or patent rights of NVIDIA Corporation. Details are subject to change without notice. 00021 // This code supersedes and replaces all information previously supplied. 00022 // NVIDIA Corporation products are not authorized for use as critical 00023 // components in life support devices or systems without express written approval of 00024 // NVIDIA Corporation. 00025 // 00026 // Copyright (c) 2008-2017 NVIDIA Corporation. All rights reserved. 00027 // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. 00028 // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. 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 //= ATTENTION! ===================================================================================== 00058 // Changing the data layout of this class breaks the binary serialization format. See comments for 00059 // PX_BINARY_SERIAL_VERSION. If a modification is required, please adjust the getBinaryMetaData 00060 // function. If the modification is made on a custom branch, please change PX_BINARY_SERIAL_VERSION 00061 // accordingly. 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 //= ATTENTION! ===================================================================================== 00166 // Changing the data layout of this class breaks the binary serialization format. See comments for 00167 // PX_BINARY_SERIAL_VERSION. If a modification is required, please adjust the getBinaryMetaData 00168 // function. If the modification is made on a custom branch, please change PX_BINARY_SERIAL_VERSION 00169 // accordingly. 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 //= ATTENTION! ===================================================================================== 00236 // Changing the data layout of this class breaks the binary serialization format. See comments for 00237 // PX_BINARY_SERIAL_VERSION. If a modification is required, please adjust the getBinaryMetaData 00238 // function. If the modification is made on a custom branch, please change PX_BINARY_SERIAL_VERSION 00239 // accordingly. 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 //= ATTENTION! ===================================================================================== 00310 // Changing the data layout of this class breaks the binary serialization format. See comments for 00311 // PX_BINARY_SERIAL_VERSION. If a modification is required, please adjust the getBinaryMetaData 00312 // function. If the modification is made on a custom branch, please change PX_BINARY_SERIAL_VERSION 00313 // accordingly. 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 //= ATTENTION! ===================================================================================== 00393 // Changing the data layout of this class breaks the binary serialization format. See comments for 00394 // PX_BINARY_SERIAL_VERSION. If a modification is required, please adjust the getBinaryMetaData 00395 // function. If the modification is made on a custom branch, please change PX_BINARY_SERIAL_VERSION 00396 // accordingly. 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 } // namespace physx 00472 #endif 00473 00475 #endif
Copyright © 2008-2017 NVIDIA Corporation, 2701 San Tomas Expressway, Santa Clara, CA 95050 U.S.A. All rights reserved. www.nvidia.com