Add tire wheel tire friction scale parameter for Wheeled Vehicle
This commit is contained in:
@@ -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>
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user