Main Content

Cette page a été traduite par traduction automatique. Cliquez ici pour voir la dernière version en anglais.

dormir

Interpolation linéaire sphérique

Depuis R2019b

Description

exemple

q0 = slerp(q1,q2,T) interpole sphériquement entre q1 et q2 par le coefficient d'interpolation T. La fonction choisit toujours le chemin d'interpolation le plus court entre q1 et q2.

Exemples

réduire tout

Créez deux quaternions avec l'interprétation suivante :

  1. a = rotation de 45 degrés autour de l'axe z

  2. c = rotation de -45 degrés autour de l'axe z

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

Appelez slerp avec les quaternions a et c et spécifiez un coefficient d'interpolation de 0,5.

interpolationCoefficient = 0.5;

b = slerp(a,c,interpolationCoefficient);

La sortie de slerp, b, représente une rotation moyenne de a et c. Pour vérifier, convertissez b en angles d'Euler en degrés.

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

     0     0     0

Le coefficient d'interpolation est spécifié comme une valeur normalisée entre 0 et 1, inclus. Un coefficient d'interpolation de 0 correspond au quaternion a , et un coefficient d'interpolation de 1 correspond au c Quaternion $ . Appelez slerp avec les coefficients 0 et 1 pour confirmer.

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

   45.0000         0         0
  -45.0000         0         0

Vous pouvez créer des chemins fluides entre les quaternions en spécifiant des tableaux de coefficients d'interpolation équidistants.

path = 0:0.1:1;

interpolatedQuaternions = slerp(a,c,path);

Pour les quaternions qui représentent la rotation uniquement autour d'un seul axe, la spécification des coefficients d'interpolation comme étant équidistants entraîne des quaternions équidistants dans les angles d'Euler. Convertissez interpolatedQuaternions en angles d'Euler et vérifiez que la différence entre les angles du chemin est 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

Alternativement, vous pouvez utiliser la fonction dist pour vérifier que la distance entre les quaternions interpolés est cohérente. La fonction dist renvoie la distance angulaire en radians ; convertir en degrés pour une comparaison facile.

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

L'algorithme SLERP interpole le long d'un chemin orthodromique reliant deux quaternions. Cet exemple montre comment l'algorithme SLERP minimise le chemin du grand cercle.

Définissez quatre quaternions :

  1. q0 - quaternion indiquant aucune rotation par rapport au référentiel global

  2. q179 - quaternion indiquant une rotation de 179 degrés autour de l'axe z

  3. q180 - quaternion indiquant une rotation de 180 degrés autour de l'axe z

  4. q181 - quaternion indiquant une rotation de 181 degrés autour de l'axe 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");

Utilisez slerp pour interpoler entre q0 et les trois rotations de quaternions. Précisez que les chemins sont parcourus en 10 étapes.

T = linspace(0,1,10);

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

Tracez chaque chemin en termes d'angles d'Euler en degrés.

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.

Le chemin entre q0 et q179 est dans le sens des aiguilles d'une montre pour minimiser la distance orthodromique. Le chemin entre q0 et q181 est dans le sens antihoraire pour minimiser la distance orthodromique. Le chemin entre q0 et q180 peut être dans le sens des aiguilles d'une montre ou dans le sens inverse, en fonction de l'arrondi numérique.

Créez deux quaternions.

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

Définissez le coefficient d'interpolation.

T = 0:0.01:1;

Obtenez les quaternions interpolés.

quats = slerp(q1,q2,T);

Obtenez les points de rotation correspondants.

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

Montrez les quaternions interpolés sur une sphère unitaire.

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.

Notez que les quaternions interpolés suivent le chemin le plus court de q1 à q2.

Arguments d'entrée

réduire tout

Quaternion à interpoler, spécifié comme objet quaternion , un tableau d'objets quaternion de n'importe quelle dimensionnalité.

q1, q2 et T doivent avoir des tailles compatibles. Dans les cas les plus simples, ils peuvent avoir la même taille ou chacun peut être un scalaire. Deux entrées ont des tailles compatibles si, pour chaque dimension, les tailles des dimensions des entrées sont identiques ou si l'une d'entre elles est 1.

Quaternion à interpoler, spécifié comme un tableau scalaire, vectoriel, matriciel ou multidimensionnel de quaternions.

q1, q2 et T doivent avoir des tailles compatibles. Dans les cas les plus simples, ils peuvent avoir la même taille ou chacun peut être un scalaire. Deux entrées ont des tailles compatibles si, pour chaque dimension, les tailles des entrées sont identiques ou si l'une des tailles est 1.

Coefficient d'interpolation, spécifié sous la forme d'un tableau de nombres scalaire, vectoriel, matriciel ou multidimensionnel avec chaque élément dans la plage [0, 1].

q1, q2 et T doivent avoir des tailles compatibles. Dans les cas les plus simples, ils peuvent avoir la même taille ou chacun peut être un scalaire. Deux entrées ont des tailles compatibles si, pour chaque dimension, les tailles des entrées sont identiques ou si l'une des tailles est 1.

Types de données : single | double

Arguments de sortie

réduire tout

Quaternion interpolé, renvoyé sous la forme d'un objet quaternion ou d'un tableau d'objets quaternion .

Algorithmes

L'interpolation l linéaire quaternionienne s sphérique (SLERP) est une extension de l'interpolation linéaire le long d'un plan à l'interpolation sphérique en trois dimensions. L'algorithme a été proposé pour la première fois dans [1]. Étant donné deux quaternions, q 1 et q 2 , SLERP interpole un nouveau quaternion, q 0 , le long du grand cercle qui relie q 1 et q 2 . Le coefficient d'interpolation, T, détermine la proximité du quaternion de sortie avec q 1 et q 2 .

L'algorithme SLERP peut être décrit en termes de sinusoïdes :

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

q 1 et q 2 sont des quaternions normalisés, et θ est la moitié de la distance angulaire entre q 1 et q 2 .

Références

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

Capacités étendues

Génération de code C/C++
Générez du code C et C++ avec MATLAB® Coder™.

Historique des versions

Introduit dans R2019b