From e70a23d93a09001b97b2017b7a4a1050daf51d8c Mon Sep 17 00:00:00 2001 From: ulteq Date: Tue, 22 Nov 2016 10:20:02 +0100 Subject: [PATCH] Greatly improves the plausibility of the transonic flight simulation (#4652) * Transonic flight now induces yawing and pitching of the nose of the bullet instead of modifying the bullet velocity directly * The ballistic coefficient now starts to decreases once the bullet goes transonic --- .../AdvancedBallistics.cpp | 34 ++++++++++++------- 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/extensions/advanced_ballistics/AdvancedBallistics.cpp b/extensions/advanced_ballistics/AdvancedBallistics.cpp index 89a0d0b060..c2875bb448 100644 --- a/extensions/advanced_ballistics/AdvancedBallistics.cpp +++ b/extensions/advanced_ballistics/AdvancedBallistics.cpp @@ -48,6 +48,7 @@ struct Bullet { double lastFrame; double hDeflection; double spinDrift; + double bcDegradation; unsigned randSeed; std::default_random_engine randGenerator; }; @@ -68,7 +69,6 @@ Map* map = &mapDatabase[""]; double calculateRoughnessLength(double posX, double posY) { // Source: http://es.ucsc.edu/~jnoble/wind/extrap/index.html double roughness_lengths[10] = {0.0002, 0.0005, 0.0024, 0.03, 0.055, 0.1, 0.2, 0.4, 0.8, 1.6}; - double roughnessLength = 0.0024; int gridX = (int)floor(posX / 50); int gridY = (int)floor(posY / 50); @@ -482,6 +482,7 @@ void __stdcall RVExtension(char *output, int outputSize, const char *function) bulletDatabase[index].lastFrame = tickTime; bulletDatabase[index].hDeflection = 0.0; bulletDatabase[index].spinDrift = 0.0; + bulletDatabase[index].bcDegradation = 1.0; bulletDatabase[index].speed = 0.0; bulletDatabase[index].frames = 0.0; bulletDatabase[index].randSeed = 0; @@ -617,6 +618,24 @@ void __stdcall RVExtension(char *output, int outputSize, const char *function) trueVelocity[2] = velocity[2] - wind[2]; trueSpeed = sqrt(pow(trueVelocity[0], 2) + pow(trueVelocity[1], 2) + pow(trueVelocity[2], 2)); + double speedOfSound = 331.3 + (0.6 * temperature); + double transonicSpeed = 394 + (0.6 * temperature); + if (bulletDatabase[index].transonicStabilityCoef < 1.0f && bulletSpeed < transonicSpeed && bulletSpeed > speedOfSound) { + std::uniform_real_distribution distribution(-10.0, 10.0); + double coef = 1.0f - bulletDatabase[index].transonicStabilityCoef; + + trueVelocity[0] += distribution(bulletDatabase[index].randGenerator) * coef; + trueVelocity[1] += distribution(bulletDatabase[index].randGenerator) * coef; + trueVelocity[2] += distribution(bulletDatabase[index].randGenerator) * coef; + double speed = sqrt(pow(trueVelocity[0], 2) + pow(trueVelocity[1], 2) + pow(trueVelocity[2], 2)); + + trueVelocity[0] *= trueSpeed / speed; + trueVelocity[1] *= trueSpeed / speed; + trueVelocity[2] *= trueSpeed / speed; + + bulletDatabase[index].bcDegradation *= pow(0.993, coef); + }; + temperature = bulletDatabase[index].temperature - 0.0065 * position[2]; pressure = (1013.25 - 10 * bulletDatabase[index].overcast) * pow(1 - (0.0065 * (bulletDatabase[index].altitude + position[2])) / (273.15 + temperature + 0.0065 * bulletDatabase[index].altitude), 5.255754495); @@ -640,6 +659,7 @@ void __stdcall RVExtension(char *output, int outputSize, const char *function) } ballisticCoefficient = calculateAtmosphericCorrection(ballisticCoefficient, temperature, pressure, bulletDatabase[index].humidity, bulletDatabase[index].atmosphereModel); + ballisticCoefficient *= bulletDatabase[index].bcDegradation; drag = deltaT * calculateRetard(bulletDatabase[index].dragModel, ballisticCoefficient, trueSpeed); accel[0] = (trueVelocity[0] / trueSpeed) * drag; accel[1] = (trueVelocity[1] / trueSpeed) * drag; @@ -694,16 +714,6 @@ void __stdcall RVExtension(char *output, int outputSize, const char *function) positionOffset[0] += sin(bulletDir + M_PI / 2) * spinDriftPartial; positionOffset[1] += cos(bulletDir + M_PI / 2) * spinDriftPartial; - double speedOfSound = 331.3 + (0.6 * temperature); - if (bulletSpeed < (speedOfSound + 5) && bulletSpeedAvg > speedOfSound && bulletSpeed > (speedOfSound - 5)) { - std::uniform_real_distribution distribution(0.0, 1.0); - double coef = 1.0f - bulletDatabase[index].transonicStabilityCoef; - - velocityOffset[0] += (distribution(bulletDatabase[index].randGenerator) * 0.8 - 0.4) * coef; - velocityOffset[1] += (distribution(bulletDatabase[index].randGenerator) * 0.8 - 0.4) * coef; - velocityOffset[2] += (distribution(bulletDatabase[index].randGenerator) * 0.8 - 0.4) * coef; - }; - outputStr << "_bullet setVelocity (_bulletVelocity vectorAdd [" << velocityOffset[0] << "," << velocityOffset[1] << "," << velocityOffset[2] << "]); _bullet setPosASL (_bulletPosition vectorAdd [" << positionOffset[0] << "," << positionOffset[1] << "," << positionOffset[2] << "]);"; strncpy_s(output, outputSize, outputStr.str().c_str(), _TRUNCATE); EXTENSION_RETURN(); @@ -725,7 +735,7 @@ void __stdcall RVExtension(char *output, int outputSize, const char *function) } else if (!strcmp(mode, "init")) { int mapSize = 0; int mapGrids = 0; - int gridCells = 0; + unsigned int gridCells = 0; worldName = strtok_s(NULL, ":", &next_token); mapSize = strtol(strtok_s(NULL, ":", &next_token), NULL, 10);