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