Autor Wątek: Problem z fizyka samochodu.  (Przeczytany 774 razy)

Offline zarius

  • Użytkownik

# Listopad 19, 2011, 18:03:46
Witam,

Pisze sobie wlasnie fizyke pojazdu do gry i mam nastepujacy problem.

Od razu dodam, ze korzystam z tego tutoriala: http://regedit.i365.pl/Mirror/Car%20Physics%20for%20Games/Car%20Physics%20for%20Games.html

Problem polega na tym, ze zmiana biegu na wyzszy powoduje spadek obrotow silnika (co jest normalne) ale powoduje tez spadek momentu obrotowego, co za tym idzie spadek ogolnej mocy silnika ktorej uzywam do wyliczania akceleracji.

Ta ze wzgledu na dzialajace sily oporu powietrza staje sie ujemna i auto zamiast na wyzszym biegu nabierac predkosci to ja traci.

Czy ktos kiedys uzywal powyzszego opisu do tworzenia symulacji fizycznej auta i czy mial podobny problem?

Siedze juz na tym tyle czasu, kombinuje na rozne sposoby i nie moge sprawic aby to zadzialalo jak nalezy.

Jesli ktos moglby pomoc to zamieszczam tez fragment kodu odpowiedzialny za wyliczanie obrotow silnika/momentu obrotowego i update ruchu:

void DoPhysics(float dt)
{
UpdateDrag(); UpdateFriction();

// Calculate drive wheel Angular Velocity.
AngularVelocity = GetWheelAngularVelocity(dt);
//AngularVelocity = Speed / WheelRadius;
// Plug-in to calculate engine RPM.
RPM = GetRPM(AngularVelocity); //CalculateRPM(AngularVelocity);
// Use RPM to get the engine Torque.
EngineTorque = Throttle * m_engine.GetTorque(RPM);

Direction = Vec2(-sinf(Rotation), cosf(Rotation));

float CrankshaftMultiplyer = GearRatios[CurrentGear] * DifferentialRatio;
DriveTorque = EngineTorque * CrankshaftMultiplyer * TransmissionEfficiency;
DriveForce = Direction * (DriveTorque / WheelRadius);

// Update Traction force taking Dynamic Weight Transfer into account.
UpdateAxlesWeight();
if(RearAxleWeight*TyreFrictionCoefficient < DriveForce.y)
TractionForce = Direction*RearAxleWeight*TyreFrictionCoefficient;
else
TractionForce = DriveForce;

float sign = fast_sign(TractionForce.y);

LongtitudinalForce = sign * D3DXVec2Length(&TractionForce)  + (-Direction.y)*(DragForce + WheelFrictionForce);

Acceleration = LongtitudinalForce / Mass;

// Hack ?
if(Acceleration <= 1.0f*D3DX_16F_EPSILON && Acceleration >= 1.0f*D3DX_16F_EPSILON)
Acceleration = 0.0f;

//float WheelRPM = RPM / CrankshaftMultiplyer;
//float RevolutionDisplacement = 2.0f * D3DX_PI * WheelRadius;
//float WheelRotationsPerSecond = WheelRPM / 60.0f;
//float WheelMetersPerSecond = WheelRotationsPerSecond * RevolutionDisplacement;

//if(Speed > WheelMetersPerSecond)
// Speed = WheelMetersPerSecond;

Speed += Acceleration * dt;

Position += Direction* Speed * dt * 10.0f;

}

float GetWheelAngularVelocity(float dt)
{
float TractionTorque = TractionForce.y * WheelRadius;
float TotalTorque = TractionTorque + EngineTorque*GearRatios[CurrentGear] * DifferentialRatio * TransmissionEfficiency;
AngularAcceleration = TotalTorque / AxleInertia;

AngularVelocity += AngularAcceleration * dt;

if(Speed/WheelRadius > AngularVelocity)
AngularVelocity = Speed / WheelRadius;

return AngularVelocity;
}

float CalculateRPM(float wheelAngularVelocity)
{ // Calculates the RPM from wheel angular velocity.
float rpm = wheelAngularVelocity * GearRatios[CurrentGear] * DifferentialRatio * 60.0f / (2.0f*D3DX_PI);

if(rpm < 1000)
rpm = 1000;

return rpm;
}

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline .:NOXY:.

  • Użytkownik
    • Profil

# Listopad 20, 2011, 21:08:30
Zlookaj sobie RayCast Tutorial z PhysX sdk masz tam standardowe podejscie do silnika/sprzegla/itd.