Сферическая линейная интерполяция
q0 = slerp(q1,q2,T)Создайте два кватерниона со следующей интерпретацией:
a = 45 вращений степени вокруг оси z
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 минимизирует большой круговой путь.
Задайте три кватерниона:
q0 - кватернион, указывающий ни на какое вращение от глобального кадра
q179 - кватернион, указывающий на 179 вращений степени вокруг оси z
q180 - кватернион, указывающий на 180 вращений степени вокруг оси z
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 — КватернионКватернион, чтобы интерполировать, заданный как скаляр, вектор, матрица или многомерный массив кватернионов.
q1, q2 и T должны иметь совместимые размеры. В самых простых случаях они могут быть одного размера, или любой может быть скаляром. Два входных параметров имеют совместимые размеры, если для каждой размерности размеры размерности входных параметров являются или тем же самым или одним из них, 1.
Типы данных: quaternion
q2 — КватернионКватернион, чтобы интерполировать, заданный как скаляр, вектор, матрица или многомерный массив кватернионов.
q1, q2 и T должны иметь совместимые размеры. В самых простых случаях они могут быть одного размера, или любой может быть скаляром. Два входных параметров имеют совместимые размеры, если для каждой размерности размеры размерности входных параметров являются или тем же самым или одним из размеров размерности, 1.
Типы данных: quaternion
T Коэффициент интерполяцииКоэффициент интерполяции, заданный как скаляр, вектор, матрица или многомерный массив чисел с каждым элементом в области значений [0,1].
q1, q2 и T должны иметь совместимые размеры. В самых простых случаях они могут быть одного размера, или любой может быть скаляром. Два входных параметров имеют совместимые размеры, если для каждой размерности размеры размерности входных параметров являются или тем же самым или одним из размеров размерности, 1.
Типы данных: single | double
q0 — Интерполированный кватернионИнтерполированный кватернион, возвращенный как скаляр, вектор, матрица или многомерный массив.
Типы данных: 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 может быть описан с точки зрения синусоид:
где q 1 и q 2 является нормированными кватернионами, и θ является половиной углового расстояния между q 1 и q 2.
[1] Shoemake, Кен. "Анимируя Вращение с Кривыми Кватерниона". Издание 19 Компьютерной графики SIGGRAPH ACM, Выпуск 3, 1985, стр 345–354.
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.