无法在Unity3D中创建相对四元数

本文关键字:创建 相对 四元数 Unity3D | 更新日期: 2023-09-27 17:50:35

我试图以相同的数量旋转两个四元数(使用相同的四元数)。我有一个绝对位置和一个相对位置(相对于它的父位置),我想将绝对位置旋转到另一个Transform的绝对位置,然后更改存储的相对位置以及存储的绝对位置以再次匹配:

void LateUpdate()
{
    Quaternion newAbsRotation = Quaternion.RotateTowards(absRotationChain[0], boneChain[0].rotation, 0.5f);
    Quaternion modX = Quaternion.Inverse(absRotationChain[0]) * newAbsRotation;
    if(newAbsRotation == (absRotationChain[0] * modX)) {
        Debug.Log("Equal!");
    } else {
        Debug.Log("Unequal!");
    }
    absRotationChain[0] = newAbsRotation;
    // absRotationChain[0] = (absRotationChain[0] * modX) // doesn't work
}

然而,我无法为两个绝对四元数之间的旋转创建一个相对四元数。我在多个来源上读到,它应该是q' = q1-1 * q2,事实上,上面的代码从未打印出"不相等!"。但是,当我替换

时,情况就改变了。
absRotationChain[0] = newAbsRotation

absRotationChain[0] = (absRotationChain[0] * modX)

应该是相等的。而不是仅仅产生相同的结果,四元数迭代接近非常快(在半秒)一个(0,0,0,0)四元数。如果我也用11f替换rotate朝向函数的第三个参数(0.5f),那么我的四元数就变成了(NaN, NaN, NaN, NaN)。

我花了好几个小时来解决这个问题,却找不到问题的原因,更不用说解决方案了。

无法在Unity3D中创建相对四元数

我终于解决了这个问题!!

显然Unity在四元数上存在精度问题。
首先,我所做的四元数==四元数比较并不是真的安全,只是一个近似值(他们甚至在文档中写了!)。所以我发现这两个数字的差别非常小。我猜Unity没有正确规范四元数。

最后,使用
Quaternion.Euler((absRotationChain[0] * modX).eulerAngles)

被证明是一个不错的解决方案-.-'

编辑:哦,看,知道这是一个正常化的问题给我带来了这个链接从一个家伙有同样的问题:https://gamedev.stackexchange.com/questions/74437/unity-quaternion-rotate-unrotate-error