forked from speed-dreams/speed-dreams-code
Re #385: take into account gear and differential efficiencies
git-svn-id: https://svn.code.sf.net/p/speed-dreams/code/trunk@3510 30fe4595-0a0c-4342-8851-515496e4dcbd Former-commit-id: 5e101e19b9f34b561acf6d564ad58b1eff46b89d Former-commit-id: 02af6bbcb963379db78fac8f1e56244ced3b02c8
This commit is contained in:
parent
981dfb168f
commit
a48d2ae9a9
2 changed files with 27 additions and 23 deletions
|
@ -48,9 +48,12 @@ SimDifferentialConfig(void *hdle, const char *section, tDifferential *differenti
|
|||
} else {
|
||||
differential->type = DIFF_NONE;
|
||||
}
|
||||
|
||||
if (differential->efficiency > 1.0f) {differential->efficiency = 1.0f;}
|
||||
if (differential->efficiency < 0.0f) {differential->efficiency = 0.0f;}
|
||||
|
||||
differential->feedBack.I = differential->I * differential->ratio * differential->ratio +
|
||||
(differential->inAxis[0]->I + differential->inAxis[1]->I) / differential->efficiency;
|
||||
(differential->inAxis[0]->I + differential->inAxis[1]->I);
|
||||
}
|
||||
|
||||
|
||||
|
@ -67,7 +70,7 @@ updateSpool(tCar *car, tDifferential *differential, int first)
|
|||
tdble I;
|
||||
tdble inTq, brkTq;
|
||||
|
||||
DrTq = differential->in.Tq;
|
||||
DrTq = differential->in.Tq * differential->efficiency;
|
||||
|
||||
I = differential->outAxis[0]->I + differential->outAxis[1]->I;
|
||||
inTq = differential->inAxis[0]->Tq + differential->inAxis[1]->Tq;
|
||||
|
@ -116,7 +119,7 @@ SimDifferentialUpdate(tCar *car, tDifferential *differential, int first)
|
|||
return;
|
||||
}
|
||||
|
||||
DrTq = differential->in.Tq;
|
||||
DrTq = differential->in.Tq * differential->efficiency;
|
||||
|
||||
spinVel0 = differential->inAxis[0]->spinVel;
|
||||
spinVel1 = differential->inAxis[1]->spinVel;
|
||||
|
|
|
@ -122,32 +122,32 @@ SimTransmissionConfig(tCar *car)
|
|||
switch(trans->type) {
|
||||
case TRANS_RWD:
|
||||
differential = &(trans->differential[TRANS_REAR_DIFF]);
|
||||
differential->outAxis[0]->I = trans->curI / 2.0f + differential->inAxis[0]->I / trans->gearEff[trans->gearbox.gear+1];
|
||||
differential->outAxis[1]->I = trans->curI / 2.0f + differential->inAxis[1]->I / trans->gearEff[trans->gearbox.gear+1];
|
||||
differential->outAxis[0]->I = trans->curI / 2.0f + differential->inAxis[0]->I;
|
||||
differential->outAxis[1]->I = trans->curI / 2.0f + differential->inAxis[1]->I;
|
||||
differential->outAxis[0]->Tq = 0;
|
||||
differential->outAxis[1]->Tq = 0;
|
||||
break;
|
||||
case TRANS_FWD:
|
||||
differential = &(trans->differential[TRANS_FRONT_DIFF]);
|
||||
differential->outAxis[0]->I = trans->curI / 2.0f + differential->inAxis[0]->I / trans->gearEff[trans->gearbox.gear+1];
|
||||
differential->outAxis[1]->I = trans->curI / 2.0f + differential->inAxis[1]->I / trans->gearEff[trans->gearbox.gear+1];
|
||||
differential->outAxis[0]->I = trans->curI / 2.0f + differential->inAxis[0]->I;
|
||||
differential->outAxis[1]->I = trans->curI / 2.0f + differential->inAxis[1]->I;
|
||||
differential->outAxis[0]->Tq = 0;
|
||||
differential->outAxis[1]->Tq = 0;
|
||||
break;
|
||||
case TRANS_4WD:
|
||||
differential = &(trans->differential[TRANS_FRONT_DIFF]);
|
||||
differential->outAxis[0]->I = trans->curI / 4.0f + differential->inAxis[0]->I / trans->gearEff[trans->gearbox.gear+1];
|
||||
differential->outAxis[1]->I = trans->curI / 4.0f + differential->inAxis[1]->I / trans->gearEff[trans->gearbox.gear+1];
|
||||
differential->outAxis[0]->I = trans->curI / 4.0f + differential->inAxis[0]->I;
|
||||
differential->outAxis[1]->I = trans->curI / 4.0f + differential->inAxis[1]->I;
|
||||
differential->outAxis[0]->Tq = 0;
|
||||
differential->outAxis[1]->Tq = 0;
|
||||
differential = &(trans->differential[TRANS_REAR_DIFF]);
|
||||
differential->outAxis[0]->I = trans->curI / 4.0f + differential->inAxis[0]->I / trans->gearEff[trans->gearbox.gear+1];
|
||||
differential->outAxis[1]->I = trans->curI / 4.0f + differential->inAxis[1]->I / trans->gearEff[trans->gearbox.gear+1];
|
||||
differential->outAxis[0]->I = trans->curI / 4.0f + differential->inAxis[0]->I;
|
||||
differential->outAxis[1]->I = trans->curI / 4.0f + differential->inAxis[1]->I;
|
||||
differential->outAxis[0]->Tq = 0;
|
||||
differential->outAxis[1]->Tq = 0;
|
||||
differential = &(trans->differential[TRANS_CENTRAL_DIFF]);
|
||||
differential->outAxis[0]->I = trans->curI / 2.0f + differential->inAxis[0]->I / trans->gearEff[trans->gearbox.gear+1];
|
||||
differential->outAxis[1]->I = trans->curI / 2.0f + differential->inAxis[1]->I / trans->gearEff[trans->gearbox.gear+1];
|
||||
differential->outAxis[0]->I = trans->curI / 2.0f + differential->inAxis[0]->I;
|
||||
differential->outAxis[1]->I = trans->curI / 2.0f + differential->inAxis[1]->I;
|
||||
differential->outAxis[0]->Tq = 0;
|
||||
differential->outAxis[1]->Tq = 0;
|
||||
break;
|
||||
|
@ -222,16 +222,16 @@ SimGearboxUpdate(tCar *car)
|
|||
}
|
||||
|
||||
|
||||
differential->in.I = trans->curI + differential->feedBack.I / trans->gearEff[gearbox->gear+1];
|
||||
differential->outAxis[0]->I = trans->curI / 2.0f + differential->inAxis[0]->I / trans->gearEff[gearbox->gear+1];
|
||||
differential->outAxis[1]->I = trans->curI / 2.0f + differential->inAxis[1]->I / trans->gearEff[gearbox->gear+1];
|
||||
differential->in.I = trans->curI + differential->feedBack.I;
|
||||
differential->outAxis[0]->I = trans->curI / 2.0f + differential->inAxis[0]->I;
|
||||
differential->outAxis[1]->I = trans->curI / 2.0f + differential->inAxis[1]->I;
|
||||
if (trans->type == TRANS_4WD) {
|
||||
differential = &(trans->differential[TRANS_FRONT_DIFF]);
|
||||
differential->outAxis[0]->I = trans->curI / 4.0f + differential->inAxis[0]->I / trans->gearEff[gearbox->gear+1];
|
||||
differential->outAxis[1]->I = trans->curI / 4.0f + differential->inAxis[1]->I / trans->gearEff[gearbox->gear+1];
|
||||
differential->outAxis[0]->I = trans->curI / 4.0f + differential->inAxis[0]->I;
|
||||
differential->outAxis[1]->I = trans->curI / 4.0f + differential->inAxis[1]->I;
|
||||
differential = &(trans->differential[TRANS_REAR_DIFF]);
|
||||
differential->outAxis[0]->I = trans->curI / 4.0f + differential->inAxis[0]->I / trans->gearEff[gearbox->gear+1];
|
||||
differential->outAxis[1]->I = trans->curI / 4.0f + differential->inAxis[1]->I / trans->gearEff[gearbox->gear+1];
|
||||
differential->outAxis[0]->I = trans->curI / 4.0f + differential->inAxis[0]->I;
|
||||
differential->outAxis[1]->I = trans->curI / 4.0f + differential->inAxis[1]->I;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -241,13 +241,14 @@ SimTransmissionUpdate(tCar *car)
|
|||
{
|
||||
tTransmission *trans = &(car->transmission);
|
||||
tClutch *clutch = &(trans->clutch);
|
||||
tGearbox *gearbox = &(trans->gearbox);
|
||||
tDifferential *differential, *differential0, *differential1;
|
||||
tdble transfer = MIN(clutch->transferValue * 3.0f, 1.0f);
|
||||
|
||||
switch(trans->type) {
|
||||
case TRANS_RWD:
|
||||
differential = &(trans->differential[TRANS_REAR_DIFF]);
|
||||
differential->in.Tq = (car->engine.Tq_response + car->engine.Tq) * trans->curOverallRatio * transfer;
|
||||
differential->in.Tq = (car->engine.Tq_response + car->engine.Tq) * trans->curOverallRatio * transfer * trans->gearEff[gearbox->gear+1];
|
||||
SimDifferentialUpdate(car, differential, 1);
|
||||
SimUpdateFreeWheels(car, 0);
|
||||
/* printf("s0 %f - s1 %f (%f) inTq %f -- Tq0 %f - Tq1 %f (%f)\n", */
|
||||
|
@ -257,7 +258,7 @@ SimTransmissionUpdate(tCar *car)
|
|||
break;
|
||||
case TRANS_FWD:
|
||||
differential = &(trans->differential[TRANS_FRONT_DIFF]);
|
||||
differential->in.Tq = (car->engine.Tq_response + car->engine.Tq) * trans->curOverallRatio * transfer;
|
||||
differential->in.Tq = (car->engine.Tq_response + car->engine.Tq) * trans->curOverallRatio * transfer * trans->gearEff[gearbox->gear+1];
|
||||
SimDifferentialUpdate(car, differential, 1);
|
||||
SimUpdateFreeWheels(car, 1);
|
||||
/* printf("s0 %f - s1 %f (%f) inTq %f -- Tq0 %f - Tq1 %f (%f)\n", */
|
||||
|
@ -270,7 +271,7 @@ SimTransmissionUpdate(tCar *car)
|
|||
differential0 = &(trans->differential[TRANS_FRONT_DIFF]);
|
||||
differential1 = &(trans->differential[TRANS_REAR_DIFF]);
|
||||
|
||||
differential->in.Tq = (car->engine.Tq_response + car->engine.Tq) * trans->curOverallRatio * transfer;
|
||||
differential->in.Tq = (car->engine.Tq_response + car->engine.Tq) * trans->curOverallRatio * transfer * trans->gearEff[gearbox->gear+1];
|
||||
differential->inAxis[0]->spinVel = (differential0->inAxis[0]->spinVel + differential0->inAxis[1]->spinVel) / 2.0f;
|
||||
differential->inAxis[1]->spinVel = (differential1->inAxis[0]->spinVel + differential1->inAxis[1]->spinVel) / 2.0f;
|
||||
differential->inAxis[0]->Tq = (differential0->inAxis[0]->Tq + differential0->inAxis[1]->Tq) / differential->ratio;
|
||||
|
|
Loading…
Reference in a new issue