slerp

Сферическая линейная интерполяция

Синтаксис

Описание

пример

q0 = slerp(q1,q2,T) сферически интерполируется между q1 и q2 коэффициентом интерполяции T.

Примеры

свернуть все

Создайте два кватерниона со следующей интерпретацией:

  1. a = вращение на 45 степени вокруг оси Z

  2. c = -45 степени вращением вокруг оси Z

a = quaternion([45,0,0],'eulerd','ZYX','frame');
c = quaternion([-45,0,0],'eulerd','ZYX','frame');

Функции slerp с кватернионами a и c и задайте коэффициент интерполяции 0,5.

interpolationCoefficient = 0.5;

b = slerp(a,c,interpolationCoefficient);

Область выхода slerp, b, представляет среднее вращение a и c. Для проверки преобразуйте b до углов Эйлера в степенях.

averageRotation = eulerd(b,'ZYX','frame')
averageRotation = 1×3

     0     0     0

Коэффициент интерполяции задан как нормированное значение между 0 и 1, включительно. Коэффициент интерполяции 0 соответствует a кватернион и коэффициент интерполяции 1 соответствует c кватернион. Функции slerp с коэффициентами 0 и 1 для подтверждения.

b = slerp(a,c,[0,1]);
eulerd(b,'ZYX','frame')
ans = 2×3

   45.0000         0         0
  -45.0000         0         0

Можно создать гладкие пути между кватернионами путем определения массивов одинаково разнесенных коэффициентов интерполяции.

path = 0:0.1:1;

interpolatedQuaternions = slerp(a,c,path);

Для кватернионов, которые представляют вращение только вокруг одной оси, установка коэффициентов интерполяции как одинаково разнесенных приводит к кватернионам с равными интервалами в углах Эйлера. Преобразование interpolatedQuaternions чтобы получить углы Эйлера и проверить, что различие между углами в пути является постоянной.

k = eulerd(interpolatedQuaternions,'ZYX','frame');
abc = abs(diff(k))
abc = 10×3

    9.0000         0         0
    9.0000         0         0
    9.0000         0         0
    9.0000         0         0
    9.0000         0         0
    9.0000         0         0
    9.0000         0         0
    9.0000         0         0
    9.0000         0         0
    9.0000         0         0

Также можно использовать dist функция для проверки, что расстояние между интерполированными кватернионами соответствует. The dist функция возвращает угловое расстояние в радианах; преобразуйте в степени для простого сравнения.

def = rad2deg(dist(interpolatedQuaternions(2:end),interpolatedQuaternions(1:end-1)))
def = 1×10

    9.0000    9.0000    9.0000    9.0000    9.0000    9.0000    9.0000    9.0000    9.0000    9.0000

Алгоритм SLERP интерполируется по пути большого круга, соединяющему два кватерниона. Этот пример показывает, как алгоритм SLERP минимизирует большой путь круга.

Задайте три кватерниона:

  1. q0 - кватернион, указывающий на отсутствие вращения от глобальной системы координат

  2. q179 - кватернион, указывающий на вращение на 179 степени вокруг оси z

  3. q180 - кватернион, указывающий вращение на 180 степени вокруг оси z

  4. q181 - кватернион, указывающий на вращение на 181 степень вокруг оси z

q0 = ones(1,'quaternion');

q179 = quaternion([179,0,0],'eulerd','ZYX','frame');

q180 = quaternion([180,0,0],'eulerd','ZYX','frame');

q181 = quaternion([181,0,0],'eulerd','ZYX','frame');

Использование slerp для интерполяции между q0 и три вращения кватерниона. Укажите, что пути перемещаются за 10 шагов.

T = linspace(0,1,10);

q179path = slerp(q0,q179,T);
q180path = slerp(q0,q180,T);
q181path = slerp(q0,q181,T);

Постройте график каждого пути с точки зрения углов Эйлера в степенях.

q179pathEuler = eulerd(q179path,'ZYX','frame');
q180pathEuler = eulerd(q180path,'ZYX','frame');
q181pathEuler = eulerd(q181path,'ZYX','frame');

plot(T,q179pathEuler(:,1),'bo', ...
     T,q180pathEuler(:,1),'r*', ...
     T,q181pathEuler(:,1),'gd');
legend('Path to 179 degrees', ...
       'Path to 180 degrees', ...
       'Path to 181 degrees')
xlabel('Interpolation Coefficient')
ylabel('Z-Axis Rotation (Degrees)')

Figure contains an axes. The axes contains 3 objects of type line. These objects represent Path to 179 degrees, Path to 180 degrees, Path to 181 degrees.

Путь между q0 и q179 является по часовой стрелке, чтобы минимизировать большое расстояние круга. Путь между q0 и q181 против часовой стрелки, чтобы минимизировать большое расстояние круга. Путь между q0 и q180 может быть либо по часовой стрелке, либо против часовой стрелки, в зависимости от численного округления.

Входные параметры

свернуть все

Кватернион для интерполяции, заданный как скаляр, вектор, матрица или многомерный массив кватернионов.

q1, q2, и T должны иметь совместимые размеры. В самых простых случаях они могут быть одинакового размера или любой может быть скаляром. Два входа имеют совместимые размеры, если для каждого измерения размерности входов либо одинаковы, либо один из них равен 1.

Типы данных: quaternion

Кватернион для интерполяции, заданный как скаляр, вектор, матрица или многомерный массив кватернионов.

q1, q2, и T должны иметь совместимые размеры. В самых простых случаях они могут быть одинакового размера или любой может быть скаляром. Два входа имеют совместимые размеры, если для каждого измерения размерности входов либо одинаковы, либо один из размеров равен 1.

Типы данных: quaternion

Коэффициент интерполяции, заданный как скаляр, вектор, матрица или многомерный массив чисел с каждым элементом в области значений [0,1].

q1, q2, и T должны иметь совместимые размеры. В самых простых случаях они могут быть одинакового размера или любой может быть скаляром. Два входа имеют совместимые размеры, если для каждого измерения размерности входов либо одинаковы, либо один из размеров равен 1.

Типы данных: single | double

Выходные аргументы

свернуть все

Интерполированный кватернион, возвращенный как скалярный, векторный, матричный или многомерный массив.

Типы данных: quaternion

Алгоритмы

Кватернионовая сферическая линейная интерполяция (SLERP) является расширением линейной интерполяции вдоль плоскости до сферической интерполяции в трёх размерностях. Алгоритм был впервые предложен в [1]. Учитывая два кватерниона, q 1 и q 2, SLERP интерполирует новый кватернион, q 0, вдоль большого круга, который соединяет q 1 и q 2. Коэффициент интерполяции, T, определяет, насколько близок выходной кватернион к q 1 и q 2.

Алгоритм SLERP может быть описан в терминах синусоидов:

q0=sin((1T)θ)sin(θ)q1+sin(Tθ)sin(θ)q2

где q 1 и q 2 - нормированные кватернионы, а θ - половина углового расстояния между q 1 и q 2.

Ссылки

[1] Шумейк, Кен. «Анимация вращения с кватернионовыми кривыми». ACM SIGGRAPH Computer Graphics Vol. 19, Issue 3, 1985, pp. 345-354.

Расширенные возможности

Генерация кода C/C + +
Сгенерируйте код C и C++ с помощью Coder™ MATLAB ®

.
Введенный в R2019b