手动将3D对象的局部UP轴旋转到World的UP轴?

时间:2019-05-06 16:33:07

标签: 3d rotation quaternions godot gdscript

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

我需要将对象的局部UP轴插向世界的UP轴,而又不碰触该对象的其他局部旋转(想象一个浮标在受到海浪撞击后会自动纠正)。

但是,我只能设法同时将对象的所有轴“向着世界的所有轴”插值,从而有效地将我的对象与世界对齐,就像训练有素的朝鲜阅兵一样。

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

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

是否有任何建议将此插值隔离到对象的局部UP轴上?

1 个答案:

答案 0 :(得分:0)

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

您要寻找的是一个四元数,它表示两个UP向量之间的轴角旋转。可以使用两个向量中的cross-product来计算旋转轴,使用dot-product来计算两个向量和formula to create a quaternion of an axis and an angle之间的角度(的余弦)。 >

根据实现所使用的框架,可能已经在quaternion类上实现了类似的方法。例如,OpenEXR的Imath::Quaternion类包括一个setRotation() method,实现了上述算法的稍微高级的版本。