昨天我一直在試圖解決以下問題:給定其全局旋轉四元數和骨架狀態,計算骨骼的局部旋轉四元數。四元數產品不同於從矩陣產品中提取的四元數
我估計,全球四元數等於乘以骨的地方四元數父骨骼全球:
全球= 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
感謝您的回答!我一直在努力尋找一些關於四元數代數及其應用的好書,你會碰巧知道嗎? – 2015-02-24 17:35:01
http://www.crcpress.com/product/isbn/9781568817231 – Hobbes 2015-02-24 21:35:00