我需要轴和角度围绕3个固定轴旋转。 我想要的是什么:
输入:
输出中:
问题是我总是围绕已旋转的轴旋转。 到目前为止我的代码:
var q1 = x3dom.fields.Quaternion.axisAngle(new x3dom.fields.SFVec3f(0, 0, 1), alpha)
var q2 = x3dom.fields.Quaternion.axisAngle(new x3dom.fields.SFVec3f(1, 0, 0), beta)
var q3 = x3dom.fields.Quaternion.axisAngle(new x3dom.fields.SFVec3f(0, 1, 0), gamma)
var qr = q1.multiply(q2);
qr = qr.multiply(q3);
var r = qr.toAxisAngle();
this.curNode.attr('rotation', r[0].x + ' ' + r[0].y + ' ' + r[0].z + ' ' + r[1]);
Video:戒指(红色)周围只有一个旋转是正确的。另外两个围绕旋转的物体轴。它们应该在固定的轴
周围答案 0 :(得分:0)
我认为,在wiki上有很好的解释。只有正常的两个回合,你才有三个。所以,你必须乘以不是2,而是三个平转矩阵。就是这样。
答案 1 :(得分:0)
问题是你正在旋转局部节点轴,对于mantani轴固定你需要对节点使用反四元数,但只有节点,要计算旋转,你需要使用原始四元数。像这样:
var q1 = x3dom.fields.Quaternion.axisAngle(new x3dom.fields.SFVec3f(0, 0, 1), alpha)
var q2 = x3dom.fields.Quaternion.axisAngle(new x3dom.fields.SFVec3f(1, 0, 0), beta)
var q3 = x3dom.fields.Quaternion.axisAngle(new x3dom.fields.SFVec3f(0, 1, 0), gamma)
var qr = q1.multiply(q2);
qr = qr.multiply(q3);
var r = qr.toAxisAngle();
r = r.inverse();
this.curNode.attr('rotation', r[0].x + ' ' + r[0].y + ' ' + r[0].z + ' ' + r[1]);
如果你想在恢复节点值之前,你必须反转它来计算它,并将结果反转为再次使用它。