Теги: повернуть, 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 будет становиться меньше, но на итоговый результат это не влияет
