Math 围绕固定轴的三维旋转

Math 围绕固定轴的三维旋转,math,3d,linear-algebra,x3dom,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(ne

我需要围绕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]);

:只有一个旋转环(红色)是正确的。其他两个围绕旋转的对象轴。它们应该围绕着固定轴

我认为,这是非常好的解释,而不是正常的两圈,你有三个。所以,你不需要乘以2,而是乘以三个平面转弯的矩阵。仅此而已。

问题是您正在旋转局部节点轴,对于固定的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]);

如果要在恢复节点值之前,必须先将其反转以计算它,然后将结果反转以再次将其用于节点。

代码有什么问题?你试过反转旋转顺序吗?这更像是一个数学问题。我仍然看不到你的问题。升级:用于澄清的视频。你不应该将对象的旋转存储为三个角度,而是存储为一个四元数(或矩阵)。然后你可以将一个新的旋转乘以这个四元数,而不必关心任何旋转顺序。