我的对象在世界上可以有任何(未知)旋转。
我需要将对象的局部UP轴插向世界的UP轴,而又不碰触该对象的其他局部旋转(想象一个浮标在受到海浪撞击后会自动纠正)。
但是,我只能设法同时将对象的所有轴“向着世界的所有轴”插值,从而有效地将我的对象与世界对齐,就像训练有素的朝鲜阅兵一样。
我正在使用以下代码来完成我的失败:
var TopQuat:Quat = Quat(0,0,0,1)
transform.basis = Basis(Quat(transform.basis).slerp(TopQuat,delta))
是否有任何建议将此插值隔离到对象的局部UP轴上?
答案 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,实现了上述算法的稍微高级的版本。