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);

Выход slerpB, представляет среднее вращение 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 функция, чтобы проверить, что расстояние между интерполированными кватернионами сопоставимо. 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)')

Путь между 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] (Sensor Fusion and Tracking Toolbox). Учитывая два кватерниона, 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] Shoemake, Кен. "Анимируя Вращение с Кривыми Кватерниона". Издание 19 Компьютерной графики SIGGRAPH ACM, Выпуск 3, 1985, стр 345–354.

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

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

Введенный в R2018b