Сферическая линейная интерполяция
Создайте два кватерниона со следующей интерпретацией:
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 = 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 минимизирует большой круговой путь.
Задайте три кватерниона:
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 = 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
Обратите внимание на то, что интерполированные кватернионы следуют за более коротким путем от q1
к q2
.
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]. Учитывая два кватерниона, 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.
У вас есть модифицированная версия этого примера. Вы хотите открыть этот пример со своими редактированиями?
Вы щелкнули по ссылке, которая соответствует команде MATLAB:
Выполните эту команду, введя её в командном окне MATLAB.
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.