Main Content

Esta página se ha traducido mediante traducción automática. Haga clic aquí para ver la última versión en inglés.

dormir

Interpolación lineal esférica

Desde R2019b

Descripción

ejemplo

q0 = slerp(q1,q2,T) interpola esféricamente entre q1 y q2 mediante el coeficiente de interpolación T. La función siempre elige la ruta de interpolación más corta entre q1 y q2.

Ejemplos

contraer todo

Crea dos cuaterniones con la siguiente interpretación:

  1. a = rotación de 45 grados alrededor del eje z

  2. c = -45 grados de rotación alrededor del eje z

a = quaternion([45,0,0],"eulerd","ZYX","frame");
c = quaternion([-45,0,0],"eulerd","ZYX","frame");

Llame a slerp con los cuaterniones a y c y especifique un coeficiente de interpolación de 0,5.

interpolationCoefficient = 0.5;

b = slerp(a,c,interpolationCoefficient);

La salida de slerp, b, representa una rotación promedio de a y c. Para verificar, convierta b a ángulos de Euler en grados.

averageRotation = eulerd(b,"ZYX","frame")
averageRotation = 1×3

     0     0     0

El coeficiente de interpolación se especifica como un valor normalizado entre 0 y 1, inclusive. Un coeficiente de interpolación de 0 corresponde al cuaternión a , y un coeficiente de interpolación de 1 corresponde al c cuaternión. Llame a slerp con coeficientes 0 y 1 para confirmar.

b = slerp(a,c,[0,1]);
eulerd(b,"ZYX","frame")
ans = 2×3

   45.0000         0         0
  -45.0000         0         0

Puede crear rutas suaves entre cuaterniones especificando arreglos de coeficientes de interpolación igualmente espaciados.

path = 0:0.1:1;

interpolatedQuaternions = slerp(a,c,path);

Para cuaterniones que representan rotación solo alrededor de un solo eje, especificar coeficientes de interpolación como equiespaciados da como resultado cuaterniones equiespaciados en ángulos de Euler. Convierta interpolatedQuaternions a ángulos de Euler y verifique que la diferencia entre los ángulos en la trayectoria sea constante.

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

Alternativamente, puede usar la función dist para verificar que la distancia entre los cuaterniones interpolados sea consistente. La función dist devuelve la distancia angular en radianes; Convierta a grados para facilitar la comparación.

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

El algoritmo SLERP interpola a lo largo de una trayectoria de círculo máximo que conecta dos cuaterniones. Este ejemplo muestra cómo el algoritmo SLERP minimiza la trayectoria del círculo máximo.

Defina cuatro cuaterniones:

  1. q0 - cuaternión que indica que no hay rotación desde el marco global

  2. q179 - cuaternión que indica una rotación de 179 grados alrededor del eje z

  3. q180 - cuaternión que indica una rotación de 180 grados alrededor del eje z

  4. q181 - cuaternión que indica una rotación de 181 grados alrededor del eje 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");

Utilice slerp para interpolar entre q0 y las tres rotaciones de cuaterniones. Especifique que las rutas se recorren en 10 pasos.

T = linspace(0,1,10);

q179path = slerp(q0,q179,T);
q180path = slerp(q0,q180,T);
q181path = slerp(q0,q181,T);

Traza cada ruta en términos de ángulos de Euler en grados.

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 with xlabel Interpolation Coefficient, ylabel Z-Axis Rotation (Degrees) contains 3 objects of type line. One or more of the lines displays its values using only markers These objects represent Path to 179 degrees, Path to 180 degrees, Path to 181 degrees.

La ruta entre q0 y q179 es en el sentido de las agujas del reloj para minimizar la distancia del círculo máximo. La ruta entre q0 y q181 es en el sentido contrario a las agujas del reloj para minimizar la distancia del círculo máximo. La ruta entre q0 y q180 puede ser en el sentido de las agujas del reloj o contrario, dependiendo del redondeo numérico.

Crea dos cuaterniones.

q1 = quaternion([75,-20,-10],"eulerd","ZYX","frame");
q2 = quaternion([-45,20,30],"eulerd","ZYX","frame");

Defina el coeficiente de interpolación.

T = 0:0.01:1;

Obtenga los cuaterniones interpolados.

quats = slerp(q1,q2,T);

Obtenga los puntos de rotación correspondientes.

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

Muestre los cuaterniones interpolados en una esfera unitaria.

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.

Tenga en cuenta que los cuaterniones interpolados siguen la ruta más corta desde q1 a q2.

Argumentos de entrada

contraer todo

Cuaternión para interpolar, especificado como un objeto quaternion , un arreglo de objetos quaternion de cualquier dimensionalidad.

q1, q2 y T deben tener tamaños compatibles. En los casos más simples, pueden tener el mismo tamaño o cualquiera puede ser un escalar. Dos entradas tienen tamaños compatibles si, para cada dimensión, los tamaños de las dimensiones de las entradas son iguales o uno de ellos es 1.

Cuaternión para interpolar, especificado como escalar, vector, matriz o arreglo multidimensional de cuaterniones.

q1, q2 y T deben tener tamaños compatibles. En los casos más simples, pueden tener el mismo tamaño o cualquiera puede ser un escalar. Dos entradas tienen tamaños compatibles si, para cada dimensión, los tamaños de dimensión de las entradas son iguales o uno de los tamaños de dimensión es 1.

Coeficiente de interpolación, especificado como un escalar, vector, matriz o arreglo multidimensional de números con cada elemento en el rango [0, 1].

q1, q2 y T deben tener tamaños compatibles. En los casos más simples, pueden tener el mismo tamaño o cualquiera puede ser un escalar. Dos entradas tienen tamaños compatibles si, para cada dimensión, los tamaños de dimensión de las entradas son iguales o uno de los tamaños de dimensión es 1.

Tipos de datos: single | double

Argumentos de salida

contraer todo

Cuaternión interpolado, devuelto como un objeto quaternion o un arreglo de objetos quaternion .

Algoritmos

La interpolación lineal lineal esférica del cuaternión (SLERP) es una extensión de la interpolación lineal a lo largo de un plano a la interpolación esférica en tres dimensiones. El algoritmo se propuso por primera vez en [1]. Dados dos cuaterniones, q 1 y q 2, SLERP interpola un nuevo cuaternión, q 0, a lo largo del gran círculo que conecta q 1 y q 2 . El coeficiente de interpolación, T, determina qué tan cerca está el cuaternión de salida de q 1 y q 2.

El algoritmo SLERP se puede describir en términos de sinusoides:

q0=sin((1T)θ)sin(θ)q1+sin(Tθ)sin(θ)q2

donde q 1 y q 2 son cuaterniones normalizados, y θ es la mitad de la distancia angular entre q 1 y q 2 .

Referencias

[1] Shoemake, Ken. "Animating Rotation with Quaternion Curves." ACM SIGGRAPH Computer Graphics Vol. 19, Issue 3, 1985, pp. 245–254.

Capacidades ampliadas

Generación de código C/C++
Genere código C y C++ mediante MATLAB® Coder™.

Historial de versiones

Introducido en R2019b