2015-02-24 67 views
0

昨天我一直在试图解决以下问题:给定其全局旋转四元数和骨架状态,计算骨骼的局部旋转四元数。四元数产品不同于从矩阵产品中提取的四元数

我估计,全球四元数等于乘以骨的地方四元数父骨骼全球:

全球= globalParent *本地

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

本地=(globalParent)-1 *全球

我做了这个等式一些测试,令我惊讶的是,它有时会得到正确的答案有时我会得到正确答案乘以-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”比“枇杷PROD”不同。我使用的模型,可以发现:

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

回答

1

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

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

+0

感谢您的回答!我一直在努力寻找一些关于四元数代数及其应用的好书,你会碰巧知道吗? – 2015-02-24 17:35:01

+0

http://www.crcpress.com/product/isbn/9781568817231 – Hobbes 2015-02-24 21:35:00