メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

interp1

四元数の内挿 (テーブル ルックアップ)

R2025a 以降

    説明

    vq = interp1(x,v,xq) は、球面線形内挿 (SLERP) を使用して、特定のクエリ点における 1 次元関数の四元数値を内挿します。x はサンプル点を指定し、v は対応する値 v(x) を含む四元数を指定します。xq はクエリ点を指定します。既定では、関数は "slerp-short" 内挿法を使用します。

    vq = interp1(x,v,xq,method) は、内挿法を指定します。

    vq = interp1(x,v,xq,method,extrapolation) は、x の領域の外側にある xq のすべてのクエリ点に対して返す四元数値を指定します。

    vq = interp1(v,xq) は、既定のサンプル点のセットを想定して四元数値を内挿します。既定の点は、1 から n までの数列です。ここで、nv の形状によって異なります。

    • v が四元数のベクトルの場合、既定の点は 1:length(v) です。

    • v が四元数の配列の場合、既定の点は 1:size(v,1) です。

    この構文は、サンプル点の間の絶対距離を考慮しない場合に使用します。

    vq = interp1(v,xq,method) は、内挿法を指定し、既定のサンプル点を使用します。

    vq = interp1(v,xq,method,extrapolation) は、外挿値を指定し、既定のサンプル点を使用します。

    すべて折りたたむ

    サンプル点 x と対応するサンプル値 v を定義します。

    x = [1 2 5 6];
    eul = [-185:45:-50; -20*ones(1,4); zeros(1,4)]';
    v = quaternion(eul,"eulerd","ZYX","frame");

    x の範囲でクエリ点を定義します。

    xq = [1.5 3 4 5.4];

    クエリ点で内挿します。

    vq = interp1(x,v,xq);

    結果を可視化するには、サンプルと内挿後の四元数を使用して同じ点を回転させます。

    pts_samples = rotatepoint(v,[1.05 0 0]);
    pts_query = rotatepoint(vq,[1.05 0 0]);

    単位球面をプロットし、その球面上にサンプルと内挿後の四元数をプロットします。

    figure
    [X,Y,Z] = sphere;
    surf(X,Y,Z,FaceAlpha=0.5,EdgeAlpha=0.35)
    colormap gray
    hold on
    scatter3(pts_samples(:,1),pts_samples(:,2),pts_samples(:,3),"filled")
    scatter3(pts_query(:,1),pts_query(:,2),pts_query(:,3),"filled")
    exampleHelperAnnotateQuats(pts_samples,pts_query,x,xq,10,1.05)
    axis equal
    title(["Interpolated Quaternions Visualized","Using Rotated Points"])
    legend("","Sample Quaternions (v)","Interpolated Quaternions (vq)")

    Figure contains an axes object. The axes object with title Interpolated Quaternions Visualized Using Rotated Points contains 11 objects of type surface, scatter, text. These objects represent Sample Quaternions (v), Interpolated Quaternions (vq).

    一連の関数値を定義します。

    eul = [-170:20:-70; -20*sind(0:72:360)-25; zeros(1,6)]';
    v = quaternion(eul,"eulerd","ZYX","frame");

    既定の点 1:6 の範囲で一連のクエリ点を定義します。この場合、v が 6 要素の quaternion 配列であるため、既定の点は 1:6 です。

    xq = [1.5 2.6 3.5 4.5 5.5];

    SQUAD 自然内挿法を使用して、xq における v を評価します。ここで既定の "slerp-short" 内挿法も使用できますが、この四元数関数で記述している正弦波回転については、SQUAD の方が内挿後のパスが滑らかになることに注意してください。

    vq = interp1(v,xq,"squad-natural");

    結果を可視化するには、サンプルと内挿後の四元数を使用して "x" 軸の点を回転させます。

    pts_samples = rotatepoint(v,[1.05 0 0]); 
    pts_query = rotatepoint(vq,[1.05 0 0]);

    単位球面をプロットし、その球面上にサンプルと内挿後の四元数をプロットします。

    figure
    [X,Y,Z] = sphere;
    surf(X,Y,Z,FaceAlpha=0.5,EdgeAlpha=0.35)
    colormap gray
    hold on
    scatter3(pts_samples(:,1),pts_samples(:,2),pts_samples(:,3),"filled")
    scatter3(pts_query(:,1),pts_query(:,2),pts_query(:,3),"filled")
    exampleHelperAnnotateQuats(pts_samples,pts_query,1:6,xq,9,1.05)
    axis equal
    title(["Interpolated Quaternions Visualized","Using Rotated Points"])
    legend("","Sample Quaternions (v)","Interpolated Quaternions (vq)")

    Figure contains an axes object. The axes object with title Interpolated Quaternions Visualized Using Rotated Points contains 14 objects of type surface, scatter, text. These objects represent Sample Quaternions (v), Interpolated Quaternions (vq).

    異なる向きを表す 3 つの四元数を定義します。

    q0 = quaternion([0 0 0],"euler","ZYX","frame");
    q1 = quaternion([pi/4 pi/6 pi/3],"euler","ZYX","frame");
    q2 = quaternion([pi/2 pi/4 pi/2],"euler","ZYX","frame");

    元のキーフレームの時間ベクトルを作成します。

    x = [1 2 3];

    内挿の時間ベクトルを作成します。

    T = linspace(0,3,300);

    interp1"slerp-natural""squad-natural" の手法を使用して内挿を行います。

    quats_slerp = interp1(x,[q0 q1 q2],T,"slerp-natural")';
    quats_squad = interp1(x,[q0 q1 q2],T,"squad-natural")';

    両方の内挿法の角速度を計算します。

    ang_vel_slerp = angvel(quats_slerp,T(2)-T(1),"frame");
    ang_vel_squad = angvel(quats_squad,T(2)-T(1),"frame");

    角速度をプロットします。

    tl = tiledlayout(2,1);
    title(tl,"Angular Velocity - SLERP vs SQUAD")

    SLERP と SQUAD の内挿の角速度をプロットします。SQUAD の内挿による角速度の方が SLERP を使用した内挿よりも滑らかになっていることに注目してください。

    nexttile
    plot(T,ang_vel_slerp)
    ylim padded
    title("SLERP Natural")
    legend("X","Y","Z")
    nexttile
    plot(T,ang_vel_squad)
    ylim padded
    title("SQUAD Natural")
    xlabel(tl,"Time")
    ylabel(tl,"Angular Velocity (rad/s)")

    Figure contains 2 axes objects. Axes object 1 with title SLERP Natural contains 3 objects of type line. These objects represent X, Y, Z. Axes object 2 with title SQUAD Natural contains 3 objects of type line.

    サンプル点 x と対応するサンプル値 v を定義します。

    x = [0 1 2];
    eul = [0 30 60; 0 20 60; zeros(1,3)]';
    v = quaternion(eul,"eulerd","ZYX","frame");

    x の領域を越えるクエリ点 xq を指定します。

    xq = [-0.5 0.5 1.5 2.5];

    次に、"slerp-short" 内挿法を使用して xq における v を評価します。ここで、x の領域の外側にある値については、すべての部分が 0 に設定された四元数に割り当てます。

    vq = interp1(x,v,xq,"slerp-short",ones("quaternion"))'
    vq = 4×1 quaternion array
                1 +        0i +        0j +        0k
          0.98774 + 0.022751i - 0.084907j -  0.12903k
          0.87097 +    0.151i -  0.30755j -  0.35217k
                1 +        0i +        0j +        0k
    
    

    入力引数

    すべて折りたたむ

    サンプル点。実数の N 要素ベクトルとして指定します。x には少なくとも 2 つのサンプル点が含まれていなければならず、x の値はそれぞれ異なっていなければなりません。x の長さは v の形状によって異なります。

    • v が四元数のベクトルの場合、length(x)length(v) と等しくなければなりません。

    • v が四元数の配列の場合、length(x)size(v,1) と等しくなければなりません。

    例: [1 2 3 4 5 6 7 8 9 10]

    例: 1:10

    例: [3 7 11 15 19 23 27 31]'

    サンプル四元数。quaternion オブジェクトの N 要素ベクトル、または quaternion オブジェクトの配列として指定します。

    同じクエリ点でサンプリングされたデータのセットが複数ある場合、v を配列として指定できます。配列の列ごとに異なる 1 次元サンプル値のセットが含まれていなければならず、最初の次元の長さは N でなければなりません。ここで、N は指定されたサンプル点 x の数です。

    クエリ点。実数のスカラー、ベクトル、行列、または配列として指定します。

    例: 5

    例: 1:0.05:10

    例: (1:0.05:10)'

    例: [0 1 2 7.5 10]

    内挿法。次の表のオプションのいずれかとして指定します。

    手法説明連続性コメント
    "slerp-short"

    内挿係数によるサンプル四元数間の球面線形内挿。サンプル四元数間の最短の内挿パスが選択されます。

    必ず最短のパスになるように、各サンプル点で入力と出力の四元数が反転される場合があることに注意してください。

    SLERP アルゴリズムの詳細については、SLERP アルゴリズムを参照してください。

    C0
    • 少なくとも 2 つのサンプル四元数が必要

    • 必要なメモリは少ない

    • 計算時間は効率的

    • 最短パスを必ず内挿する

    • 計算時間は最も速い

    "slerp-natural"

    内挿係数によるサンプル四元数間の球面線形内挿。サンプル四元数間の自然な内挿パスが選択されます。

    入力と出力の四元数は、サンプル点において同じ符号になります。

    SLERP アルゴリズムの詳細については、SLERP アルゴリズムを参照してください。

    C0
    • 少なくとも 2 つのサンプル四元数が必要

    • 必要なメモリは少ない

    • 計算時間は効率的

    • 入力と出力の四元数は、サンプル点において同じ符号になります。

    "squad-natural"

    サンプル四元数間の球面四角形内挿。加速度が段階的に変化する滑らかな連続遷移になります。

    入力と出力の四元数は、サンプル点において同じ符号になります。

    SQUAD アルゴリズムの詳細については、SQUAD アルゴリズムを参照してください。

    C1
    • 少なくとも 2 つのサンプル四元数が必要

    • 必要なメモリは中程度

    • 計算時間は効率的

    • 滑らかな遷移と段階的な加速度の変化を維持

    "nearest"最近傍による内挿。最も近いサンプル四元数の値がクエリ点の内挿値になります。不連続
    • 少なくとも 2 つのサンプル四元数が必要

    • 必要なメモリは多くない

    "next"次の近傍による内挿。次のサンプル四元数の値がクエリ点の内挿値になります。不連続
    • 少なくとも 2 つのサンプル四元数が必要。

    • 必要なメモリおよび計算時間は "nearest" と同じ

    "previous"前の近傍による内挿。前のサンプル四元数の値がクエリ点の内挿値になります。不連続
    • 少なくとも 2 つのサンプル四元数が必要。

    • 必要なメモリおよび計算時間は "nearest" と同じ

    外挿四元数。quaternion オブジェクトとして指定します。interp1 は、x の領域の外側をクエリする xq のすべての値に対してこの四元数を返します。

    例: interp1([0 1 2],quats,2.5,"slerp-natural") は、値 NaN + NaNi + NaNj + NaNk の四元数を返します。

    例: interp1([0 1 2],quats,2.5,"slerp-natural",zeros("quaternion")) は、値 0 + 0i + 0j + 0k の四元数を返します。

    出力引数

    すべて折りたたむ

    内挿値。スカラー、ベクトル、行列、または配列として返されます。vq のサイズは vxq の形状によって異なります。

    v の形状xq の形状vq のサイズ
    ベクトルベクトルsize(xq)size(v) = [1 100]
    size(xq) = [1 500] の場合、
    size(vq) = [1 500] となります。
    ベクトル行列
    または N 次元配列
    size(xq)size(v) = [1 100]
    size(xq) = [50 30] の場合、
    size(vq) = [50 30] となります。
    配列ベクトル[length(xq) size(v,2),...,size(v,n)]size(v) = [100 3]
    size(xq) = [1 500] の場合、
    size(vq) = [500 3] となります。
    配列行列
    または N 次元配列
    [size(xq,1),...,size(xq,n),... size(v,2),...,size(v,m)]size(v) = [4 5 6]
    size(xq) = [2 3 7] の場合、
    size(vq) = [2 3 7 5 6] となります。

    アルゴリズム

    すべて折りたたむ

    参照

    [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.

    [2] Dam, Erik B., Martin Koch, and Martin Lillholm. Quaternions, Interpolation and Animation. Technical Report DIKU-TR-98/5. Department of Computer Science, University of Copenhagen, July 17, 1998. https://web.mit.edu/2.998/www/QuaternionReport1.pdf.

    拡張機能

    すべて展開する

    C/C++ コード生成
    MATLAB® Coder™ を使用して C および C++ コードを生成します。

    バージョン履歴

    R2025a で導入