查找四元数之间的最短旋转

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了查找四元数之间的最短旋转相关的知识,希望对你有一定的参考价值。

我的问题:

[我正在尝试将Gameobject A与GameObject B的旋转对齐,尽管重要的细节是GoA可以与GoB的旋转进行1:1对齐,或者与GoB的旋转进行逆向对齐(即,一只手用笔尖端捡起铅笔向上,或者相反,尖端朝下)。

我想做的是找到哪个选项(1:1或逆向)是最接近的旋转,所以这将是旋转到的最短路径。

示例:

Scenario A and B where the red line represents GoA, and the black line represents GoB

[在上面的示例中,方案A红线(GoA)应该找到与黑线(GoB)最接近的旋转1:1,而在方案B中,红线应找到与黑色相反的最接近旋转行。

此解决方案需要在3D空间中工作,并避免万向节锁定。

非常感谢您的帮助,如果需要更多信息,我将其编辑到原始帖子上!

谢谢,

Tim

答案

您可以使用Quaternion.Angle来确定哪个与被摄对象的旋转差异较小。 :

Transform target;
Transform subject;

Quaternion subjectRot = subject.rotation;
Quaternion targetRot = target.rotation;
Qutaternion invTargetRot = Quaternion.Inverse(targetRot);

float angleToTarget = Quaternion.Angle(subjectRot, targetRot);
float angleToInvTarget = Quaternion.Angle(subjectRot, invTargetRot);

if (angleToTarget <= angleToInvTarget) 
{
    // align with target is closer
}
else 
{
    // align with inverse of target is closer
}

[如果仅关心对象/目标的前进方向,而不关心对象/目标的局部上/右方向,则可以使用Vector3.Angle比较它们的向前方向,并且如果角度为小于90度,更接近对齐:

Transform target;
Transform subject;

float angleToTarget = Quaternion.Angle(subject.forward, target.forward);

if (angleToTarget <= 90f) 
{
    // align with target is closer
}
else 
{
    // align with inverse of target is closer
}

以上是关于查找四元数之间的最短旋转的主要内容,如果未能解决你的问题,请参考以下文章

python 欧拉角,旋转矩阵,四元数之间转换

统一固定四元数旋转

如何缩放四元数的旋转

四元数绕轴旋转的分量

四元数quaternion

转换矩阵平移矩阵旋转矩阵关系以及python实现旋转矩阵四元数欧拉角之间转换