0

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

输入

  • 角度 alpha(围绕固定 x 轴旋转)
  • 角度 beta(绕固定 y 轴旋转)
  • 角度 gamma(绕固定 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]);

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

4

2 回答 2

1

我认为,它在wiki上得到了很好的解释。只有你有三个,而不是正常的两个回合。所以,你必须乘以不是 2,而是三个平转矩阵。就这些。

于 2014-02-07T16:26:30.300 回答
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]);

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

于 2015-05-28T22:40:38.150 回答