10

回転を表す 2 つのベクトルがあります。開始回転 A と目標回転 B です。B に近づくために係数 F で A を補間するにはどうすればよいでしょうか?

複数の次元を補間する必要がある場合 (つまり、望ましくない回転を生成する場合)、ベクトルに単純な lerp を使用しても機能しません。おそらく、回転ベクトルからクォータニオンを構築し、slerp を使用する方法です。しかし、どうすれば、結果の四元数から新しい回転を表すベクトルを抽出できるでしょうか?

前もって感謝します。

4

4 に答える 4

9

私はあなたの質問を理解していないようです。matplotlib (Axes3D の v.99) を使用して結果をプロットしました。Python を使用できるかどうかはわかりませんが、SLERP の実装に似ていますか? 良い結果が得られそうです...

from numpy import *
from numpy.linalg import norm

def slerp(p0, p1, t):
        omega = arccos(dot(p0/norm(p0), p1/norm(p1)))
        so = sin(omega)
        return sin((1.0-t)*omega) / so * p0 + sin(t*omega)/so * p1


# test code
if __name__ == '__main__':
    pA = array([-2.0, 0.0, 2.0])
    pB = array([0.0, 2.0, -2.0])

    ps = array([slerp(pA, pB, t) for t in arange(0.0, 1.0, 0.01)])

    from pylab import *
    from mpl_toolkits.mplot3d import Axes3D
    f = figure()
    ax = Axes3D(f)
    ax.plot3D(ps[:,0], ps[:,1], ps[:,2], '.')
    show()
于 2010-05-21T06:32:01.547 に答える
4

単純な LERP (および再正規化) は、ベクトルが互いに非常に近い場合にのみ正常に機能しますが、ベクトルがさらに離れている場合は望ましくない結果になります。

次の 2 つのオプションがあります。

単純な外積:

外積を使用して A と B の両方に直交する軸nを決定し (ベクトルを揃えるときは注意してください)、内積を使用して A と B の間の角度aを計算します。これで、aを 0 からa (これはaNewになり、Aの軸nを中心にaNewの回転を適用します。

クォータニオン:

A を B に移動する四元数qを計算し、 SLERP を使用して恒等四元数Iでqを内挿します。結果のクォータニオンqNewを A に適用できます。

于 2013-08-09T07:30:14.417 に答える
2

さて、あなたの slerp アプローチは機能し、おそらく計算上最も効率的です (理解するのは少し難しいですが)。クォータニオンからベクトルに戻すには、ここにある式のセットを使用する必要があります

ここにも関連するコードが少しありますが、データの表現方法に対応しているかどうかはわかりません。

于 2010-05-21T04:14:07.050 に答える
1

クォータニオンを使用することに決めた場合 (これは非常にうまく動作します)、クォータニオンを実装するためのリソースに関する私の回答を参照してください: ビューポートに対する OpenGL の回転

その投稿のリンクにたくさんの例があります。

于 2010-05-21T04:15:27.043 に答える