ddd.quaternion

  • struct Кватернион;

    Гиперкомплексное число (w,x,y,z), определяющее повороты объектов в 3D-пространстве.

    Для кватернионов определены:

    Преобразование в матрицу поворота и обратно.

    Унарные операции: обратить - получение кватерниона, реализующего поворот в обратную сторону на тот же угол. нормализовать - получение кватерниона единичной длины, реализующего тот же поворот.

    Бинарные операции: умножение * на другой кватернион - результирующий кватернион реализует поворот, соответствующий последовательному применению поворотов двух перемножаемых кватернионов. умножение * на скаляр. скалярное_произведение кватернионов.

    Функции интерполяции для анимации поворотов во времени: линейная_интерполяция - быстрый вариант интерполяции (ошибка до 4% в случае угла между кватернионами pi/2), используется для интерполяции между кватернионами, не сильно различающимися между собой. сферическая_интерполяция - точная, но более медленная реализация интерполяции.

    • static const Кватернион НОЛЬ;

      Кватернион, не выполняющий поворотов

    • this(float fW, float fX, float fY, float fZ);

      Конструктор, принимающий 4 числа

    • this(const(Кватернион) другой_кватернион);

      Конструктор копирования

    • this(Матрица3 поворот);

      Конструктор из матрицы поворота 3x3

    • this(float угол, const(Вектор3) оси);

      Конструктор, создающий кватернион из угла/оси

    • this(Вектор3 x_ось, Вектор3 y_ось, Вектор3 z_ось);

      Конструктор, создающий кватернион из 3 ортонормированных локальных осей

    • this(float[] массив);

      Конструктор, создающий кватернион напрямую из 4 чисел w/x/y/z

    • void из_матрицы_поворота(const(Матрица3) матрица_поворота);

      Функция, строящая кватернион из матрицы поворота

    • void из_угла_и_оси(float угол, const(Вектор3) ось);

      Функция, строящая кватернион из угла/оси

    • void из_осей(Вектор3 x_ось, Вектор3 y_ось, Вектор3 z_осьs);

      Функция, строящая кватернион из 3 ортонормированных локальных осей

    • const Матрица3 в_матрицу_поворота();

      Построение матрицы поворота 3x3 из этого кватерниона

    • Кватернион opBinary(string операция)(const(Кватернион) к2) if (операция == "*");

      Умножение на другой кватернион. Результирующий кватернион реализует поворот, соответствующий последовательному применению поворотов двух перемножаемых кватернионов.

      Умножение не коммутативно! k1*k2 != k2*k1

    • Кватернион opBinary(string операция)(const(Кватернион) к2) if (операция == "+" || операция == "-");

      Сложение-вычитание с другим кватернионом. Смысл операции сложения можно описать как "смесь" вращений, т.е. мы получим вращение, которое находится между this и к2.

    • Кватернион opOpAssign(string операция)(const(Кватернион) к2) if (операция == "*");

      Версия умножения с последующим присваиванием

    • Кватернион opBinary(string операция)(float скаляр) if (операция == "*");

      Умножение кватерниона на скаляр

    • const float скалярное_произведение(const(Кватернион) к2);

      Скалярное произведение кватернионов

    • const float Norm();

      Квадрат абсолютного значения кватерниона

    • const Кватернион обратить();

      Обращение кватерниона - получение кватерниона, реализующего поворот в обратную сторону на тот же угол.

    • float нормализовать();

      Нормализация кватерниона - получение кватерниона с единичным абсолютным значением, реализующего поворот на тот же угол

    • const Кватернион UnitInverse();

      Обращение кватерниона с единичным абсолютным значением (быстрее, чем )

      В случае, если достоверно не известно, что абсолютное значение кватерниона равно 1, необходимо пользоваться методом обратить().

    • Вектор3 opBinary(string операция)(Вектор3 v) if (операция == "*");

      Умножение кватерниона на вектор - реализация поворота этого вектора.

      Возвращаемое значение:

      Вектор той же длины, что и переданный на вход, повёрнутый на угол этого кватерниона.

    • bool equals(const(Кватернион) к2, float допуск);

      Сравнение кватернионов на равенство с погрешностью

      Параметры:

      const(Кватернион) к2

      сравниваемый кватернион

      float допуск

      максимальная погрешность в значении разницы углов между кватернионами, при котором они считаются равными

    • const string toString();

      Вывод значения кватерниона

    • const Кватернион линейная_интерполяция(const(Кватернион) к2, float t);

      Линейная интерполяция между этим кватернионом и переданным.

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

      Параметры:

      const(Кватернион) к2

      Второй кватернион

      float t

      Параметр интерполяции. При t=0 результат равен этому кватерниону, при t=1 результат равен к2.

      Возвращаемое значение:

      Кватернион, являющийся результатом интерполяции между этим кватернионом и к2.

    • const Кватернион сферическая_интерполяция(const(Кватернион) к2, float t);

      Сферическая интерполяция между этим кватернионом и переданным.

      Параметры:

      const(Кватернион) к2

      Второй кватернион

      float t

      Параметр интерполяции. При t=0 результат равен этому кватерниону, при t=1 результат равен к2.

      Возвращаемое значение:

      Кватернион, являющийся результатом интерполяции между этим кватернионом и к2.