| 1 | /* |
| 2 | * Copyright (c) 2008-2015, NVIDIA CORPORATION. All rights reserved. |
| 3 | * |
| 4 | * NVIDIA CORPORATION and its licensors retain all intellectual property |
| 5 | * and proprietary rights in and to this software, related documentation |
| 6 | * and any modifications thereto. Any use, reproduction, disclosure or |
| 7 | * distribution of this software and related documentation without an express |
| 8 | * license agreement from NVIDIA CORPORATION is strictly prohibited. |
| 9 | */ |
| 10 | // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. |
| 11 | // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. |
| 12 | |
| 13 | #ifndef PX_VEHICLE_UPDATE_H |
| 14 | #define PX_VEHICLE_UPDATE_H |
| 15 | /** \addtogroup vehicle |
| 16 | @{ |
| 17 | */ |
| 18 | |
| 19 | #include "vehicle/PxVehicleSDK.h" |
| 20 | #include "vehicle/PxVehicleTireFriction.h" |
| 21 | #include "foundation/PxSimpleTypes.h" |
| 22 | #include "foundation/PxMemory.h" |
| 23 | #include "foundation/PxTransform.h" |
| 24 | #include "PxBatchQueryDesc.h" |
| 25 | |
| 26 | #ifndef PX_DOXYGEN |
| 27 | namespace physx |
| 28 | { |
| 29 | #endif |
| 30 | |
| 31 | class PxBatchQuery; |
| 32 | class PxVehicleWheels; |
| 33 | class PxVehicleDrivableSurfaceToTireFrictionPairs; |
| 34 | class PxVehicleTelemetryData; |
| 35 | |
| 36 | /** |
| 37 | \brief Structure containing data describing the non-persistent state of each suspension/wheel/tire unit. |
| 38 | This structure is filled out in PxVehicleUpdates and PxVehicleUpdateSingleVehicleAndStoreTelemetryData |
| 39 | @see PxVehicleUpdates, PxVehicleUpdateSingleVehicleAndStoreTelemetryData |
| 40 | */ |
| 41 | struct PxWheelQueryResult |
| 42 | { |
| 43 | PxWheelQueryResult() |
| 44 | { |
| 45 | PxMemZero(this, sizeof(PxWheelQueryResult)); |
| 46 | isInAir=true; |
| 47 | tireSurfaceType = (PxU32)PxVehicleDrivableSurfaceType::eSURFACE_TYPE_UNKNOWN; |
| 48 | localPose = PxTransform(PxIdentity); |
| 49 | } |
| 50 | |
| 51 | /** |
| 52 | \brief Start point of suspension line raycast used in raycast completed immediately before PxVehicleUpdates. |
| 53 | \note If no raycast for the corresponding suspension was performed immediately prior to PxVehicleUpdates then (0,0,0) is stored. |
| 54 | @see PxVehicle4WSuspensionRaycasts |
| 55 | */ |
| 56 | PxVec3 suspLineStart; |
| 57 | |
| 58 | /** |
| 59 | \brief Directions of suspension line raycast used in raycast completed immediately before PxVehicleUpdates. |
| 60 | \note If no raycast for the corresponding suspension was performed immediately prior to PxVehicleUpdates then (0,0,0) is stored. |
| 61 | @see PxVehicle4WSuspensionRaycasts |
| 62 | */ |
| 63 | PxVec3 suspLineDir; |
| 64 | |
| 65 | /** |
| 66 | \brief Lengths of suspension line raycast used in raycast completed immediately before PxVehicleUpdates. |
| 67 | \note If no raycast for the corresponding suspension was performed immediately prior to PxVehicleUpdates then 0 is stored. |
| 68 | @see PxVehicle4WSuspensionRaycasts |
| 69 | */ |
| 70 | PxReal suspLineLength; |
| 71 | |
| 72 | /** |
| 73 | \brief If suspension travel limits forbid the wheel from touching the drivable surface then isInAir is true. |
| 74 | \note If the wheel can be placed on the contact plane of the most recent suspension line raycast then isInAir is false. |
| 75 | \note If no raycast for the corresponding suspension was performed immediately prior to PxVehicleUpdates then isInAir |
| 76 | is computed using the contact plane that was hit by the most recent suspension line raycast. |
| 77 | */ |
| 78 | bool isInAir; |
| 79 | |
| 80 | /** |
| 81 | \brief PxActor instance of the driving surface under the corresponding vehicle wheel. |
| 82 | \note If suspension travel limits forbid the wheel from touching the drivable surface then tireContactActor is NULL. |
| 83 | \note If no raycast for the corresponding suspension was performed immediately prior to PxVehicleUpdates then NULL is stored. |
| 84 | */ |
| 85 | PxActor* tireContactActor; |
| 86 | |
| 87 | /** |
| 88 | \brief PxShape instance of the driving surface under the corresponding vehicle wheel. |
| 89 | \note If suspension travel limits forbid the wheel from touching the drivable surface then tireContactShape is NULL. |
| 90 | \note If no raycast for the corresponding suspension was performed immediately prior to PxVehicleUpdates then NULL is stored. |
| 91 | */ |
| 92 | PxShape* tireContactShape; |
| 93 | |
| 94 | /** |
| 95 | \brief PxMaterial instance of the driving surface under the corresponding vehicle wheel. |
| 96 | \note If suspension travel limits forbid the wheel from touching the drivable surface then tireSurfaceMaterial is NULL. |
| 97 | \note If no raycast for the corresponding suspension was performed immediately prior to PxVehicleUpdates then NULL is stored. |
| 98 | */ |
| 99 | const PxMaterial* tireSurfaceMaterial; |
| 100 | |
| 101 | /** |
| 102 | \brief Surface type integer that corresponds to the mapping between tireSurfaceMaterial and integer as |
| 103 | described in PxVehicleDrivableSurfaceToTireFrictionPairs. |
| 104 | \note If suspension travel limits forbid the wheel from touching the drivable surface then tireSurfaceType is |
| 105 | PxVehicleDrivableSurfaceType::eSURFACE_TYPE_UNKNOWN. |
| 106 | \note If no raycast for the corresponding suspension was performed immediately prior to PxVehicleUpdates then |
| 107 | PxVehicleDrivableSurfaceType::eSURFACE_TYPE_UNKNOWN is stored. |
| 108 | @see PxVehicleDrivableSurfaceToTireFrictionPairs |
| 109 | */ |
| 110 | PxU32 tireSurfaceType; |
| 111 | |
| 112 | /** |
| 113 | \brief Point on the drivable surface hit by the most recent suspension raycast. |
| 114 | \note If suspension travel limits forbid the wheel from touching the drivable surface then the contact point is (0,0,0). |
| 115 | \note If no raycast for the corresponding suspension was performed immediately prior to PxVehicleUpdates then (0,0,0) is stored. |
| 116 | */ |
| 117 | PxVec3 tireContactPoint; |
| 118 | |
| 119 | /** |
| 120 | \brief Normal on the drivable surface at the hit point of the most recent suspension raycast. |
| 121 | \note If suspension travel limits forbid the wheel from touching the drivable surface then the contact normal is (0,0,0). |
| 122 | \note If no raycast for the corresponding suspension was performed immediately prior to PxVehicleUpdates then (0,0,0) is stored. |
| 123 | */ |
| 124 | PxVec3 tireContactNormal; |
| 125 | |
| 126 | /** |
| 127 | \brief Friction experienced by the tire for the combination of tire type and surface type after accounting |
| 128 | for the friction vs slip graph. |
| 129 | \note If suspension travel limits forbid the wheel from touching the drivable surface then the tire friction is 0. |
| 130 | \note If no raycast for the corresponding suspension was performed immediately prior to PxVehicleUpdates then the |
| 131 | stored tire friction is the value computed in PxVehicleUpdates that immediately followed the last raycast. |
| 132 | @see PxVehicleDrivableSurfaceToTireFrictionPairs, PxVehicleTireData |
| 133 | */ |
| 134 | PxReal tireFriction; |
| 135 | |
| 136 | /** |
| 137 | \brief Compression of the suspension spring. |
| 138 | \note If suspension travel limits forbid the wheel from touching the drivable surface then the jounce is -PxVehicleSuspensionData.mMaxDroop |
| 139 | The jounce can never exceed PxVehicleSuspensionData.mMaxCompression. Positive values result when the suspension is compressed from |
| 140 | the rest position, while negative values mean the suspension is elongated from the rest position. |
| 141 | \note If no raycast for the corresponding suspension was performed immediately prior to PxVehicleUpdates then the |
| 142 | suspension compression is computed using the contact plane that was hit by the most recent suspension line raycast. |
| 143 | */ |
| 144 | PxReal suspJounce; |
| 145 | |
| 146 | /** |
| 147 | \brief Magnitude of force applied by the suspension spring along the direction of suspension travel. |
| 148 | \note If suspension travel limits forbid the wheel from touching the drivable surface then the force is 0 |
| 149 | \note If no raycast for the corresponding suspension was performed immediately prior to PxVehicleUpdates then the |
| 150 | suspension spring force is computed using the contact plane that was hit by the most recent suspension line raycast. |
| 151 | @see PxVehicleWheelsSimData::getSuspTravelDirection |
| 152 | */ |
| 153 | PxReal suspSpringForce; |
| 154 | |
| 155 | /** |
| 156 | \brief Forward direction of the wheel/tire accounting for steer/toe/camber angle projected on to the contact plane of the drivable surface. |
| 157 | \note If suspension travel limits forbid the wheel from touching the drivable surface then tireLongitudinalDir is (0,0,0) |
| 158 | \note If no raycast for the corresponding suspension was performed immediately prior to PxVehicleUpdates then the |
| 159 | tire longitudinal direction is computed using the contact plane that was hit by the most recent suspension line raycast. |
| 160 | */ |
| 161 | PxVec3 tireLongitudinalDir; |
| 162 | |
| 163 | /** |
| 164 | \brief Lateral direction of the wheel/tire accounting for steer/toe/camber angle projected on to the contact plan of the drivable surface. |
| 165 | \note If suspension travel limits forbid the wheel from touching the drivable surface then tireLateralDir is (0,0,0) |
| 166 | \note If no raycast for the corresponding suspension was performed immediately prior to PxVehicleUpdates then the |
| 167 | tire lateral direction is computed using the contact plane that was hit by the most recent suspension line raycast. |
| 168 | */ |
| 169 | PxVec3 tireLateralDir; |
| 170 | |
| 171 | /** |
| 172 | \brief Longitudinal slip of the tire. |
| 173 | \note If suspension travel limits forbid the wheel from touching the drivable surface then longitudinalSlip is 0.0 |
| 174 | \note The longitudinal slip is approximately (w*r - vz) / PxAbs(vz) where w is the angular speed of the wheel, r is the radius of the wheel, and |
| 175 | vz component of rigid body velocity computed at the wheel base along the longitudinal direction of the tire. |
| 176 | \note If no raycast for the corresponding suspension was performed immediately prior to PxVehicleUpdates then the |
| 177 | tire longitudinal slip is computed using the contact plane that was hit by the most recent suspension line raycast. |
| 178 | */ |
| 179 | PxReal longitudinalSlip; |
| 180 | |
| 181 | /** |
| 182 | \brief Lateral slip of the tire. |
| 183 | \note If suspension travel limits forbid the wheel from touching the drivable surface then lateralSlip is 0.0 |
| 184 | \note The lateral slip angle is approximately PxAtan(vx / PxAbs(vz)) where vx and vz are the components of rigid body velocity at the wheel base |
| 185 | along the wheel's lateral and longitudinal directions, respectively. |
| 186 | \note If no raycast for the corresponding suspension was performed immediately prior to PxVehicleUpdates then the |
| 187 | tire lateral slip is computed using the contact plane that was hit by the most recent suspension line raycast. |
| 188 | */ |
| 189 | PxReal lateralSlip; |
| 190 | |
| 191 | /** |
| 192 | \brief Steer angle of the wheel about the "up" vector accounting for input steer and toe and, if applicable, Ackermann steer correction. |
| 193 | @see PxVehicleWheelData::mToeAngle |
| 194 | */ |
| 195 | PxReal steerAngle; |
| 196 | |
| 197 | /** |
| 198 | \brief Local pose of the wheel. |
| 199 | */ |
| 200 | PxTransform localPose; |
| 201 | }; |
| 202 | |
| 203 | struct PxVehicleWheelQueryResult |
| 204 | { |
| 205 | /** |
| 206 | \brief Pointer to an PxWheelQueryResult buffer of length nbWheelQueryResults |
| 207 | The wheelQueryResults buffer must persist until the end of PxVehicleUpdates |
| 208 | A NULL pointer is permitted. |
| 209 | The wheelQueryResults buffer is left unmodified in PxVehicleUpdates for vehicles with sleeping rigid bodies |
| 210 | whose control inputs indicate they should remain inert. |
| 211 | @see PxVehicleUpdates |
| 212 | */ |
| 213 | PxWheelQueryResult* wheelQueryResults; |
| 214 | |
| 215 | /** |
| 216 | \brief The length of the wheelQueryResults buffer. This value corresponds to the |
| 217 | number of wheels in the associated vehicle in PxVehicleUpdates. |
| 218 | */ |
| 219 | PxU32 nbWheelQueryResults; |
| 220 | }; |
| 221 | |
| 222 | /** |
| 223 | \brief Structure containing data that is computed for a wheel during concurrent calls to PxVehicleUpdates |
| 224 | but which cannot be safely concurrently applied. |
| 225 | |
| 226 | @see PxVehicleUpdates, PxVehiclePostUpdates, PxVehicleConcurrentUpdate |
| 227 | */ |
| 228 | struct PxVehicleWheelConcurrentUpdateData |
| 229 | { |
| 230 | friend class PxVehicleUpdate; |
| 231 | |
| 232 | PxVehicleWheelConcurrentUpdateData() |
| 233 | : localPose(PxTransform(PxIdentity)), |
| 234 | hitActor(NULL), |
| 235 | hitActorForce(PxVec3(0,0,0)), |
| 236 | hitActorForcePosition(PxVec3(0,0,0)) |
| 237 | { |
| 238 | } |
| 239 | |
| 240 | private: |
| 241 | |
| 242 | PxTransform localPose; |
| 243 | PxRigidDynamic* hitActor; |
| 244 | PxVec3 hitActorForce; |
| 245 | PxVec3 hitActorForcePosition; |
| 246 | }; |
| 247 | |
| 248 | /** |
| 249 | \brief Structure containing data that is computed for a vehicle and its wheels during concurrent calls to PxVehicleUpdates |
| 250 | but which cannot be safely concurrently applied. |
| 251 | |
| 252 | @see PxVehicleUpdates, PxVehiclePostUpdates, PxVehicleWheelConcurrentUpdateData |
| 253 | */ |
| 254 | |
| 255 | struct PxVehicleConcurrentUpdateData |
| 256 | { |
| 257 | friend class PxVehicleUpdate; |
| 258 | |
| 259 | PxVehicleConcurrentUpdateData() |
| 260 | : concurrentWheelUpdates(NULL), |
| 261 | nbConcurrentWheelUpdates(0), |
| 262 | linearMomentumChange(PxVec3(0,0,0)), |
| 263 | angularMomentumChange(PxVec3(0,0,0)), |
| 264 | staySleeping(false), |
| 265 | wakeup(false) |
| 266 | { |
| 267 | } |
| 268 | |
| 269 | /** |
| 270 | \brief Pointer to an PxVehicleWheelConcurrentUpdate buffer of length nbConcurrentWheelUpdates |
| 271 | The concurrentWheelUpdates buffer must persist until the end of PxVehiclePostUpdates |
| 272 | A NULL pointer is not permitted. |
| 273 | @see PxVehicleUpdates, PxVehiclePostUpdates |
| 274 | */ |
| 275 | PxVehicleWheelConcurrentUpdateData* concurrentWheelUpdates; |
| 276 | |
| 277 | /** |
| 278 | \brief The length of the concurrentWheelUpdates buffer. This value corresponds to the |
| 279 | number of wheels in the associated vehicle passed to PxVehicleUpdates. |
| 280 | */ |
| 281 | PxU32 nbConcurrentWheelUpdates; |
| 282 | |
| 283 | private: |
| 284 | |
| 285 | PxVec3 linearMomentumChange; |
| 286 | PxVec3 angularMomentumChange; |
| 287 | bool staySleeping; |
| 288 | bool wakeup; |
| 289 | }; |
| 290 | |
| 291 | /** |
| 292 | \brief Perform raycasts for all suspension lines for all vehicles. |
| 293 | |
| 294 | \param[in] batchQuery is a PxBatchQuery instance used to specify shader data and functions for the raycast scene queries. |
| 295 | |
| 296 | \param[in] nbVehicles is the number of vehicles in the vehicles array. |
| 297 | |
| 298 | \param[in] vehicles is an array of all vehicles that are to have a raycast issued from each wheel. |
| 299 | |
| 300 | \param[in] nbSceneQueryResults must be greater than or equal to the total number of wheels of all the vehicles in the vehicles array; that is, |
| 301 | sceneQueryResults must have dimensions large enough for one raycast hit result per wheel for all the vehicles in the vehicles array. |
| 302 | |
| 303 | \param[in] sceneQueryResults must persist without being overwritten until the end of the next PxVehicleUpdates call. |
| 304 | |
| 305 | \param[in] vehiclesToRaycast is an array of bools of length nbVehicles that is used to decide if raycasts will be performed for the corresponding vehicle |
| 306 | in the vehicles array. If vehiclesToRaycast[i] is true then suspension line raycasts will be performed for vehicles[i]. If vehiclesToRaycast[i] is |
| 307 | false then suspension line raycasts will not be performed for vehicles[i]. |
| 308 | |
| 309 | \note If vehiclesToRaycast is NULL then raycasts are performed for all vehicles in the vehicles array. |
| 310 | |
| 311 | \note If vehiclesToRaycast[i] is false then the vehicle stored in vehicles[i] will automatically use the raycast hit planes recorded by the most recent |
| 312 | suspension line raycasts for that vehicle. For vehicles far from the camera or not visible on the screen it can be |
| 313 | optimal to only perform suspension line raycasts every Nth update rather than every single update. The accuracy of the cached contact plane |
| 314 | naturally diminishes as N increase, meaning that wheels might start to hover or intersect the ground for large values of N or even with values close to 1 in |
| 315 | conjunction with large vehicle speeds and/or geometry that has low spatial coherence. |
| 316 | |
| 317 | \note Calling setToRestState invalidates any cached hit planes. Prior to calling PxVehicleUpdates each vehicle needs to perform suspension line raycasts |
| 318 | at least once after instantiation and at least once after calling setToRestState. |
| 319 | |
| 320 | \note Each raycast casts along the suspension travel direction from the position of the top of the wheel at maximum suspension compression |
| 321 | to the position of the base of the wheel at maximum droop. Raycasts that start inside a PxShape are subsequently ignored by the |
| 322 | corresponding vehicle. |
| 323 | |
| 324 | @see PxVehicleDrive4W::setToRestState, PxVehicleDriveNW::setToRestState, PxVehicleDriveTank::setToRestState, PxVehicleNoDrive::setToRestState |
| 325 | */ |
| 326 | void PxVehicleSuspensionRaycasts |
| 327 | (PxBatchQuery* batchQuery, const PxU32 nbVehicles, PxVehicleWheels** vehicles, const PxU32 nbSceneQueryResults, PxRaycastQueryResult* sceneQueryResults, const bool* vehiclesToRaycast = NULL); |
| 328 | |
| 329 | |
| 330 | /** |
| 331 | \brief Update an array of vehicles by either applying an acceleration to the rigid body actor associated with |
| 332 | each vehicle or by an immediate update of the velocity of the actor. |
| 333 | |
| 334 | \note The update mode (acceleration or velocity change) can be selected with PxVehicleSetUpdateMode. |
| 335 | |
| 336 | \param[in] timestep is the timestep of the update |
| 337 | |
| 338 | \param[in] gravity is the value of gravitational acceleration |
| 339 | |
| 340 | \param[in] vehicleDrivableSurfaceToTireFrictionPairs describes the mapping between each PxMaterial ptr and an integer representing a |
| 341 | surface type. It also stores the friction value for each combination of surface and tire type. |
| 342 | |
| 343 | \param[in] nbVehicles is the number of vehicles pointers in the vehicles array |
| 344 | |
| 345 | \param[in, out] vehicles is an array of length nbVehicles containing all vehicles to be updated by the specified timestep |
| 346 | |
| 347 | \param[out] vehicleWheelQueryResults is an array of length nbVehicles storing the wheel query results of each corresponding vehicle and wheel in the |
| 348 | vehicles array. A NULL pointer is permitted. |
| 349 | |
| 350 | \param[out] vehicleConcurrentUpdates is an array of length nbVehicles. It is only necessary to specify vehicleConcurrentUpdates if PxVehicleUpdates is |
| 351 | called concurrently. The element vehicleWheelQueryResults[i] of the array stores data that is computed for vehicle[i] during PxVehicleUpdates but which |
| 352 | cannot be safely written when concurrently called. The data computed and stored in vehicleConcurrentUpdates must be passed to PxVehiclePostUpdates, where |
| 353 | it is applied to all relevant actors in sequence. A NULL pointer is permitted. |
| 354 | |
| 355 | \note The vehicleWheelQueryResults buffer must persist until the end of PxVehicleUpdates. |
| 356 | |
| 357 | \note The vehicleWheelQueryResults buffer is left unmodified for vehicles with sleeping rigid bodies whose control inputs indicate they should remain inert. |
| 358 | |
| 359 | \note If PxVehicleUpdates is called concurrently then vehicleConcurrentUpdates must be specified. Do not specify vehicleConcurrentUpdates is PxVehicleUpdates |
| 360 | is not called concurrently. |
| 361 | |
| 362 | \note The vehicleConcurrentUpdates buffer must persist until the end of PxVehiclePostUpdate. |
| 363 | |
| 364 | \note If any vehicle has one or more disabled wheels (PxVehicleWheelsSimData::disableWheel) then the disabled wheels must not be associated |
| 365 | with a PxShape (PxVehicleWheelsSimData::setWheelShapeMapping); the differential of the vehicle must be configured so that no drive torque |
| 366 | is delivered to a disabled wheel; and the wheel must have zero rotation speed (PxVehicleWheelsDynData::setWheelRotationSpeed) |
| 367 | |
| 368 | \note PxVehicleUpdates may be called concurrently provided all concurrent calls to PxVehicleUpdates involve only vehicles in the scene specified by PxVehicleUpdateSetScene. |
| 369 | PxVehicleUpdates must never run concurrently with PxVehicleUpdateSingleVehicleAndStoreTelemetryData. |
| 370 | |
| 371 | @see PxVehicleSetUpdateMode, PxVehicleWheelsSimData::disableWheel, PxVehicleWheelsSimData::setWheelShapeMapping, PxVehicleWheelsDynData::setWheelRotationSpeed, |
| 372 | PxVehiclePostUpdates |
| 373 | */ |
| 374 | void PxVehicleUpdates( |
| 375 | const PxReal timestep, const PxVec3& gravity, |
| 376 | const PxVehicleDrivableSurfaceToTireFrictionPairs& vehicleDrivableSurfaceToTireFrictionPairs, |
| 377 | const PxU32 nbVehicles, PxVehicleWheels** vehicles, PxVehicleWheelQueryResult* vehicleWheelQueryResults, PxVehicleConcurrentUpdateData* vehicleConcurrentUpdates = NULL); |
| 378 | |
| 379 | |
| 380 | /** |
| 381 | \brief Apply actor changes that were computed in concurrent calls to PxVehicleUpdates but which could not be safely applied due to the concurrency. |
| 382 | |
| 383 | \param[in] vehicleConcurrentUpdates is an array of length nbVehicles where vehicleConcurrentUpdates[i] contains data describing actor changes that |
| 384 | were computed for vehicles[i] during concurrent calls to PxVehicleUpdates. |
| 385 | |
| 386 | \param[in] nbVehicles is the number of vehicles pointers in the vehicles array |
| 387 | |
| 388 | \param[in, out] vehicles is an array of length nbVehicles containing all vehicles that were partially updated in concurrent calls to PxVehicleUpdates. |
| 389 | |
| 390 | @see PxVehicleUpdates |
| 391 | */ |
| 392 | void PxVehiclePostUpdates( |
| 393 | const PxVehicleConcurrentUpdateData* vehicleConcurrentUpdates, const PxU32 nbVehicles, PxVehicleWheels** vehicles); |
| 394 | |
| 395 | |
| 396 | /** |
| 397 | \brief Shift the origin of vehicles by the specified vector. |
| 398 | |
| 399 | Call this method to adjust the internal data structures of vehicles to reflect the shifted origin location |
| 400 | (the shift vector will get subtracted from all world space spatial data). |
| 401 | |
| 402 | \note It is the user's responsibility to keep track of the summed total origin shift and adjust all input/output to/from PhysXVehicle accordingly. |
| 403 | |
| 404 | \note This call will not automatically shift the PhysX scene and its objects. You need to call PxScene::shiftOrigin() seperately to keep the systems in sync. |
| 405 | |
| 406 | \param[in] shift is the translation vector to shift the origin by. |
| 407 | |
| 408 | \param[in] nbVehicles is the number of vehicles in the vehicles array. |
| 409 | |
| 410 | \param[in, out] vehicles is an array of all vehicles that should be updated to map to the new scene origin. |
| 411 | */ |
| 412 | void PxVehicleShiftOrigin(const PxVec3& shift, const PxU32 nbVehicles, PxVehicleWheels** vehicles); |
| 413 | |
| 414 | #if PX_DEBUG_VEHICLE_ON |
| 415 | /** |
| 416 | \brief Update an single vehicle by either applying an acceleration to the rigid body actor associated with |
| 417 | each vehicle or by an immediate update of the velocity of the actor. Also record telemetry data from the |
| 418 | vehicle so that it may be visualized or queried. |
| 419 | |
| 420 | \note The update mode (acceleration or velocity change) can be selected with PxVehicleSetUpdateMode. |
| 421 | |
| 422 | \param[in] timestep is the timestep of the update |
| 423 | |
| 424 | \param[in] gravity is the value of gravitational acceleration |
| 425 | |
| 426 | \param[in] vehicleDrivableSurfaceToTireFrictionPairs describes the mapping between each PxMaterial ptr and an integer representing a |
| 427 | surface type. It also stores the friction value for each combination of surface and tire type. |
| 428 | |
| 429 | \param[in, out] focusVehicle is the vehicle to be updated and have its telemetry data recorded |
| 430 | |
| 431 | \param[out] vehicleWheelQueryResults is an array of length 1 storing the wheel query results of each wheel of the vehicle/ |
| 432 | A NULL pointer is permitted. |
| 433 | |
| 434 | \param[out] telemetryData is the data structure used to record telemetry data during the update for later query or visualization |
| 435 | |
| 436 | \note The vehicleWheelQueryResults buffer must persist until the end of PxVehicleUpdates |
| 437 | |
| 438 | \note The vehicleWheelQueryResults buffer is left unmodified for vehicles with sleeping rigid bodies whose control inputs indicate they should remain inert. |
| 439 | |
| 440 | \note PxVehicleUpdateSingleVehicleAndStoreTelemetryData is not thread-safe. As a consequence, it must run sequentially and never concurrently with PxVehicleUpdates |
| 441 | |
| 442 | @see PxVehicleSetUpdateMode, PxVehicleTelemetryData |
| 443 | */ |
| 444 | void PxVehicleUpdateSingleVehicleAndStoreTelemetryData |
| 445 | (const PxReal timestep, const PxVec3& gravity, |
| 446 | const PxVehicleDrivableSurfaceToTireFrictionPairs& vehicleDrivableSurfaceToTireFrictionPairs, |
| 447 | PxVehicleWheels* focusVehicle, PxVehicleWheelQueryResult* vehicleWheelQueryResults, |
| 448 | PxVehicleTelemetryData& telemetryData); |
| 449 | #endif |
| 450 | |
| 451 | #ifndef PX_DOXYGEN |
| 452 | } // namespace physx |
| 453 | #endif |
| 454 | |
| 455 | /** @} */ |
| 456 | #endif //PX_VEHICLE_UPDATE_H |
| 457 | |