Теги: повернуть, turn, поворачивать <br> Как заставить плавно менять ориентацию бульдозера вне зависимости от «расстояния» между начальной и конечной ориентацией Если использовать метод Lerp, то при большом «расстоянии» между from и to бульдозер меняет ориентацию медленнее, а при маленьком быстрее. Утилитарный метод RotateTowards решает данную проблему. ```csharp Quaternion.RotateTowards(to, from, delta); ``` ### Дальше описывается как именно работает код внутри метода. Метод получает на вход: - начальную ориентацию (from) - конечную ориентацию (to) - «Расстояние» от начальной ориентации до необходимой за один вызов метода (delta) ```csharp public static Quaternion RotateTowards(Quaternion from, Quaternion to, float maxDegreesDelta) ``` Находим угол между текущей и конечной ориентацией бульдозера. ```csharp float angle = Quaternion.Angle(from, to); ``` Разберем пример, когда from динамическая, то есть каждый раз меняется после вызова метода, а to и delta — статичны. <br> Мы делим Delta на угол для того, чтобы при любом «расстоянии» между from и to, метод возвращал одинаковую (для своей последовательности) промежуточную ориентацию. Тем самым решая поставленную проблему. ```csharp var deltaInPercent = Mathf.Clamp01(maxDegreesDelta / angle); ``` Далее просто вызывается Slerp ```csharp Quaternion.Slerp(from, to, deltaInPercent); ``` После каждого вызова метода значение angle будет становиться меньше, но на итоговый результат это не влияет ![Как поменять ориентацию бульдозера с фиксированной скоростью](Как%20поменять%20ориентацию%20бульдозера%20с%20фиксированной%20скоростью.png)