10

I have two vectors describing rotations; a start rotation A and a target rotation B. How would I best go about interpolating A by a factor F to approach B?

Using a simple lerp on the vectors fails to work when more than one dimension needs to be interpolated (i.e. produces undesirable rotations). Maybe building quaternions from the rotation vectors and using slerp is the way to go. But how, then, could I extract a vector describing the new rotation from the resulting quaternion?

Thanks in advance.

4

4 回答 4

9

由于我似乎不明白你的问题,这里有一个使用 numpy 在 python 中的小SLERP实现。我使用 matplotlib (v.99 for Axes3D) 绘制了结果。我不知道你是否可以使用 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(和重整化)仅在向量非常接近时才能正常工作,但当向量距离较远时会导致不需要的结果。

有两种选择:

简单的叉积:

使用叉积确定与 A 和 B 都正交的轴n(注意向量对齐时),并使用点积计算 A 和 B 之间的角度a 。现在你可以简单地通过让a从 0 到a来接近 B (这将是aNew并在 A 上应用aNew关于轴n的旋转。

四元数:

计算将 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 回答