void SimAxleConfig(tCar *car, int index, tdble weight0) { void *hdle = car->params; tdble rollCenter, x0r, x0l; tAxle *axle = &(car->axle[index]); axle->xpos = GfParmGetNum(hdle, AxleSect[index], PRM_XPOS, (char*)NULL, 0.0f); axle->I = GfParmGetNum(hdle, AxleSect[index], PRM_INERTIA, (char*)NULL, 0.15f); x0r = GfParmGetNum(hdle, WheelSect[index*2], PRM_RIDEHEIGHT, (char*)NULL, 0.20f); x0l = GfParmGetNum(hdle, WheelSect[index*2+1], PRM_RIDEHEIGHT, (char*)NULL, 0.20f); rollCenter = GfParmGetNum(hdle, AxleSect[index], PRM_ROLLCENTER, (char*)NULL, 0.15f); car->wheel[index*2].rollCenter = car->wheel[index*2+1].rollCenter = rollCenter; if (index == 0) { SimSuspConfig(hdle, SECT_FRNTARB, &(axle->arbSusp), 0, 0); axle->arbSusp.spring.K = -axle->arbSusp.spring.K; SimSuspConfig(hdle, SECT_FRNTHEAVE, &(axle->heaveSusp), weight0, (tdble) (0.5*(x0r+x0l))); } else { SimSuspConfig(hdle, SECT_REARARB, &(axle->arbSusp), 0, 0); axle->arbSusp.spring.K = -axle->arbSusp.spring.K; SimSuspConfig(hdle, SECT_REARHEAVE, &(axle->heaveSusp), weight0, (tdble) (0.5*(x0r+x0l))); } car->wheel[index*2].feedBack.I += (tdble) (axle->I / 2.0); car->wheel[index*2+1].feedBack.I += (tdble) (axle->I / 2.0); }
void SimAxleConfig(tCar *car, int index) { void *hdle = car->params; tdble rollCenter; tAxle *axle = &(car->axle[index]); axle->xpos = GfParmGetNum(hdle, AxleSect[index], PRM_XPOS, (char*)NULL, 0.0f); axle->I = GfParmGetNum(hdle, AxleSect[index], PRM_INERTIA, (char*)NULL, 0.15f); rollCenter = GfParmGetNum(hdle, AxleSect[index], PRM_ROLLCENTER, (char*)NULL, 0.15f); car->wheel[index*2].rollCenter = car->wheel[index*2+1].rollCenter = rollCenter; if (index == 0) { SimSuspConfig(hdle, SECT_FRNTARB, &(axle->arbSusp), 0, 0); axle->arbSusp.spring.K = -axle->arbSusp.spring.K; } else { SimSuspConfig(hdle, SECT_REARARB, &(axle->arbSusp), 0, 0); axle->arbSusp.spring.K = -axle->arbSusp.spring.K; } car->wheel[index*2].feedBack.I += (tdble) (axle->I / 2.0); car->wheel[index*2+1].feedBack.I += (tdble) (axle->I / 2.0); }
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 }