围绕固定轴的 3D 旋转



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

输入

  • 角度 Alpha(绕固定 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]);

视频:只有围绕环旋转一个(红色的)是正确的。 另外两个围绕旋转的对象轴。它们应该围绕固定轴<</p>

div class="one_answers">

我认为,在维基上得到了很好的解释 只有你有三个而不是正常的两圈。因此,您必须乘以平转的矩阵,而不是 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]);

如果要在恢复节点值之前,则必须反转它以计算它,并将其反转结果以再次使用它的节点。

最新更新