问题描述
不确定我应该在Math SE还是此处进行操作,所以请告诉我。
我尝试实现一种SLERP算法,该算法显示给定经过的时间量,单位球体上的点移动到了哪里,但是我发现结果并没有遵循最短的路径,因为我希望SLERP可以帮助我做到这一点。我想我尝试使用四元数的轴表示点的位置时出了点问题?
这是我的代码:
from pyquaternion import Quaternion as pyQ
import math
ts = (np.linspace(0,10,11))/10
def rotate_upon_t(time,start,end):
for t in time:
result = start*(((start)**(-1)) * end)**t
print(result.axis)
rotate_upon_t(ts,q0,q1)
测试用例:
q0 = pyQ(axis = [0.5*math.sqrt(2),-0.5*math.sqrt(2)],degrees = 180)
q1 = pyQ(axis = [0.5,0.5,degrees = 180)
经过10个时间步的结果(第{行显示时间t = i
时的位置)
[ 0.70710678 0. -0.70710678]
[ 0.69515821 0.05256703 -0.71693219]
[ 0.68112236 0.10497623 -0.72460494]
[ 0.66504138 0.15707022 -0.73010199]
[ 0.64696353 0.20869259 -0.73340684]
[ 0.62694312 0.25968834 -0.73450956]
[ 0.60504025 0.30990436 -0.73340684]
[ 0.58132068 0.35918985 -0.73010199]
[ 0.55585564 0.40739684 -0.72460494]
[ 0.52872159 0.45438058 -0.71693219]
[ 0.5 0.5 -0.70710678]
我希望该点的最后一列(z坐标)为常数(-0.5*math.sqrt(2))
,因为该值也是起点和终点(q0.axis
和{{1 }}。我的期望有什么错误吗?
解决方法
我相信您想插入两个3D向量,而不是两个四元数。
让我们说您想使用SLERP从V1到V2生成测地线G,其中V1和V2是单位3D矢量。首先,我将V1和V2嵌入为纯四元数Q1,Q2。从Q1旋转到Q2的四元数Q为:
Q =归一化(Q2 + Q1)* Q1
插值Q(t)为
Q(t)= Q ^ t
或等效地:
Q(t)= exp(t * log(Q))
其中t是介于0和1之间的标量。
最后,测地线G(t)为:
G(t)= Q(t)* Q1 *共轭(Q(t))
注意:乘积*是四元数乘积。
,编辑:我忘记了飞机的飞行路径可能不是沿着相同的高度,即使两端都没有。证明沿着“弯曲”路径(例如,从东京到纽约)驾驶飞机比“直线”飞行更省油,但是意识到这一事实足以让我知道这个问题足够愚蠢。 / p>