slerp

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

Синтаксис

q0 = slerp(q1,q2,T)

Описание

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 =

     0     0     0

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

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

   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 =

    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 =

  Columns 1 through 7

    9.0000    9.0000    9.0000    9.0000    9.0000    9.0000    9.0000

  Columns 8 through 10

    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