2015-02-24 99 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