このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
slerp
球面線形内挿
説明
例
2 つの四元数を作成します。解釈は次のとおりです。
a
= "z" 軸を中心とする 45 度の回転c
= "z" 軸を中心とする -45 度の回転
a = quaternion([45,0,0],"eulerd","ZYX","frame"); c = quaternion([-45,0,0],"eulerd","ZYX","frame");
四元数 a
と c
を指定して slerp
を呼び出し、内挿係数を 0.5 と指定します。
interpolationCoefficient = 0.5; b = slerp(a,c,interpolationCoefficient);
slerp
の出力 b
は、a
と c
の平均回転を表します。検証するには、b
を度単位のオイラー角に変換します。
averageRotation = eulerd(b,"ZYX","frame")
averageRotation = 1×3
0 0 0
内挿係数は 0
以上 1
以下の正規化された値として指定します。内挿係数 0
は a
の四元数に対応し、内挿係数 1
は c
の四元数に対応します。確認するには、係数 0
と 1
を指定して slerp
を呼び出します。
b = slerp(a,c,[0,1]); eulerd(b,"ZYX","frame")
ans = 2×3
45.0000 0 0
-45.0000 0 0
等間隔の内挿係数の配列を指定することで、四元数間の滑らかなパスを作成できます。
path = 0:0.1:1; interpolatedQuaternions = slerp(a,c,path);
単一の軸のみの回転を表す四元数の場合、等間隔の内挿係数を指定すると、結果の四元数でオイラー角が等間隔になります。interpolatedQuaternions
をオイラー角に変換し、パス内の角度の差が一定であることを確認します。
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
あるいは、関数 dist
を使用して、内挿された四元数間の距離が一定であることを確認できます。関数 dist
は角距離をラジアン単位で返します。比較しやすいように度単位に変換します。
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
SLERP アルゴリズムでは、2 つの四元数を連結する大圏パスに沿って内挿を行います。この例では、SLERP アルゴリズムで大圏パスがどのように最小化されるかを示します。
4 つの四元数を定義します。
q0
- グローバル座標系から回転していないことを示す四元数q179
- "z" 軸を中心とする 179 度の回転を示す四元数q180
- "z" 軸を中心とする 180 度の回転を示す四元数q181
- "z" 軸を中心とする 181 度の回転を示す四元数
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");
slerp
を使用して、q0
と 3 つの四元数回転の間を内挿します。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","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)")
q0
と q179
の間のパスは、時計回りで大圏距離を最小化します。q0
と q181
の間のパスは、反時計回りで大圏距離を最小化します。q0
と q180
の間のパスは、数値の丸めに応じて時計回りか反時計回りのいずれかになります。
2 つの四元数を作成します。
q1 = quaternion([0 0 0],"eulerd","ZYX","frame"); q2 = quaternion([-180 90 180],"eulerd","ZYX","frame");
内挿係数を定義します。
T = 0:0.01:1;
"short"
と "natural"
の両方の内挿法を使用して四元数を内挿します。
quats_natural = slerp(q1,q2,T,"natural"); quats_short = slerp(q1,q2,T,"short");
対応する回転の点を取得します。
pts_natural = rotatepoint(quats_natural,[1.05 0 0]); pts_short = rotatepoint(quats_short,[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_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")
入力引数
内挿する四元数。quaternion
オブジェクト、任意の次元の quaternion
オブジェクトの配列として指定します。
q1
、q2
、および T
のサイズは互換性がなければなりません。最も簡単なケースでは、それらを同じサイズにするか、いずれかをスカラーにすることができます。すべての次元について、入力の次元サイズが同じであるか、いずれかが 1 であれば、2 つの入力のサイズには互換性があります。
出力引数
内挿された四元数。quaternion
オブジェクト、または quaternion
オブジェクトの配列として返されます。
アルゴリズム
四元数の球面線形内挿 (SLERP) は、平面に沿った線形内挿を 3 次元の球面内挿に拡張したものです。このアルゴリズムは、[1]で初めて提案されました。2 つの四元数 q1 と q2 を与えると、SLERP は q1 と q2 を連結する大圏に沿って新しい四元数 q0 を内挿します。内挿係数 T により、出力の四元数が q1 と q2 のいずれかにどの程度近くなるかが決まります。
SLERP アルゴリズムは正弦波で記述できます。
ここで、q1 と q2 は正規化された四元数、θ は q1 と q2 の間の角距離の半分です。
参照
[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.
拡張機能
C/C++ コード生成
MATLAB® Coder™ を使用して C および C++ コードを生成します。
バージョン履歴
R2020b で導入"natural"
パス オプションを使用した球面に沿った内挿により、始点と終点の四元数の向きに沿った、より滑らかな遷移が可能です。内挿法は method
引数を使用して指定します。
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
Web サイトの選択
Web サイトを選択すると、翻訳されたコンテンツにアクセスし、地域のイベントやサービスを確認できます。現在の位置情報に基づき、次のサイトの選択を推奨します:
また、以下のリストから Web サイトを選択することもできます。
最適なサイトパフォーマンスの取得方法
中国のサイト (中国語または英語) を選択することで、最適なサイトパフォーマンスが得られます。その他の国の MathWorks のサイトは、お客様の地域からのアクセスが最適化されていません。
南北アメリカ
- América Latina (Español)
- Canada (English)
- United States (English)
ヨーロッパ
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)