我有两个描述旋转的向量;开始旋转A和目标旋转B.我最好如何用因子F插值A来接近B?
当需要插入多个维度(即产生不合需要的旋转)时,在矢量上使用简单的lerp无法工作。也许从旋转向量构建四元数并使用slerp是可行的方法。但是,如何从结果四元数中提取描述新旋转的向量?
提前致谢。
答案 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)
答案 3 :(得分:1)
如果您已决定使用Quaternions(这将非常好地执行),请参阅我在此处关于实施四元数的资源的答案: Rotating in OpenGL relative to the viewport
您应该在该帖子的链接中找到大量示例。