Contenido principal

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

Descripción

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

ejemplo

q0 = slerp(q1,q2,T,method) interpola entre q1 y q2 utilizando el método de interpolación especificado.

ejemplo

Ejemplos

contraer todo

Crea dos cuaterniones con la siguiente interpretación:

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

  2. c = rotación de -45 grados 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 cuaternión c. Llame a slerp con los 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 en á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 utilizar 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; conviértala a grados para una fácil 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 sentido antihorario para minimizar la distancia del círculo máximo. La ruta entre q0 y q180 puede ser en sentido horario o antihorario, dependiendo del redondeo numérico.

Crea dos cuaterniones.

q1 = quaternion([0 0 0],"eulerd","ZYX","frame");
q2 = quaternion([-180 90 180],"eulerd","ZYX","frame");

Defina el coeficiente de interpolación.

T = 0:0.01:1;

Interpolar cuaterniones utilizando los métodos de interpolación "short" y "natural".

quats_natural = slerp(q1,q2,T,"natural");
quats_short = slerp(q1,q2,T,"short");

Obtenga los puntos de rotación correspondientes.

pts_natural = rotatepoint(quats_natural,[1.05 0 0]);
pts_short = rotatepoint(quats_short,[1.05 0 0]);

Muestre los cuaterniones interpolados en una esfera unitaria.

figure
[X,Y,Z] = sphere;
surf(X,Y,Z,FaceAlpha=0.5,EdgeAlpha=0.35)
colormap gray
hold on
scatter3(pts_natural(:,1),pts_natural(:,2),pts_natural(:,3),"filled")
scatter3(pts_short(:,1),pts_short(:,2),pts_short(:,3),"filled")
view([45 36.60]) 
axis equal
title("SLERP Short vs Natural")
legend("","SLERP Natural","SLERP Short")

Figure contains an axes object. The axes object with title SLERP Short vs Natural contains 3 objects of type surface, scatter. These objects represent SLERP Natural, SLERP Short.

Argumentos de entrada

contraer todo

Cuaternión a interpolar, especificado como un objeto quaternion, una matriz 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

Método de interpolación esférica, especificado como "short" o "natural".

  • "short" — Interpola a lo largo de la ruta más corta en el círculo máximo entre q1 y q2, lo que garantiza la distancia angular mínima.

  • "natural" — Omite la optimización de la ruta más corta, siguiendo la ruta natural determinada por el producto escalar de q1 y q2, que puede no ser la más corta.

Tipos de datos: single | double

Argumentos de salida

contraer todo

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

Algoritmos

La interpolación lineal esférica de cuaterniones (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 fue propuesto por primera vez en [1]. Dados dos cuaterniones, q1 y q2, SLERP interpola un nuevo cuaternión, q0, a lo largo del círculo máximo que conecta q1 y q2. El coeficiente de interpolación, T, determina qué tan cerca está el cuaternión de salida de q1 y q2.

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

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

donde q1 y q2 son cuaterniones normalizados, y θ es la mitad de la distancia angular entre q1 y q2.

Referencias

[1] Shoemake, Ken. "Animating Rotation with Quaternion Curves." ACM SIGGRAPH Computer Graphics 19, no. 3 (July 1985): 245–54. https://doi.org/10.1145/325165.325242.

Capacidades ampliadas

expandir todo

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

Historial de versiones

Introducido en R2019b

expandir todo