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:
kakukri 2011-04-25 21:56:51 +00:00
parent 981dfb168f
commit a48d2ae9a9
2 changed files with 27 additions and 23 deletions

View file

@ -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;

View file

@ -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;