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

问题描述 投票:0回答:1

我的问题:

[我正在尝试将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

c# unity3d difference quaternions
1个回答
0
投票

您可以使用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
}
© www.soinside.com 2019 - 2024. All rights reserved.