exponenta event banner

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 для проверки согласованности расстояния между интерполированными кватернионами. 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]. Учитывая два кватерниона, q1 и q2, SLERP интерполирует новый кватернион, q0, вдоль большой окружности, которая соединяет q1 и q2. Коэффициент интерполяции T определяет, насколько близок выходной кватернион к q1 и q2.

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

q0 = sin ((1 T)

где q1 и q2 являются нормализованными кватернионами, а λ - половина углового расстояния между q1 и q2.

Ссылки

[1] Шумейк, Кен. «Анимация вращения с помощью кривых кватерниона». ACM SIGGRAPH Компьютерная графика Том 19, Выпуск 3, 1985, стр. 345-354.

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

Создание кода C/C + +
Создайте код C и C++ с помощью MATLAB ® Coder™

.
Представлен в R2020a