Add tire wheel tire friction scale parameter for Wheeled Vehicle

This commit is contained in:
Wojtek Figat
2022-01-26 20:54:57 +01:00
parent ba2f58df6a
commit 05b80d17c5
2 changed files with 48 additions and 10 deletions

View File

@@ -245,6 +245,11 @@ DECLARE_SCENE_OBJECT(WheeledVehicle);
/// The tire longitudinal stiffness to have given longitudinal slip. /// The tire longitudinal stiffness to have given longitudinal slip.
/// </summary> /// </summary>
API_FIELD(Attributes="EditorDisplay(\"Tire\"), EditorOrder(32)") float TireLongitudinalStiffness = 1000.0f; API_FIELD(Attributes="EditorDisplay(\"Tire\"), EditorOrder(32)") float TireLongitudinalStiffness = 1000.0f;
/// <summary>
/// The tire friction scale (scales the drivable surface friction under the tire).
/// </summary>
API_FIELD(Attributes="EditorDisplay(\"Tire\"), EditorOrder(33)") float TireFrictionScale = 1.0f;
}; };
/// <summary> /// <summary>

View File

@@ -365,6 +365,8 @@ namespace
Array<PxWheelQueryResult> WheelVehiclesResultsPerWheel; Array<PxWheelQueryResult> WheelVehiclesResultsPerWheel;
Array<PxVehicleWheelQueryResult> WheelVehiclesResultsPerVehicle; Array<PxVehicleWheelQueryResult> WheelVehiclesResultsPerVehicle;
PxVehicleDrivableSurfaceToTireFrictionPairs* WheelTireFrictions = nullptr; PxVehicleDrivableSurfaceToTireFrictionPairs* WheelTireFrictions = nullptr;
bool WheelTireFrictionsDirty = false;
Array<float> WheelTireTypes;
#endif #endif
} }
@@ -503,6 +505,10 @@ void* PhysicalMaterial::GetPhysicsMaterial()
const PhysicsCombineMode useRestitutionCombineMode = OverrideRestitutionCombineMode ? RestitutionCombineMode : _restitutionCombineMode; const PhysicsCombineMode useRestitutionCombineMode = OverrideRestitutionCombineMode ? RestitutionCombineMode : _restitutionCombineMode;
material->setRestitutionCombineMode(static_cast<PxCombineMode::Enum>(useRestitutionCombineMode)); material->setRestitutionCombineMode(static_cast<PxCombineMode::Enum>(useRestitutionCombineMode));
#if WITH_VEHICLE
WheelTireFrictionsDirty = true;
#endif
} }
return _material; return _material;
} }
@@ -521,6 +527,10 @@ void PhysicalMaterial::UpdatePhysicsMaterial()
material->setRestitution(Restitution); material->setRestitution(Restitution);
const PhysicsCombineMode useRestitutionCombineMode = OverrideRestitutionCombineMode ? RestitutionCombineMode : _restitutionCombineMode; const PhysicsCombineMode useRestitutionCombineMode = OverrideRestitutionCombineMode ? RestitutionCombineMode : _restitutionCombineMode;
material->setRestitutionCombineMode(static_cast<PxCombineMode::Enum>(useRestitutionCombineMode)); material->setRestitutionCombineMode(static_cast<PxCombineMode::Enum>(useRestitutionCombineMode));
#if WITH_VEHICLE
WheelTireFrictionsDirty = true;
#endif
} }
} }
@@ -1097,16 +1107,31 @@ void PhysicsBackend::EndSimulateScene(void* scene)
scenePhysX->WheelRaycastBatchQuery = scenePhysX->Scene->createBatchQuery(desc); scenePhysX->WheelRaycastBatchQuery = scenePhysX->Scene->createBatchQuery(desc);
} }
// TODO: expose vehicle tires configuration // Update lookup table that maps wheel type into the surface friction
if (!WheelTireFrictions) if (!WheelTireFrictions || WheelTireFrictionsDirty)
{ {
PxVehicleDrivableSurfaceType surfaceTypes[1]; WheelTireFrictionsDirty = false;
surfaceTypes[0].mType = 0; RELEASE_PHYSX(WheelTireFrictions);
const PxMaterial* surfaceMaterials[1]; Array<PxMaterial*, InlinedAllocation<8>> materials;
surfaceMaterials[0] = DefaultMaterial; materials.Resize(Math::Min<int32>((int32)PhysX->getNbMaterials(), PxVehicleDrivableSurfaceToTireFrictionPairs::eMAX_NB_SURFACE_TYPES));
WheelTireFrictions = PxVehicleDrivableSurfaceToTireFrictionPairs::allocate(1, 1); PxMaterial** materialsPtr = materials.Get();
WheelTireFrictions->setup(1, 1, surfaceMaterials, surfaceTypes); PhysX->getMaterials(materialsPtr, materials.Count(), 0);
WheelTireFrictions->setTypePairFriction(0, 0, 5.0f); Array<PxVehicleDrivableSurfaceType, InlinedAllocation<8>> tireTypes;
tireTypes.Resize(materials.Count());
PxVehicleDrivableSurfaceType* tireTypesPtr = tireTypes.Get();
for (int32 i = 0; i < tireTypes.Count(); i++)
tireTypesPtr[i].mType = i;
WheelTireFrictions = PxVehicleDrivableSurfaceToTireFrictionPairs::allocate(WheelTireTypes.Count(), materials.Count());
WheelTireFrictions->setup(WheelTireTypes.Count(), materials.Count(), (const PxMaterial**)materialsPtr, tireTypesPtr);
for (int32 material = 0; material < materials.Count(); material++)
{
float friction = materialsPtr[material]->getStaticFriction();
for (int32 tireType = 0; tireType < WheelTireTypes.Count(); tireType++)
{
float scale = WheelTireTypes[tireType];
WheelTireFrictions->setTypePairFriction(material, tireType, friction * scale);
}
}
} }
// Setup cache for wheel states // Setup cache for wheel states
@@ -2522,7 +2547,15 @@ void* PhysicsBackend::CreateVehicle(WheeledVehicle* actor)
suspensionData.mSpringDamperRate = wheel.SuspensionDampingRate * 2.0f * Math::Sqrt(suspensionData.mSpringStrength * suspensionData.mSprungMass); suspensionData.mSpringDamperRate = wheel.SuspensionDampingRate * 2.0f * Math::Sqrt(suspensionData.mSpringStrength * suspensionData.mSprungMass);
PxVehicleTireData tire; PxVehicleTireData tire;
tire.mType = 0; int32 tireIndex = WheelTireTypes.Find(wheel.TireFrictionScale);
if (tireIndex == -1)
{
// New tire type
tireIndex = WheelTireTypes.Count();
WheelTireTypes.Add(wheel.TireFrictionScale);
WheelTireFrictionsDirty = true;
}
tire.mType = tireIndex;
tire.mLatStiffX = wheel.TireLateralMax; tire.mLatStiffX = wheel.TireLateralMax;
tire.mLatStiffY = wheel.TireLateralStiffness; tire.mLatStiffY = wheel.TireLateralStiffness;
tire.mLongitudinalStiffnessPerUnitGravity = wheel.TireLongitudinalStiffness; tire.mLongitudinalStiffnessPerUnitGravity = wheel.TireLongitudinalStiffness;