围绕固定轴的3D旋转

时间:2014-02-07 10:27:40

标签: math 3d linear-algebra x3dom

我需要轴和角度围绕3个固定轴旋转。 我想要的是什么:

输入

  • 角度α(旋转固定x轴)
  • 角度β(旋转圆形 固定的y轴)
  • 角度伽玛(旋转固定的z轴)

输出中

  • 带角度的旋转轴

问题是我总是围绕已旋转的轴旋转。 到目前为止我的代码:

 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:戒指(红色)周围只有一个旋转是正确的。另外两个围绕旋转的物体轴。它们应该在固定的

周围

2 个答案:

答案 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]);

如果你想在恢复节点值之前,你必须反转它来计算它,并将结果反转为再次使用它。