Sky Delivery — Добавил тряску

Реализовал в своём лётном симуляторе небольшую и достаточно простую фишку, которая добавляет ×10 к общей атмосфере. Казалось бы — обычная симуляция турбулентности. Но с ней игра ощущается совсем иначе.

Идея простая: нужна функция, которая в качестве параметра принимает силу турбулентности и возвращает случайное значение. Затем мы берём это значение и применяем его как силу к крыльям самолёта, как бы слегка их подкручивая.

Я перепробовал разные варианты псевдорандома, но сохранялась проблема: на длинной дистанции самолёт очень сильно перекашивался. В моём понимании он должен был слегка дрожать вокруг своей продольной оси, но в среднем оставаться в том положении, которого от него ждёт игрок, а не заваливаться на спину.

В итоге я пришёл к тому, что использую функцию синуса, которая после каждого цикла (2pi) случайным образом меняет частоту и амплитуду. Это решение идеально легло в физику самолёта. Результатом более чем доволен.

public float GetRollShake(WeatherProfile weatherProfile) { float result = 0f; if (weatherProfile.isRollShake) { var minAmp = weatherProfile.minShakeAmp; var maxAmp = weatherProfile.maxShakeAmp; var minFreq = weatherProfile.minShakeFreq; var maxFreq = weatherProfile.maxShakeFreq; _phase += Time.deltaTime * (Mathf.PI / _currentFrequency); if (_phase > Mathf.PI * 2f) { _phase = 0; _currentAmplitude = Random.Range(minAmp, maxAmp); _currentFrequency = Random.Range(minFreq, maxFreq); } result = Mathf.Sin(_phase) * _currentAmplitude; } return result; }
Как-то так это выглядит графически
Как-то так это выглядит графически

Ещё я добавил обычный ветер со статичным направлением и колеблющейся силой. На всё про всё ушло несколько часов, но на выходе я получил огромный прирост в ощущениях от управления самолётом.

Теперь он не просто стерильно летит в пространстве, реагируя лишь на ввод от игрока, а ведёт себя так, как мы ожидали бы в реальной жизни.

Спасибо за внимание! Подписывайтесь здесь или в телеге, чтобы следить за прогрессом.

79
23
12
57 комментариев