|
@@ -53,13 +53,23 @@ void VehicleConstraintTest::Initialize()
|
|
vehicle.mMaxPitchRollAngle = sMaxRollAngle;
|
|
vehicle.mMaxPitchRollAngle = sMaxRollAngle;
|
|
|
|
|
|
// Suspension direction
|
|
// Suspension direction
|
|
- Vec3 front_dir = Vec3(Tan(sFrontSuspensionKinPinAngle), -1, Tan(sFrontSuspensionCasterAngle)).Normalized();
|
|
|
|
- Vec3 rear_dir = Vec3(Tan(sRearSuspensionKingPinAngle), -1, Tan(sRearSuspensionCasterAngle)).Normalized();
|
|
|
|
-
|
|
|
|
- // Wheels
|
|
|
|
|
|
+ Vec3 front_suspension_dir = Vec3(Tan(sFrontSuspensionSidewaysAngle), -1, Tan(sFrontSuspensionForwardAngle)).Normalized();
|
|
|
|
+ Vec3 front_steering_axis = Vec3(-Tan(sFrontKingPinAngle), 1, -Tan(sFrontCasterAngle)).Normalized();
|
|
|
|
+ Vec3 front_wheel_up = Vec3(Sin(sFrontCamber), Cos(sFrontCamber), 0);
|
|
|
|
+ Vec3 front_wheel_forward = Vec3(-Sin(sFrontToe), 0, Cos(sFrontToe));
|
|
|
|
+ Vec3 rear_suspension_dir = Vec3(Tan(sRearSuspensionSidewaysAngle), -1, Tan(sRearSuspensionForwardAngle)).Normalized();
|
|
|
|
+ Vec3 rear_steering_axis = Vec3(-Tan(sRearKingPinAngle), 1, -Tan(sRearCasterAngle)).Normalized();
|
|
|
|
+ Vec3 rear_wheel_up = Vec3(Sin(sRearCamber), Cos(sRearCamber), 0);
|
|
|
|
+ Vec3 rear_wheel_forward = Vec3(-Sin(sRearToe), 0, Cos(sRearToe));
|
|
|
|
+ Vec3 flip_x(-1, 1, 1);
|
|
|
|
+
|
|
|
|
+ // Wheels, left front
|
|
WheelSettingsWV *w1 = new WheelSettingsWV;
|
|
WheelSettingsWV *w1 = new WheelSettingsWV;
|
|
w1->mPosition = Vec3(half_vehicle_width, -0.9f * half_vehicle_height, half_vehicle_length - 2.0f * wheel_radius);
|
|
w1->mPosition = Vec3(half_vehicle_width, -0.9f * half_vehicle_height, half_vehicle_length - 2.0f * wheel_radius);
|
|
- w1->mDirection = front_dir;
|
|
|
|
|
|
+ w1->mSuspensionDirection = front_suspension_dir;
|
|
|
|
+ w1->mSteeringAxis = front_steering_axis;
|
|
|
|
+ w1->mWheelUp = front_wheel_up;
|
|
|
|
+ w1->mWheelForward = front_wheel_forward;
|
|
w1->mSuspensionMinLength = sFrontSuspensionMinLength;
|
|
w1->mSuspensionMinLength = sFrontSuspensionMinLength;
|
|
w1->mSuspensionMaxLength = sFrontSuspensionMaxLength;
|
|
w1->mSuspensionMaxLength = sFrontSuspensionMaxLength;
|
|
w1->mSuspensionFrequency = sFrontSuspensionFrequency;
|
|
w1->mSuspensionFrequency = sFrontSuspensionFrequency;
|
|
@@ -67,9 +77,13 @@ void VehicleConstraintTest::Initialize()
|
|
w1->mMaxSteerAngle = sMaxSteeringAngle;
|
|
w1->mMaxSteerAngle = sMaxSteeringAngle;
|
|
w1->mMaxHandBrakeTorque = 0.0f; // Front wheel doesn't have hand brake
|
|
w1->mMaxHandBrakeTorque = 0.0f; // Front wheel doesn't have hand brake
|
|
|
|
|
|
|
|
+ // Right front
|
|
WheelSettingsWV *w2 = new WheelSettingsWV;
|
|
WheelSettingsWV *w2 = new WheelSettingsWV;
|
|
w2->mPosition = Vec3(-half_vehicle_width, -0.9f * half_vehicle_height, half_vehicle_length - 2.0f * wheel_radius);
|
|
w2->mPosition = Vec3(-half_vehicle_width, -0.9f * half_vehicle_height, half_vehicle_length - 2.0f * wheel_radius);
|
|
- w2->mDirection = Vec3(-1, 1, 1) * front_dir;
|
|
|
|
|
|
+ w2->mSuspensionDirection = flip_x * front_suspension_dir;
|
|
|
|
+ w2->mSteeringAxis = flip_x * front_steering_axis;
|
|
|
|
+ w2->mWheelUp = flip_x * front_wheel_up;
|
|
|
|
+ w2->mWheelForward = flip_x * front_wheel_forward;
|
|
w2->mSuspensionMinLength = sFrontSuspensionMinLength;
|
|
w2->mSuspensionMinLength = sFrontSuspensionMinLength;
|
|
w2->mSuspensionMaxLength = sFrontSuspensionMaxLength;
|
|
w2->mSuspensionMaxLength = sFrontSuspensionMaxLength;
|
|
w2->mSuspensionFrequency = sFrontSuspensionFrequency;
|
|
w2->mSuspensionFrequency = sFrontSuspensionFrequency;
|
|
@@ -77,18 +91,26 @@ void VehicleConstraintTest::Initialize()
|
|
w2->mMaxSteerAngle = sMaxSteeringAngle;
|
|
w2->mMaxSteerAngle = sMaxSteeringAngle;
|
|
w2->mMaxHandBrakeTorque = 0.0f; // Front wheel doesn't have hand brake
|
|
w2->mMaxHandBrakeTorque = 0.0f; // Front wheel doesn't have hand brake
|
|
|
|
|
|
|
|
+ // Left rear
|
|
WheelSettingsWV *w3 = new WheelSettingsWV;
|
|
WheelSettingsWV *w3 = new WheelSettingsWV;
|
|
w3->mPosition = Vec3(half_vehicle_width, -0.9f * half_vehicle_height, -half_vehicle_length + 2.0f * wheel_radius);
|
|
w3->mPosition = Vec3(half_vehicle_width, -0.9f * half_vehicle_height, -half_vehicle_length + 2.0f * wheel_radius);
|
|
- w3->mDirection = rear_dir;
|
|
|
|
|
|
+ w3->mSuspensionDirection = rear_suspension_dir;
|
|
|
|
+ w3->mSteeringAxis = rear_steering_axis;
|
|
|
|
+ w3->mWheelUp = rear_wheel_up;
|
|
|
|
+ w3->mWheelForward = rear_wheel_forward;
|
|
w3->mSuspensionMinLength = sRearSuspensionMinLength;
|
|
w3->mSuspensionMinLength = sRearSuspensionMinLength;
|
|
w3->mSuspensionMaxLength = sRearSuspensionMaxLength;
|
|
w3->mSuspensionMaxLength = sRearSuspensionMaxLength;
|
|
w3->mSuspensionFrequency = sRearSuspensionFrequency;
|
|
w3->mSuspensionFrequency = sRearSuspensionFrequency;
|
|
w3->mSuspensionDamping = sRearSuspensionDamping;
|
|
w3->mSuspensionDamping = sRearSuspensionDamping;
|
|
w3->mMaxSteerAngle = 0.0f;
|
|
w3->mMaxSteerAngle = 0.0f;
|
|
|
|
|
|
|
|
+ // Right rear
|
|
WheelSettingsWV *w4 = new WheelSettingsWV;
|
|
WheelSettingsWV *w4 = new WheelSettingsWV;
|
|
w4->mPosition = Vec3(-half_vehicle_width, -0.9f * half_vehicle_height, -half_vehicle_length + 2.0f * wheel_radius);
|
|
w4->mPosition = Vec3(-half_vehicle_width, -0.9f * half_vehicle_height, -half_vehicle_length + 2.0f * wheel_radius);
|
|
- w4->mDirection = Vec3(-1, 1, 1) * rear_dir;
|
|
|
|
|
|
+ w4->mSuspensionDirection = flip_x * rear_suspension_dir;
|
|
|
|
+ w4->mSteeringAxis = flip_x * rear_steering_axis;
|
|
|
|
+ w4->mWheelUp = flip_x * rear_wheel_up;
|
|
|
|
+ w4->mWheelForward = flip_x * rear_wheel_forward;
|
|
w4->mSuspensionMinLength = sRearSuspensionMinLength;
|
|
w4->mSuspensionMinLength = sRearSuspensionMinLength;
|
|
w4->mSuspensionMaxLength = sRearSuspensionMaxLength;
|
|
w4->mSuspensionMaxLength = sRearSuspensionMaxLength;
|
|
w4->mSuspensionFrequency = sRearSuspensionFrequency;
|
|
w4->mSuspensionFrequency = sRearSuspensionFrequency;
|
|
@@ -234,23 +256,31 @@ void VehicleConstraintTest::CreateSettingsMenu(DebugUI *inUI, UIElement *inSubMe
|
|
{
|
|
{
|
|
VehicleTest::CreateSettingsMenu(inUI, inSubMenu);
|
|
VehicleTest::CreateSettingsMenu(inUI, inSubMenu);
|
|
|
|
|
|
- inUI->CreateSlider(inSubMenu, "Initial Roll Angle", RadiansToDegrees(sInitialRollAngle), 0.0f, 90.0f, 0.1f, [](float inValue) { sInitialRollAngle = DegreesToRadians(inValue); });
|
|
|
|
- inUI->CreateSlider(inSubMenu, "Max Roll Angle", RadiansToDegrees(sMaxRollAngle), 0.0f, 90.0f, 0.1f, [](float inValue) { sMaxRollAngle = DegreesToRadians(inValue); });
|
|
|
|
- inUI->CreateSlider(inSubMenu, "Max Steering Angle", RadiansToDegrees(sMaxSteeringAngle), 0.0f, 90.0f, 0.1f, [](float inValue) { sMaxSteeringAngle = DegreesToRadians(inValue); });
|
|
|
|
|
|
+ inUI->CreateSlider(inSubMenu, "Initial Roll Angle", RadiansToDegrees(sInitialRollAngle), 0.0f, 90.0f, 1.0f, [](float inValue) { sInitialRollAngle = DegreesToRadians(inValue); });
|
|
|
|
+ inUI->CreateSlider(inSubMenu, "Max Roll Angle", RadiansToDegrees(sMaxRollAngle), 0.0f, 90.0f, 1.0f, [](float inValue) { sMaxRollAngle = DegreesToRadians(inValue); });
|
|
|
|
+ inUI->CreateSlider(inSubMenu, "Max Steering Angle", RadiansToDegrees(sMaxSteeringAngle), 0.0f, 90.0f, 1.0f, [](float inValue) { sMaxSteeringAngle = DegreesToRadians(inValue); });
|
|
inUI->CreateComboBox(inSubMenu, "Collision Mode", { "Ray", "Cast Sphere", "Cast Cylinder" }, sCollisionMode, [](int inItem) { sCollisionMode = inItem; });
|
|
inUI->CreateComboBox(inSubMenu, "Collision Mode", { "Ray", "Cast Sphere", "Cast Cylinder" }, sCollisionMode, [](int inItem) { sCollisionMode = inItem; });
|
|
inUI->CreateCheckBox(inSubMenu, "4 Wheel Drive", sFourWheelDrive, [](UICheckBox::EState inState) { sFourWheelDrive = inState == UICheckBox::STATE_CHECKED; });
|
|
inUI->CreateCheckBox(inSubMenu, "4 Wheel Drive", sFourWheelDrive, [](UICheckBox::EState inState) { sFourWheelDrive = inState == UICheckBox::STATE_CHECKED; });
|
|
inUI->CreateCheckBox(inSubMenu, "Anti Rollbars", sAntiRollbar, [](UICheckBox::EState inState) { sAntiRollbar = inState == UICheckBox::STATE_CHECKED; });
|
|
inUI->CreateCheckBox(inSubMenu, "Anti Rollbars", sAntiRollbar, [](UICheckBox::EState inState) { sAntiRollbar = inState == UICheckBox::STATE_CHECKED; });
|
|
inUI->CreateCheckBox(inSubMenu, "Limited Slip Differentials", sLimitedSlipDifferentials, [](UICheckBox::EState inState) { sLimitedSlipDifferentials = inState == UICheckBox::STATE_CHECKED; });
|
|
inUI->CreateCheckBox(inSubMenu, "Limited Slip Differentials", sLimitedSlipDifferentials, [](UICheckBox::EState inState) { sLimitedSlipDifferentials = inState == UICheckBox::STATE_CHECKED; });
|
|
inUI->CreateSlider(inSubMenu, "Max Engine Torque", float(sMaxEngineTorque), 100.0f, 2000.0f, 10.0f, [](float inValue) { sMaxEngineTorque = inValue; });
|
|
inUI->CreateSlider(inSubMenu, "Max Engine Torque", float(sMaxEngineTorque), 100.0f, 2000.0f, 10.0f, [](float inValue) { sMaxEngineTorque = inValue; });
|
|
inUI->CreateSlider(inSubMenu, "Clutch Strength", float(sClutchStrength), 1.0f, 40.0f, 1.0f, [](float inValue) { sClutchStrength = inValue; });
|
|
inUI->CreateSlider(inSubMenu, "Clutch Strength", float(sClutchStrength), 1.0f, 40.0f, 1.0f, [](float inValue) { sClutchStrength = inValue; });
|
|
- inUI->CreateSlider(inSubMenu, "Front Suspension Caster Angle", RadiansToDegrees(sFrontSuspensionCasterAngle), -89.0f, 89.0f, 1.0f, [](float inValue) { sFrontSuspensionCasterAngle = DegreesToRadians(inValue); });
|
|
|
|
- inUI->CreateSlider(inSubMenu, "Front Suspension King Pin Angle", RadiansToDegrees(sFrontSuspensionKinPinAngle), -89.0f, 89.0f, 1.0f, [](float inValue) { sFrontSuspensionKinPinAngle = DegreesToRadians(inValue); });
|
|
|
|
|
|
+ inUI->CreateSlider(inSubMenu, "Front Caster Angle", RadiansToDegrees(sFrontCasterAngle), -89.0f, 89.0f, 1.0f, [](float inValue) { sFrontCasterAngle = DegreesToRadians(inValue); });
|
|
|
|
+ inUI->CreateSlider(inSubMenu, "Front King Pin Angle", RadiansToDegrees(sFrontKingPinAngle), -89.0f, 89.0f, 1.0f, [](float inValue) { sFrontKingPinAngle = DegreesToRadians(inValue); });
|
|
|
|
+ inUI->CreateSlider(inSubMenu, "Front Camber", RadiansToDegrees(sFrontCamber), -89.0f, 89.0f, 1.0f, [](float inValue) { sFrontCamber = DegreesToRadians(inValue); });
|
|
|
|
+ inUI->CreateSlider(inSubMenu, "Front Toe", RadiansToDegrees(sFrontToe), -89.0f, 89.0f, 1.0f, [](float inValue) { sFrontToe = DegreesToRadians(inValue); });
|
|
|
|
+ inUI->CreateSlider(inSubMenu, "Front Suspension Forward Angle", RadiansToDegrees(sFrontSuspensionForwardAngle), -89.0f, 89.0f, 1.0f, [](float inValue) { sFrontSuspensionForwardAngle = DegreesToRadians(inValue); });
|
|
|
|
+ inUI->CreateSlider(inSubMenu, "Front Suspension Sideways Angle", RadiansToDegrees(sFrontSuspensionSidewaysAngle), -89.0f, 89.0f, 1.0f, [](float inValue) { sFrontSuspensionSidewaysAngle = DegreesToRadians(inValue); });
|
|
inUI->CreateSlider(inSubMenu, "Front Suspension Min Length", sFrontSuspensionMinLength, 0.0f, 3.0f, 0.01f, [](float inValue) { sFrontSuspensionMinLength = inValue; });
|
|
inUI->CreateSlider(inSubMenu, "Front Suspension Min Length", sFrontSuspensionMinLength, 0.0f, 3.0f, 0.01f, [](float inValue) { sFrontSuspensionMinLength = inValue; });
|
|
inUI->CreateSlider(inSubMenu, "Front Suspension Max Length", sFrontSuspensionMaxLength, 0.0f, 3.0f, 0.01f, [](float inValue) { sFrontSuspensionMaxLength = inValue; });
|
|
inUI->CreateSlider(inSubMenu, "Front Suspension Max Length", sFrontSuspensionMaxLength, 0.0f, 3.0f, 0.01f, [](float inValue) { sFrontSuspensionMaxLength = inValue; });
|
|
inUI->CreateSlider(inSubMenu, "Front Suspension Frequency", sFrontSuspensionFrequency, 0.1f, 5.0f, 0.01f, [](float inValue) { sFrontSuspensionFrequency = inValue; });
|
|
inUI->CreateSlider(inSubMenu, "Front Suspension Frequency", sFrontSuspensionFrequency, 0.1f, 5.0f, 0.01f, [](float inValue) { sFrontSuspensionFrequency = inValue; });
|
|
inUI->CreateSlider(inSubMenu, "Front Suspension Damping", sFrontSuspensionDamping, 0.0f, 2.0f, 0.01f, [](float inValue) { sFrontSuspensionDamping = inValue; });
|
|
inUI->CreateSlider(inSubMenu, "Front Suspension Damping", sFrontSuspensionDamping, 0.0f, 2.0f, 0.01f, [](float inValue) { sFrontSuspensionDamping = inValue; });
|
|
- inUI->CreateSlider(inSubMenu, "Rear Suspension Caster Angle", RadiansToDegrees(sRearSuspensionCasterAngle), -89.0f, 89.0f, 1.0f, [](float inValue) { sRearSuspensionCasterAngle = DegreesToRadians(inValue); });
|
|
|
|
- inUI->CreateSlider(inSubMenu, "Rear Suspension King Pin Angle", RadiansToDegrees(sRearSuspensionKingPinAngle), -89.0f, 89.0f, 1.0f, [](float inValue) { sRearSuspensionKingPinAngle = DegreesToRadians(inValue); });
|
|
|
|
|
|
+ inUI->CreateSlider(inSubMenu, "Rear Caster Angle", RadiansToDegrees(sRearCasterAngle), -89.0f, 89.0f, 1.0f, [](float inValue) { sRearCasterAngle = DegreesToRadians(inValue); });
|
|
|
|
+ inUI->CreateSlider(inSubMenu, "Rear King Pin Angle", RadiansToDegrees(sRearKingPinAngle), -89.0f, 89.0f, 1.0f, [](float inValue) { sRearKingPinAngle = DegreesToRadians(inValue); });
|
|
|
|
+ inUI->CreateSlider(inSubMenu, "Rear Camber", RadiansToDegrees(sRearCamber), -89.0f, 89.0f, 1.0f, [](float inValue) { sRearCamber = DegreesToRadians(inValue); });
|
|
|
|
+ inUI->CreateSlider(inSubMenu, "Rear Toe", RadiansToDegrees(sRearToe), -89.0f, 89.0f, 1.0f, [](float inValue) { sRearToe = DegreesToRadians(inValue); });
|
|
|
|
+ inUI->CreateSlider(inSubMenu, "Rear Suspension Forward Angle", RadiansToDegrees(sRearSuspensionForwardAngle), -89.0f, 89.0f, 1.0f, [](float inValue) { sRearSuspensionForwardAngle = DegreesToRadians(inValue); });
|
|
|
|
+ inUI->CreateSlider(inSubMenu, "Rear Suspension Sideways Angle", RadiansToDegrees(sRearSuspensionSidewaysAngle), -89.0f, 89.0f, 1.0f, [](float inValue) { sRearSuspensionSidewaysAngle = DegreesToRadians(inValue); });
|
|
inUI->CreateSlider(inSubMenu, "Rear Suspension Min Length", sRearSuspensionMinLength, 0.0f, 3.0f, 0.01f, [](float inValue) { sRearSuspensionMinLength = inValue; });
|
|
inUI->CreateSlider(inSubMenu, "Rear Suspension Min Length", sRearSuspensionMinLength, 0.0f, 3.0f, 0.01f, [](float inValue) { sRearSuspensionMinLength = inValue; });
|
|
inUI->CreateSlider(inSubMenu, "Rear Suspension Max Length", sRearSuspensionMaxLength, 0.0f, 3.0f, 0.01f, [](float inValue) { sRearSuspensionMaxLength = inValue; });
|
|
inUI->CreateSlider(inSubMenu, "Rear Suspension Max Length", sRearSuspensionMaxLength, 0.0f, 3.0f, 0.01f, [](float inValue) { sRearSuspensionMaxLength = inValue; });
|
|
inUI->CreateSlider(inSubMenu, "Rear Suspension Frequency", sRearSuspensionFrequency, 0.1f, 5.0f, 0.01f, [](float inValue) { sRearSuspensionFrequency = inValue; });
|
|
inUI->CreateSlider(inSubMenu, "Rear Suspension Frequency", sRearSuspensionFrequency, 0.1f, 5.0f, 0.01f, [](float inValue) { sRearSuspensionFrequency = inValue; });
|