为什么SLERP不对测地线进行插值?

问题描述

不确定我应该在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>

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...