昨天我一直在试图解决以下问题:给定其全局旋转四元数和骨架状态,计算骨骼的局部旋转四元数。四元数产品不同于从矩阵产品中提取的四元数
我估计,全球四元数等于乘以骨的地方四元数父骨骼全球:
全球= 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