如何插入旋转?

时间:2010-05-21 03:45:08

标签: math 3d matrix rotation quaternions

我有两个描述旋转的向量;开始旋转A和目标旋转B.我最好如何用因子F插值A来接近B?

当需要插入多个维度(即产生不合需要的旋转)时,在矢量上使用简单的lerp无法工作。也许从旋转向量构建四元数并使用slerp是可行的方法。但是,如何从结果四元数中提取描述新旋转的向量?

提前致谢。

4 个答案:

答案 0 :(得分:9)

因为我似乎不理解你的问题,所以这里有一个使用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()

答案 1 :(得分:4)

简单的LERP(和重整化)只有在向量非常接近时才能正常工作,但是当向量进一步分开时会导致不需要的结果。

有两种选择:

简单的交叉产品:

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

四元数:

计算将A移动到B的四元数 q ,并使用SLERP使用标识四元数 I 插入 q 。然后,可以在A上应用生成的四元数 qNew

答案 2 :(得分:2)

嗯,你的slerp方法可行,并且可能在计算上效率最高(即使它有点难以理解)。要从四元数回到向量,您需要使用一组公式here

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

答案 3 :(得分:1)

如果您已决定使用Quaternions(这将非常好地执行),请参阅我在此处关于实施四元数的资源的答案: Rotating in OpenGL relative to the viewport

您应该在该帖子的链接中找到大量示例。