slerp

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

Синтаксис

Описание

пример

q0 = slerp(q1,q2,T) сферически интерполирует между q1 и q2 коэффициентом интерполяции T. Функция всегда выбирает более короткий путь к интерполяции между q1 и q2.

Примеры

свернуть все

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

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

Figure contains an axes object. The axes object 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 = quaternion([75,-20,-10],'eulerd','ZYX','frame');
q2 = quaternion([-45,20,30],'eulerd','ZYX','frame');

Задайте коэффициент интерполяции.

T = 0:0.01:1;

Получите интерполированные кватернионы.

quats = slerp(q1,q2,T);

Получите соответствие, вращают точки.

pts = rotatepoint(quats,[1 0 0]);

Покажите интерполированные кватернионы на сфере единичного радиуса.

figure
[X,Y,Z] = sphere;
surf(X,Y,Z,'FaceColor',[0.57 0.57 0.57])
hold on;

scatter3(pts(:,1),pts(:,2),pts(:,3))
view([69.23 36.60])
axis equal

Figure contains an axes object. The axes object contains 2 objects of type surface, scatter.

Обратите внимание на то, что интерполированные кватернионы следуют за более коротким путем от q1 к q2.

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

свернуть все

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

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

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

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

Введенный в R2020a