Сущность крутится вокруг одной из трех осей Кватернион — это система чисел, расширяющая понятие комплексных чисел. Кватернионы часто используются в трехмерной компьютерной графике и для расчета вращений и ориентации в трехмерном пространстве, поскольку они обладают рядом важных свойств, делающих их особенно подходящими для этих целей. Кватернион представляет собой четырехмерный вектор, который состоит из одной скалярной и трех векторных компонент. Он обычно записывается в формате (w, x, y, z), где w - это скалярная компонента, а x, y и z - векторные компоненты. Кватернион (0,0,0,1), или Quaternion.identity, представляет "нулевое" вращение или идентичное вращение. <br> <br> Вращение сущности происходит по одному из трех осей (ось x или ось y или ось z) ![Rotation-Quaternion in Unity](Rotation-Quaternion%20in%20Unity.png) ### Ситуация с NaN Когда мы определяем поле/переменную с типом Кватернион, то так как это структура и при определении ей сразу присваивают default значения, то ей присваивается значение (0,0,0,0). Если такое поле использовать в методе Quaternion.RotateTowards, то метод вернет (NaN, NaN, NaN, NaN). Так происходит из-за того, что Кватернион с компонентами (0,0,0,0) недействителен для совершения математических операций над ним, так как кватернион должен быть нормализован (то есть его компоненты должны в сумме давать 1 по квадрату) для корректного представления вращения. В данном случае, квадраты всех компонентов суммируются в 0, что делает его недействительным. Это согласуется с определением кватернионов в математике. При использовании недействительного кватерниона в методе Quaternion.RotateTowards возникают неопределённые математические операции, что и приводит к NaN. Как я разобрал выше, Unity присваивает default-значение (0,0,0,0), хотя валидным (корректным) оно для Кватерниона не является. Для Кватерниона валидным «нулевым» значением является (0,0,0,1). (0, 0, 0, 1) обозначает вращение на 0 градусов вокруг любой оси, то есть это фактически единичное вращение или отсутствие вращения. (0, 0, 0, 1) является начальным, исходным значением Кватерниона, которое представляет объект, ориентированный по умолчанию, без какого-либо вращения. Стоит заметить, что в контексте Unity, вектор направления "прямо вперёд" обычно представлен как (0, 0, 1). Однако, кватернион (0, 0, 0, 1) не означает, что направление "смотрит" прямо по z-координате, он скорее представляет собой объект без вращения. Чтобы присвоить кватерниону значение «без вращения», то можно использовать метод Quaternion.identity (в BaseLib Quaternion.identityQuaternion) ```csharp public static Quaternion identityQuaternion ``` Или так ```csharp new Quaternion(0.0f, 0.0f, 0.0f, 1f); ``` <br> Ответ GPT, почему разработчики Unity не сделали для Кватерниона default значение (0,0,0,1): стандартное поведение в языке программирования C#, на котором основан Unity, для любого типа данных - это инициализация его нулевыми значениями. Это относится к числам, структурам данных и т.д. Для кватернионов это будет (0,0,0,0). Unity соблюдает это правило языка и не исключает кватернионы из него. Это означает, что разработчику придется явно установить начальное вращение для кватерниона, если это необходимо. <br> <br> В моем случае, Unity (когда я работал с глобальной позицией) не выдавал никаких ошибок и мне пришлось с помощью дебаггера искать причину того, что мои юниты не перемещались. Оказалось, что при определении кватерниона, ему присваивается default-значение, которое нельзя использовать для расчетов. ![Rotation-Quaternion in Unity-1](Rotation-Quaternion%20in%20Unity-1.png)