As you can see, when I put a steering, my wheels turn but without steering, they don't.
This is my fonction where I modify the position and the rotation of each wheels :
Code: Select all
BOOLEAN PhysicsWorldBullet::DoProcessRayCastVehicle (RayCastVehicle* _rayCastVehicle)
{
if (!GetSingleDelegate(_rayCastVehicle) || !_rayCastVehicle->m_vehicle || !_rayCastVehicle->m_vehicleRayCaster) return false;
//Engine Force, Breaking Force and Vehicule Steering Definition
float gEngineForce = _rayCastVehicle->m_engineForce.GetValue();
float gBreakingForce = _rayCastVehicle->m_brake.GetValue();
float gVehicleSteering = -_rayCastVehicle->m_steering.GetValue();
//Motor Wheels Definition
int wheelIndex = 0;
if(gBreakingForce>0)
{
((btRaycastVehicle*) _rayCastVehicle->m_vehicle)->setBrake(gBreakingForce,wheelIndex);
((btRaycastVehicle*) _rayCastVehicle->m_vehicle)->applyEngineForce(0,wheelIndex);
}
else
((btRaycastVehicle*) _rayCastVehicle->m_vehicle)->applyEngineForce(gEngineForce,wheelIndex);
wheelIndex = 1;
if(gBreakingForce>0)
{
((btRaycastVehicle*) _rayCastVehicle->m_vehicle)->setBrake(gBreakingForce,wheelIndex);
((btRaycastVehicle*) _rayCastVehicle->m_vehicle)->applyEngineForce(0,wheelIndex);
}
else
((btRaycastVehicle*) _rayCastVehicle->m_vehicle)->applyEngineForce(gEngineForce,wheelIndex);
//Steering Front Wheels
wheelIndex = 0;
((btRaycastVehicle*) _rayCastVehicle->m_vehicle)->setSteeringValue(gVehicleSteering,wheelIndex);
wheelIndex = 1;
((btRaycastVehicle*) _rayCastVehicle->m_vehicle)->setSteeringValue(gVehicleSteering,wheelIndex);
((btRaycastVehicle*) _rayCastVehicle->m_vehicle)->getRigidBody()->activate();
int i=0;
float ajustementZ = 0.05;//put the 3D wheels upside the floor
for ( IteratorEx(it, _rayCastVehicle, Geometry3D); i<((btRaycastVehicle*)_rayCastVehicle->m_vehicle)->getNumWheels(); it++)
{
it->Process(this);
//Position
((btRaycastVehicle*) _rayCastVehicle->m_vehicle)->updateWheelTransform(i,true);
btTransform newTransform = ((btRaycastVehicle*) _rayCastVehicle->m_vehicle)->getWheelInfo(i).m_worldTransform;
MATRIX Local = BtUtils3D::GetTransform(newTransform);//Get the Local matrix of the wheel
it->SetWorldPosition(Local._41, Local._42, Local._43+ajustementZ);
//Orientation
float rotation = (float)((btRaycastVehicle*) _rayCastVehicle->m_vehicle)->getWheelInfo(i).m_rotation;
//for the front wheels
if (i<2)
{
if (gVehicleSteering<0)
it->SetOrientation(NULL, -rotation, 0, gVehicleSteering + PI_2);
else
it->SetOrientation(NULL, rotation, 0, gVehicleSteering + PI_2);
}
//for the back wheels
else
{
if (gVehicleSteering<0)
{
if (gEngineForce<0)
it->SetOrientation(NULL, -rotation, 0, PI_2);
else
it->SetOrientation(NULL, rotation, 0, PI_2);
}
else
{
if (gEngineForce<0)
it->SetOrientation(NULL, rotation, 0, PI_2);
else
it->SetOrientation(NULL, -rotation, 0, PI_2);
}
}
i++;
}
return true;
}
Code: Select all
m_engineForce.SetRange(-1000.0, 2000.0, 0.0);//(Min, Max, Init)
m_brake.SetRange(0.0, 100.0, 0.0);//(Min, Max, Init)
m_steering.SetRange(-0.3, 0.3, 0.0);//(Min, Max, Init)
m_wheelDirectionCS.SetValues(0, 0, -1);
m_wheelAxleCS.SetValues(0, -1, 0);
m_wheelRadius = 0.31265;//Defaut : 0.5f, Subaru : 0.31265
m_wheelWidth = 0.215f;//Defaut : 0.4f, Subaru : 0.215f
m_wheelFriction = 10.5;//1000.0;//2.0;
m_maxSuspensionTravelCm = 20.0f;//500.0;
m_suspensionStiffness = 40.0f;//5.8f;//Defaut : 20.0, Subaru : 15.0
m_suspensionDamping = 2.3f;//0.88;//2.3;
m_suspensionCompression = 2.4;//0.83;//4.4;
m_rollInfluence = 0.2f;
m_suspensionRestLength = 0.1;
m_connectionHeight = -0.4;//1.2;
m_chassisLenght = 4.8;//Defaut : 2, Subaru : 4.8
m_chassisWidth = 2; //Defaut : 1, Subaru : 2
m_chassisHeight = 1.3;//Defaut : 0.5 , Subaru : 1.5
m_SpeedKmH = 0;
Code: Select all
it->m_SpeedKmH = ((btRaycastVehicle*)it->m_vehicle)->getCurrentSpeedKmHour();
if(it->m_SpeedKmH.GetValue() < 0)
{
it->m_SpeedKmH*=-1;
}
In the video, we see that the color of the raycast change in blue when they are in contact with the ground.
The value m_rotation is increase by m_deltaRotation everytime (in btRaycastVehicle::updateVehicle( btScalar step )), but when there is no steering, m_deltaRotation is really small like "0.0000004" (in radian).
I hope you can help me because I'm totaly blocked for now.
Thank for your help,
Cordialy,
InSomNia.