private void SimulateWind() { // Calculate wind intensity fluctuation by the settings float windIntensityFluctuation = settingsWindIntensityFluctuation / 1000.0f; float windDirectionFluctuation = settingsWindDirectionFluctuation / 1000.0f; // Constant wind float constantWind = sngConstantWind.GenerateNext_Between0And1(windIntensityFluctuation); constantWind /= 2.0f; constantWind *= (settingsWindIntensity / 2.0f); // Wind gust float windGust = sngWindGust.GenerateNext_OnlyPositive(windIntensityFluctuation * 3.0f); windGust *= settingsWindIntensity; totalWindIntensity = constantWind + windGust; float windDirectionChange = 5.0f * sngWindDirectionFluctuation.GenerateNext(windDirectionFluctuation); currentWindDirectionAngle = settingsWindDirection + windDirectionChange; // Create a wind force vector with length 1 and rotate so the wind affects the multicopter from a certain direction windForceVector = MathHelper.RotateAroundAxis_Y( new Vector3(1.0f, 0.0f, 0.0f), new Vector3(), xna.MathHelper.ToRadians(currentWindDirectionAngle) ); windForceVector = MathHelper.RotateAroundAxis_X( windForceVector, new Vector3(), xna.MathHelper.ToRadians(windDirectionChange) ); // Generate oscillation of the multicopter arms torqueVector.X = sngAttitudeDisturbances.GenerateNext(Globals.RandomGenerator.Next(100, 300) / 10000.0f) / 250.0f; torqueVector.Y = sngAttitudeDisturbances.GenerateNext(Globals.RandomGenerator.Next(100, 300) / 10000.0f) / 300.0f; torqueVector.Z = sngAttitudeDisturbances.GenerateNext(Globals.RandomGenerator.Next(100, 300) / 10000.0f) / 250.0f; // Scale the direction vector with the intensity windForceVector = Vector3.Scale(windForceVector, totalWindIntensity); torqueVector = Vector3.Scale(torqueVector, totalWindIntensity + 0.5f); // Let the global wind force and torque affect the multicopter PhysicsEntity.ApplyForce(windForceVector, false); PhysicsEntity.ApplyTorque(torqueVector, false); // Sum up for debug display totalForceVector += windForceVector; }