diff --git a/src/GameWorld.cpp b/src/GameWorld.cpp index e9f5327..5cc997c 100755 --- a/src/GameWorld.cpp +++ b/src/GameWorld.cpp @@ -248,6 +248,7 @@ void GameWorld::Initialize() physics->Static = false; auto vehicle = AddComponent(tank, "Vehicle"); vehicle->MaxTorque = 5200.f; + vehicle->MaxSteeringAngle = 90.f; AddComponent(tank, "TankSteering"); AddComponent(tank, "Input"); @@ -445,7 +446,7 @@ void GameWorld::Initialize() Wheel->AxleID = 0; Wheel->Mass = 2000; Wheel->Radius = 0.6f; - Wheel->Steering = false; + Wheel->Steering = true; Wheel->SuspensionStrength = suspensionStrength; Wheel->Friction = 4.f; Wheel->ConnectedToHandbrake = true; diff --git a/src/Physics/VehicleSetup.cpp b/src/Physics/VehicleSetup.cpp index 90e65dc..7d3610a 100644 --- a/src/Physics/VehicleSetup.cpp +++ b/src/Physics/VehicleSetup.cpp @@ -22,7 +22,7 @@ void VehicleSetup::buildVehicle(World *world, const hkpWorld* physicsWorld, hkpV // vehicle.m_data = new hkpVehicleData; vehicle.m_driverInput = new hkpVehicleDefaultAnalogDriverInput; - vehicle.m_steering = new hkpVehicleDefaultSteering; + vehicle.m_steering = new TankSteering; vehicle.m_engine = new hkpVehicleDefaultEngine; vehicle.m_transmission = new hkpVehicleDefaultTransmission; vehicle.m_brake = new hkpVehicleDefaultBrake; diff --git a/src/Physics/VehicleSetup.h b/src/Physics/VehicleSetup.h index 7f78204..bf75840 100644 --- a/src/Physics/VehicleSetup.h +++ b/src/Physics/VehicleSetup.h @@ -33,6 +33,32 @@ #include "Components/Wheel.h" #include "Components/Transform.h" + +/// Tank specific steering implementation. Rear wheels steer in opposite direction +/// to front wheels. +class TankSteering: public hkpVehicleDefaultSteering +{ +public: + virtual void calcSteering(const hkReal deltaTime, const hkpVehicleInstance* vehicle, const hkpVehicleDriverInput::FilteredDriverInputOutput& filteredInfoOutput, SteeringAnglesOutput& steeringOutput ) + { + hkpVehicleDefaultSteering::calcMainSteeringAngle( deltaTime, vehicle, filteredInfoOutput, steeringOutput ); + + // Wheels. + for (int w_it = 0; w_it < m_doesWheelSteer.getSize(); w_it++) + { + if ( m_doesWheelSteer[w_it] ) + { + steeringOutput.m_wheelsSteeringAngle [w_it] = steeringOutput.m_mainSteeringAngle; + } + else + { + // Steer with front and back wheels to simulate a tank. + steeringOutput.m_wheelsSteeringAngle [w_it] = -steeringOutput.m_mainSteeringAngle; + } + } + } +}; + class VehicleSetup { public: