void SimWheelConfig(tCar *car, int index) { void *hdle = car->params; tCarElt *carElt = car->carElt; tWheel *wheel = &(car->wheel[index]); tdble rimdiam, tirewidth, tireratio, pressure, tireheight; tdble x0, Ca, RFactor, EFactor, patchLen; pressure = GfParmGetNum(hdle, WheelSect[index], PRM_PRESSURE, (char*)NULL, 275600); rimdiam = GfParmGetNum(hdle, WheelSect[index], PRM_RIMDIAM, (char*)NULL, 0.33f); tirewidth = GfParmGetNum(hdle, WheelSect[index], PRM_TIREWIDTH, (char*)NULL, 0.145f); tireheight = GfParmGetNum(hdle, WheelSect[index], PRM_TIREHEIGHT, (char*)NULL, -1.0f); tireratio = GfParmGetNum(hdle, WheelSect[index], PRM_TIRERATIO, (char*)NULL, 0.75f); wheel->mu = GfParmGetNum(hdle, WheelSect[index], PRM_MU, (char*)NULL, 1.0f); wheel->I = GfParmGetNum(hdle, WheelSect[index], PRM_INERTIA, (char*)NULL, 1.5f); wheel->I += wheel->brake.I; // add brake inertia wheel->staticPos.y = GfParmGetNum(hdle, WheelSect[index], PRM_YPOS, (char*)NULL, 0.0f); x0 = GfParmGetNum(hdle, WheelSect[index], PRM_RIDEHEIGHT, (char*)NULL, 0.20f); wheel->staticPos.az = GfParmGetNum(hdle, WheelSect[index], PRM_TOE, (char*)NULL, 0.0f); wheel->staticPos.ax = GfParmGetNum(hdle, WheelSect[index], PRM_CAMBER, (char*)NULL, 0.0f); Ca = GfParmGetNum(hdle, WheelSect[index], PRM_CA, (char*)NULL, 30.0f); RFactor = GfParmGetNum(hdle, WheelSect[index], PRM_RFACTOR, (char*)NULL, 0.8f); EFactor = GfParmGetNum(hdle, WheelSect[index], PRM_EFACTOR, (char*)NULL, 0.7f); wheel->lfMax = GfParmGetNum(hdle, WheelSect[index], PRM_LOADFMAX, (char*)NULL, 1.6f); wheel->lfMin = GfParmGetNum(hdle, WheelSect[index], PRM_LOADFMIN, (char*)NULL, 0.8f); wheel->opLoad = GfParmGetNum(hdle, WheelSect[index], PRM_OPLOAD, (char*)NULL, wheel->weight0 * 1.2f); wheel->mass = GfParmGetNum(hdle, WheelSect[index], PRM_MASS, (char*)NULL, 20.0f); if (index % 2) { wheel->relPos.ax = -wheel->staticPos.ax; } else { wheel->relPos.ax = wheel->staticPos.ax; } wheel->lfMin = MIN(0.8f, wheel->lfMin); wheel->lfMax = MAX(1.6f, wheel->lfMax); RFactor = MIN(1.0f, RFactor); RFactor = MAX(0.1f, RFactor); EFactor = MIN(1.0f, EFactor); patchLen = wheel->weight0 / (tirewidth * pressure); if (tireheight > 0.0) wheel->radius = rimdiam / 2.0f + tireheight; else wheel->radius = rimdiam / 2.0f + tirewidth * tireratio; wheel->tireSpringRate = wheel->weight0 / (wheel->radius * (1.0f - cos(asin(patchLen / (2.0f * wheel->radius))))); wheel->relPos.x = wheel->staticPos.x = car->axle[index/2].xpos; wheel->relPos.y = wheel->staticPos.y; wheel->relPos.z = wheel->radius - wheel->susp.spring.x0; wheel->relPos.ay = wheel->relPos.az = 0.0f; wheel->steer = 0.0f; /* components */ SimSuspConfig(hdle, SuspSect[index], &(wheel->susp), wheel->weight0, x0); SimBrakeConfig(hdle, BrkSect[index], &(wheel->brake)); carElt->_rimRadius(index) = rimdiam / 2.0f; if (tireheight > 0.0) carElt->_tireHeight(index) = tireheight; else carElt->_tireHeight(index) = tirewidth * tireratio; carElt->_tireWidth(index) = tirewidth; carElt->_brakeDiskRadius(index) = wheel->brake.radius; carElt->_wheelRadius(index) = wheel->radius; wheel->mfC = (tdble)(2.0 - asin(RFactor) * 2.0 / PI); wheel->mfB = Ca / wheel->mfC; wheel->mfE = EFactor; wheel->lfK = log((1.0f - wheel->lfMin) / (wheel->lfMax - wheel->lfMin)); wheel->feedBack.I += wheel->I; wheel->feedBack.spinVel = 0.0f; wheel->feedBack.Tq = 0.0f; wheel->feedBack.brkTq = 0.0f; wheel->rel_vel = 0.0f; }
void SimWheelConfig(tCar *car, int index) { void *hdle = car->params; tCarElt *carElt = car->carElt; tWheel *wheel = &(car->wheel[index]); tdble rimdiam, tirewidth, tireratio, pressure, tireheight; tdble x0, Ca, RFactor, EFactor, patchLen; pressure = GfParmGetNum(hdle, WheelSect[index], PRM_PRESSURE, (char*)NULL, 275600); rimdiam = GfParmGetNum(hdle, WheelSect[index], PRM_RIMDIAM, (char*)NULL, 0.33f); tirewidth = GfParmGetNum(hdle, WheelSect[index], PRM_TIREWIDTH, (char*)NULL, 0.145f); tireratio = GfParmGetNum(hdle, WheelSect[index], PRM_TIRERATIO, (char*)NULL, 0.75f); tireheight = GfParmGetNum(hdle, WheelSect[index], PRM_TIREHEIGHT, (char*)NULL, -1.0f); wheel->mu = GfParmGetNum(hdle, WheelSect[index], PRM_MU, (char*)NULL, 1.0f); wheel->I = GfParmGetNum(hdle, WheelSect[index], PRM_INERTIA, (char*)NULL, 1.5f); wheel->I += wheel->brake.I; /* add brake inertia */ wheel->staticPos.y = GfParmGetNum(hdle, WheelSect[index], PRM_YPOS, (char*)NULL, 0); x0 = GfParmGetNum(hdle, WheelSect[index], PRM_RIDEHEIGHT, (char*)NULL, 0.20f); wheel->staticPos.az = GfParmGetNum(hdle, WheelSect[index], PRM_TOE, (char*)NULL, 0.0f); wheel->staticPos.ax = GfParmGetNum(hdle, WheelSect[index], PRM_CAMBER, (char*)NULL, 0.0f); Ca = GfParmGetNum(hdle, WheelSect[index], PRM_CA, (char*)NULL, 30.0f); RFactor = GfParmGetNum(hdle, WheelSect[index], PRM_RFACTOR, (char*)NULL, 0.8f); EFactor = GfParmGetNum(hdle, WheelSect[index], PRM_EFACTOR, (char*)NULL, 0.7f); wheel->lfMax = GfParmGetNum(hdle, WheelSect[index], PRM_LOADFMAX, (char*)NULL, 1.6f); wheel->lfMin = GfParmGetNum(hdle, WheelSect[index], PRM_LOADFMIN, (char*)NULL, 0.8f); wheel->opLoad = GfParmGetNum(hdle, WheelSect[index], PRM_OPLOAD, (char*)NULL, wheel->weight0 * 1.2f); wheel->mass = GfParmGetNum(hdle, WheelSect[index], PRM_MASS, (char*)NULL, 20.0f); wheel->dynamic_camber = GfParmGetNum(hdle, WheelSect[index], PRM_DYNAMIC_CAMBER, (char*)NULL, -0.1f); wheel->condition = 1.0f; wheel->T_current = 50.0f; wheel->T_operating = 75.0f; wheel->T_range = 200.0f; wheel->mfT = 1.0f; car->carElt->_tyreT_mid(index) = wheel->T_current; car->carElt->_tyreCondition(index) = wheel->condition; if (index % 2) { wheel->relPos.ax = -wheel->staticPos.ax; } else { wheel->relPos.ax = wheel->staticPos.ax; } wheel->lfMin = MIN(0.9f, wheel->lfMin); wheel->lfMax = MAX(1.1f, wheel->lfMax); RFactor = MIN(1.0f, RFactor); RFactor = MAX(0.1f, RFactor); EFactor = MIN(1.0f, EFactor); patchLen = wheel->weight0 / (tirewidth * pressure); wheel->width = tirewidth; if (tireheight > 0.0) wheel->radius = rimdiam / 2.0f + tireheight; else wheel->radius = rimdiam / 2.0f + tirewidth * tireratio; wheel->tireSpringRate = (float)(wheel->weight0 / (wheel->radius * (1.0 - cos(asin(patchLen / (2.0f * wheel->radius)))))); wheel->relPos.x = wheel->staticPos.x = car->axle[index/2].xpos; wheel->relPos.y = wheel->staticPos.y; wheel->relPos.z = wheel->radius - wheel->susp.spring.x0; wheel->relPos.ay = wheel->relPos.az = 0.0f; wheel->steer = 0.0f; /* components */ SimSuspConfig(hdle, SuspSect[index], &(wheel->susp), wheel->weight0, x0); SimBrakeConfig(hdle, BrkSect[index], &(wheel->brake)); carElt->_rimRadius(index) = rimdiam / 2.0f; if (tireheight > 0.0) carElt->_tireHeight(index) = tireheight; else carElt->_tireHeight(index) = tirewidth * tireratio; carElt->_tireWidth(index) = tirewidth; carElt->_brakeDiskRadius(index) = wheel->brake.radius; carElt->_wheelRadius(index) = wheel->radius; wheel->Ca = Ca; wheel->mfC = (float)(2.0 - asin(RFactor) * 2.0 / PI); wheel->mfB = Ca / wheel->mfC; wheel->mfE = EFactor; wheel->lfK = (float)log((1.0 - wheel->lfMin) / (wheel->lfMax - wheel->lfMin)); wheel->spinVel = 0.0; wheel->feedBack.I += wheel->I; wheel->feedBack.spinVel = 0; wheel->feedBack.Tq = 0; wheel->feedBack.brkTq = 0; wheel->rel_vel = 0.0f; wheel->rotational_damage_x = 0.0;//urandom()*0.25; wheel->rotational_damage_z = 0.0;//urandom()*0.25; wheel->bent_damage_x = urandom(); wheel->bent_damage_z = urandom(); wheel->Em = 1.0; wheel->s_old = 0.0; wheel->F_old = 0.0; #ifdef USE_THICKNESS //wheel->thickness = malloc(sizeof(tdble)*N_THICKNESS_SEGMENTS); for (int i=0; i<N_THICKNESS_SEGMENTS; i++) { wheel->thickness[i] = 0.0; wheel->segtemp[i] = wheel->T_current; } #endif }