Usage
- Code: Select all
NewtonBody* newtonbody = ???
NewtonVehicle* vehicle = new Vehicle(newtonbody);
vehicle->AddTire(-2, 0, 2, 1, 1, 1, true);
vehicle->AddTire(2, 0, 2, 1, 1, 1, true);
vehicle->AddTire(-2, 0, -2, 1, 1, 1, false);
vehicle->AddTire(2, 0, -2, 1, 1, 1, false);
vehicle->AddAxle(0, 1);
vehicle->AddAxle(2, 3);
vehicle->Build()
NewtonVehicle.h
- Code: Select all
#include "Leadwerks.h"
class NewtonVehicle
{
CustomVehicleControllerManager* manager;
CustomVehicleController* vehicle;
std::vector<CustomVehicleControllerBodyStateTire*> tire;
CustomVehicleControllerComponentSteering* steering;
CustomVehicleControllerComponentBrake* brakes;
CustomVehicleControllerComponentEngine::dGearBox* gearbox;
CustomVehicleControllerComponentEngine* engine;
std::vector<float> forwardGearRatio;
float reverseGearRatio;
CustomVehicleControllerComponentEngine::dMultiAxelDifferential* differencial;
std::vector<int> axle;
std::vector<CustomVehicleControllerComponentEngine::dSingleAxelDifferential*> newtonaxles;
float topSpeedKPH, idleTorquePoundPerFoot, idleRPM, peakTorquePoundPerFoot, peakTorqueRPM, peakHorsePower, peakHorsePowerRPM, redLineTorquePoundPerFoot, redLineRPM;
//Destructor
~NewtonVehicle();
public:
//Constructor
NewtonVehicle(NewtonBody* newtonbody);
//Tires
int AddTire(float x, float y, float z, float mass, float radius, float width, bool steering, float suspensionDamper = 200.0, float suspensionSpring = 2000.0, float suspensionLength = 1.2, float lateralStiffness = 20.0, float longitudinalStiffness = 100000.0, float aligningMOmentTrail = 1.5);
void AddAxle(int lefttire, int righttire);
//Optional settings
void SetGearRatio(std::vector<float> forwardGearRatio, float reverseGearRatio);
void SetTorqueCurve(float topSpeedKPH, float idleTorquePoundPerFoot, float idleRPM, float peakTorquePoundPerFoot, float peakTorqueRPM, float peakHorsePower, float peakHorsePowerRPM, float redLineTorquePoundPerFoot, float redLineRPM);
//Build
bool Build();
NewtonBody* GetBody();
//Control
void SetAcceleration(float engineGasPedal);
void SetSteering(float steering);
void SetBrakes(float brakes);
void SetHandBrakes(float brakes);
void SetGear(int gear);
void SetTransmissionMode(bool automatic);
//Information
void GetTireMatrix(int tireindex, float* matrix);
int GetGear();
float GetRPM();
float GetSpeed();
};
NewtonVehicle.cpp
- Code: Select all
#include "NewtonVehicle.h"
NewtonVehicle::NewtonVehicle(NewtonBody* newtonbody) : manager(NULL), vehicle(NULL)
{
const float maxsteerangle = 25.0f;
const float braketorque = 10000.0f;
CustomVehicleControllerManager* manager = new CustomVehicleControllerManager(NewtonBodyGetWorld(newtonbody));
float gravity[3] = { 0.0, -1.0, 0.0 };
float mass = 10;
float mat[16] = { 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 };
vehicle = manager->CreateVehicle(newtonbody, mat, gravity);
//Create steering
steering = new CustomVehicleControllerComponentSteering(vehicle, maxsteerangle * 3.141592f / 180.0f);
//Create brakes
brakes = new CustomVehicleControllerComponentBrake(vehicle, braketorque);
//Setup default gear ratio
reverseGearRatio = 2.9;
forwardGearRatio.push_back(2.5);
forwardGearRatio.push_back(2.0);
forwardGearRatio.push_back(1.5);
//Default torque values
topSpeedKPH = 72.0;
idleTorquePoundPerFoot = 1300.0;
idleRPM = 500.0;
peakTorquePoundPerFoot = 2000.0;
peakTorqueRPM = 3000.0;
peakHorsePower = 1200;
peakHorsePowerRPM = 4000.0;
redLineTorquePoundPerFoot = 300.0;
redLineRPM = 4500;
}
NewtonVehicle::~NewtonVehicle()
{
if (vehicle)
{
manager->DestroyController(vehicle);
vehicle = NULL;
}
delete manager;
}
NewtonBody* NewtonVehicle::GetBody()
{
return vehicle->GetBody();
}
void NewtonVehicle::GetTireMatrix(int tireindex, float* matrix)
{
const dMatrix& tireMatrix = tire[tireindex]->GetLocalMatrix();
memcpy(matrix, &tireMatrix, sizeof(float)* 16);
}
void NewtonVehicle::SetAcceleration(float engineGasPedal)
{
engine->SetParam(engineGasPedal);
}
void NewtonVehicle::SetSteering(float steeringVal)
{
steering->SetParam(steeringVal);
}
void NewtonVehicle::SetBrakes(float brakePedal)
{
brakes->SetParam(brakePedal);
}
void NewtonVehicle::SetHandBrakes(float brakePedal)
{
CustomVehicleControllerComponentBrake* const handBrakes = vehicle->GetHandBrakes();
handBrakes->SetParam(brakePedal);
}
int NewtonVehicle::AddTire(float x, float y, float z, float mass, float radius, float width, bool usesteering, float suspensionDamper, float suspensionSpring, float suspensionLength, float lateralStiffness, float longitudinalStiffness, float aligningMOmentTrail)
{
CustomVehicleControllerBodyStateTire::TireCreationInfo tireInfo;
tireInfo.m_location[0] = x;
tireInfo.m_location[1] = y;
tireInfo.m_location[2] = z;
tireInfo.m_mass = mass;
tireInfo.m_radio = radius;
tireInfo.m_width = width;
tireInfo.m_dampingRatio = suspensionDamper;
tireInfo.m_springStrength = suspensionSpring;
tireInfo.m_suspesionlenght = suspensionLength;
tireInfo.m_lateralStiffness = lateralStiffness;
tireInfo.m_longitudialStiffness = longitudinalStiffness;
tireInfo.m_aligningMomentTrail = aligningMOmentTrail;
CustomVehicleControllerBodyStateTire* newtontire = vehicle->AddTire(tireInfo);
if (newtontire == NULL) return -1;
tire.push_back(newtontire);
//Add steering if desired
if (steering) steering->AddSteeringTire(tire[tire.size() - 1], -1.0f);
//Always add brakes
brakes->AddBrakeTire(tire[tire.size()-1]);
return tire.size() - 1;
}
void NewtonVehicle::SetGearRatio(std::vector<float> forwardGearRatio,float reverseGearRatio)
{
this->forwardGearRatio = forwardGearRatio;
this->reverseGearRatio = reverseGearRatio;
}
void NewtonVehicle::AddAxle(int lefttire, int righttire)
{
axle.push_back(lefttire);
axle.push_back(righttire);
}
void NewtonVehicle::SetTorqueCurve(float topSpeedKPH, float idleTorquePoundPerFoot, float idleRPM, float peakTorquePoundPerFoot, float peakTorqueRPM, float peakHorsePower, float peakHorsePowerRPM, float redLineTorquePoundPerFoot, float redLineRPM)
{
this->topSpeedKPH = topSpeedKPH;
this->idleTorquePoundPerFoot = idleTorquePoundPerFoot;
this->idleRPM = idleRPM;
this->peakTorquePoundPerFoot = peakTorquePoundPerFoot;
this->peakTorqueRPM = peakTorqueRPM;
this->peakHorsePower = peakHorsePower;
this->peakHorsePowerRPM = peakHorsePowerRPM;
this->redLineTorquePoundPerFoot = redLineTorquePoundPerFoot;
this->redLineRPM = redLineRPM;
}
bool NewtonVehicle::Build()
{
if (tire.size() < 2) return false;
if (axle.size() == 0) return false;
vehicle->SetSteering(steering);
vehicle->SetBrakes(brakes);
//Build axles / differential
for (int i = 0; i < axle.size()/2; i++)
{
newtonaxles.push_back(new CustomVehicleControllerComponentEngine::dSingleAxelDifferential(vehicle, tire[axle[i*2+0]], tire[axle[i*2+1]]));
}
differencial = new CustomVehicleControllerComponentEngine::dMultiAxelDifferential(vehicle, newtonaxles.size(), &newtonaxles[0]);
//Build gearbox
gearbox = new CustomVehicleControllerComponentEngine::dGearBox(vehicle, reverseGearRatio, forwardGearRatio.size(), &forwardGearRatio[0]);
//Build engine
engine = new CustomVehicleControllerComponentEngine(vehicle, gearbox, differencial);
engine->SetTransmissionMode(true);
vehicle->SetEngine(engine);
//Build Torque Curve
engine->InitEngineTorqueCurve(topSpeedKPH, idleTorquePoundPerFoot, idleRPM, peakTorquePoundPerFoot, peakTorqueRPM, peakHorsePower, peakHorsePowerRPM, redLineTorquePoundPerFoot, redLineRPM);
//Finalize vehicle
vehicle->Finalize();
return true;
}
int NewtonVehicle::GetGear()
{
int gearid = engine->GetGear();
if (gearid == CustomVehicleControllerComponentEngine::dGearBox::m_reverseGear) return -1;
if (gearid == CustomVehicleControllerComponentEngine::dGearBox::m_newtralGear) return 0;
return gearid - CustomVehicleControllerComponentEngine::dGearBox::m_firstGear + 1;
}
void NewtonVehicle::SetGear(int gearid)
{
switch (gearid)
{
case -1:
engine->SetGear(CustomVehicleControllerComponentEngine::dGearBox::m_reverseGear);
break;
case 0:
engine->SetGear(CustomVehicleControllerComponentEngine::dGearBox::m_newtralGear);
break;
default:
engine->SetGear(CustomVehicleControllerComponentEngine::dGearBox::m_firstGear + gearid - 1);
break;
}
}
float NewtonVehicle::GetRPM()
{
return engine->GetRPM();
}
float NewtonVehicle::GetSpeed()
{
return engine->GetSpeed();
}
void NewtonVehicle::SetTransmissionMode(bool automatic)
{
engine->SetTransmissionMode(automatic);
}