如何插值旋转?

问题描述 投票:0回答:4

我有两个描述旋转的向量;起始旋转 A 和目标旋转 B。我如何最好地通过因子 F 对 A 进行插值以接近 B?

当需要插值多个维度时(即产生不需要的旋转),在向量上使用简单的 lerp 不起作用。也许从旋转向量构建四元数并使用 Slerp 是可行的方法。但是,那么,我如何从生成的四元数中提取描述新旋转的向量呢?

math 3d matrix rotation quaternions
4个回答
11
投票

因为我似乎不明白你的问题,这里有一个使用 numpy 在 python 中实现的一些 SLERP 。我使用 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()

4
投票

简单的 LERP(和重整化)仅在向量非常接近时才能正常工作,但当向量相距较远时会导致不需要的结果。

有两种选择:

简单叉积:

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

四元数:

计算将 A 移动到 B 的四元数 q,并使用 SLERP 将 q 与恒等四元数 I 进行插值。然后可以将得到的四元数qNew应用于A。


2
投票

嗯,你的 slerp 方法会起作用,并且可能在计算上是最有效的(尽管它有点难以理解)。要从四元数返回到向量,您需要使用一组公式,您可以在here找到。

还有一些相关代码here,尽管我不知道它是否符合您数据的表示方式。


1
投票

如果您决定使用四元数(它会很好地工作),请参阅我的答案,了解实现四元数的资源: 在 OpenGL 中相对于视口旋转

您应该在那篇文章的链接中找到大量示例。

© www.soinside.com 2019 - 2024. All rights reserved.