主要内容

slerp

球形线性插值

描述

例子

q0处= slerp (第一季度第二季T球之间的插入第一季度第二季通过插值系数T.函数总是选择更短的插补路径第一季度第二季

例子

全部折叠

创建两个四元数,解释如下:

  1. 一个= 45度旋转绕z设在

  2. c= -45度旋转绕z设在

一个=四元数((45,0,0),“eulerd”“ZYX股票”“帧”);c =四元数((-45,0,0),“eulerd”“ZYX股票”“帧”);

调用slerp与四元数一个c并指定插值系数为0.5。

interpolationCoefficient = 0.5;b = slerp (a、c、interpolationCoefficient);

的输出slerpb,表示的平均旋转一个c.验证、转换b到欧拉角的角度。

averageRotation = eulerd (b,“ZYX股票”“帧”
averageRotation =1×30 0 0

插值系数指定为之间的归一化值01、包容。的内插系数0对应于一个四元数,插值系数1对应于c四元数。调用slerp与系数01来确认。

b = slerp (c [0,1]);eulerd (b,“ZYX股票”“帧”
ans =2×345.0000 00 -45.0000 00

通过指定等距插值系数数组,可以在四元数之间创建平滑路径。

路径= 0:0.1:1;interpolatedQuaternions = slerp (a、c、路径);

对于仅代表单个轴旋转的四元数,指定内插系数为等间距的结果是在欧拉角等间距的四元数。转换interpolatedQuaternions到欧拉角,并验证路径上两个角的差是常数。

k = eulerd (interpolatedQuaternions“ZYX股票”“帧”);美国广播公司(abc) = abs (diff (k))
美国广播公司(abc) =10×39.0000 00 9.0000 00 9.0000 00 9.0000 00 9.0000 00 9.0000 00 9.0000 00 9.0000 00

或者,您可以使用经销函数来验证插值的四元数之间的距离是否一致。的经销函数返回以弧度为单位的角度距离;转换为度,便于比较。

def = rad2deg (dist (interpolatedQuaternions(2:结束),interpolatedQuaternions (1: end-1)))
def =1×109.0000 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 = (1,“四元数”);q179 =四元数((179,0,0),“eulerd”“ZYX股票”“帧”);q180 =四元数((180,0,0),“eulerd”“ZYX股票”“帧”);q181 =四元数((181,0,0),“eulerd”“ZYX股票”“帧”);

使用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股票”“帧”);q180pathEuler = eulerd (q180path,“ZYX股票”“帧”);q181pathEuler = eulerd (q181path,“ZYX股票”“帧”);情节(T, q179pathEuler (: 1),“波”...T, q180pathEuler (: 1),的r *...T, q181pathEuler (: 1),“gd”);传奇(“通往179度”...“180度路径”...《181度之路》)包含(“插值系数”) ylabel (“z轴旋转(度)”

图中包含一个轴对象。轴对象包含3个类型为line的对象。这些对象表示路径到179度,路径到180度,路径到181度。

之间的路径q0处q179为顺时针,以最小化大圆距离。之间的路径q0处q181是逆时针的,以最小化大圆距离。之间的路径q0处q180可以是顺时针或逆时针,取决于数字四舍五入。

创建两个四元数。

q1 =四元数((75、-20、-10),“eulerd”“ZYX股票”“帧”);q2 =四元数((-45年,20年,30),“eulerd”“ZYX股票”“帧”);

定义插值系数。

T = 0:0.01:1;

获得插值的四元数。

皮疹= slerp (q1、q2, T);

获得相应的旋转点。

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

在单位球面上显示插值的四元数。

figure [X,Y,Z] =球面;冲浪(X, Y, Z,“FaceColor”,[0.57 0.57 0.57])保持;scatter3 (pts(: 1)分(:,2),分(:,3)视图([69.23 - 36.60])轴平等的

图中包含一个轴对象。axis对象包含两个类型为surface, scatter的对象。

注意,插值的四元数遵循较短的路径第一季度第二季

输入参数

全部折叠

要插值的四元数,指定为标量、向量、矩阵或四元数的多维数组。

第一季度第二季,T必须有兼容的大小。在最简单的情况下,它们可以是相同的大小,也可以是任意一个标量。对于每个维度,如果输入的维度大小相同或其中一个为1,则两个输入具有兼容的大小。

数据类型:四元数

要插值的四元数,指定为标量、向量、矩阵或四元数的多维数组。

第一季度第二季,T必须有兼容的大小。在最简单的情况下,它们可以是相同的大小,也可以是任意一个标量。对于每个维度,如果输入的维度大小相同或其中一个维度大小为1,则两个输入具有兼容的大小。

数据类型:四元数

插值系数,指定为每个元素在[0,1]范围内的标量、向量、矩阵或数字的多维数组。

第一季度第二季,T必须有兼容的大小。在最简单的情况下,它们可以是相同的大小,也可以是任意一个标量。对于每个维度,如果输入的维度大小相同或其中一个维度大小为1,则两个输入具有兼容的大小。

数据类型:|

输出参数

全部折叠

内插的四元数,作为标量、向量、矩阵或多维数组返回。

数据类型:四元数

算法

四元数年代phericallinear interp球面插补(SLERP)是平面线性插补到球面插补的一种扩展。该算法首次提出于[1].给定两个四元数,12, SLERP插值一个新的四元数,0,沿着连接的大圆12.插值系数,T,确定输出四元数与两者的距离有多近12

SLERP算法可以用正弦波来描述:

0 1 T θ θ 1 + T θ θ 2

在哪里12归一化四元数,和θ是角距的一半吗12

参考文献

[1] Shoemake,肯。“用四元数曲线动画旋转。”计算机图形学1985年第19卷第3期345-354页。

扩展功能

C / c++代码生成
使用MATLAB®Coder™生成C和c++代码。

介绍了R2020a