0

我的对象可以在世界上进行任何(未知)旋转。

我需要插入这个对象的局部上轴,朝向世界的上轴,而不触及对象的其他局部旋转(想象一个浮标在波浪撞击后自行恢复)。

但是,我只能同时将所有对象的轴“朝向所有世界的轴”插入,有效地将我的对象与世界对齐,就像一个训练有素的朝鲜阅兵式士兵一样。

我正在使用此代码来完成我的失败:

var TopQuat:Quat = Quat(0,0,0,1)
transform.basis = Basis(Quat(transform.basis).slerp(TopQuat,delta))

将这种插值隔离到我的对象的本地上轴的任何提示?

4

1 回答 1

1

四元数SLERP将在两个方向四元数之间进行插值 - 即,当插值权重达到 1.0 时,您的对象的框架将与世界框架匹配。

您正在寻找的是一个四元数,它表示两个 UP 向量之间的轴角旋转。这可以使用两个向量的叉积来计算旋转轴,使用点积来计算两个向量之间的角度(的余弦)以及创建轴和角度的四元数的公式来计算

根据您用于实现的框架,您可能已经在四元数类上实现了这样的方法。例如,OpenEXR 的Imath::Quaternion类包括一个setRotation()方法,它实现了上述算法的稍微高级的版本。

于 2019-05-07T23:00:35.070 回答