四元数产物不同于从基质产物中提取的四元数

时间:2015-02-24 14:27:11

标签: three.js quaternions

昨天我一直试图解决以下问题:计算骨骼的局部旋转四元数,给出其全局旋转四元数和骨架状态。

我认为全局四元数等于父骨骼全局乘以骨骼的局部四元数:

global = globalParent * local

经过几次简单的操作后,我得到了以下内容:

local =(globalParent) -1 * global

我对这个等式进行了一些测试,令我惊讶的是,它有时会产生正确的答案,有时我会得到正确的答案乘以-1。不是局部四元数的共轭,而是整个四元数乘以-1。

所以我回到了原始的等式(global = globalParent * local)并进行了测试。同样的事情发生了,有时正确的答案,有时正确的答案乘以-1。

我发现这很奇怪,并进一步制作矩阵产品(globalParent * local)并提取结果的四元数。在这种情况下,我总能得到正确的答案。

最后,我的问题非常简单。在操纵四元数时,我的思维过程中的错误在哪里?

我用来检查我所说的内容的代码如下:

{
    var p = new THREE.Vector3();
    var s = new THREE.Vector3();
    var bone = this.get_model_bone(label);

    var gm = bone.matrixWorld;
    var g = new THREE.Quaternion();
    gm.decompose(p, g, s);
    console.log(label + " - GLOBAL: (" + g.x + ", " + g.y + ", " + g.z + ", " + g.w + ")");

    var m = bone.matrix;
    var q = new THREE.Quaternion();
    m.decompose(p, q, s);
    console.log(label + " - LOCAL: (" + q.x + ", " + q.y + ", " + q.z + ", " + q.w + ")");

    if(bone.parent !== null)
    {
        var gpm = bone.parent.matrixWorld;
        var gp = new THREE.Quaternion();
        gpm.decompose(p, gp, s);
        console.log(label + " - PARENT GLOBAL: (" + gp.x + ", " + gp.y + ", " + gp.z + ", " + gp.w + ")");

        var productMatrix = new THREE.Matrix4().multiplyMatrices(gpm, m);
        var qprod = new THREE.Quaternion();
        productMatrix.decompose(p, qprod, s);
        console.log(label + " - MATRIX PROD: (" + qprod.x + ", " + qprod.y + ", " + qprod.z + ", " + qprod.w + ")");

        var gpq = new THREE.Quaternion().multiplyQuaternions(gp, q);
        console.log(label + " - QUAT PROD: (" + gpq.x + ", " + gpq.y + ", " + gpq.z + ", " + gpq.w + ")");
    }
}

在我的日志中,有时“MATRIX PROD”与“QUAT PROD”不同。我正在使用的模型可以在以下网址找到:

https://raw.githubusercontent.com/poli-libras/virtual-jonah2/master/resources/model/human.js

1 个答案:

答案 0 :(得分:1)

  

我对这个等式进行了一些测试,令我惊讶的是,它有时会产生正确的答案,有时我会得到正确的答案乘以-1。

四元数和四元数乘以-1表示完全相同的变换(旋转)。