div class="one_answers">
我需要轴和角度来围绕 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>
我认为,在维基上得到了很好的解释 只有你有三个而不是正常的两圈。因此,您必须乘以平转的矩阵,而不是 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]);
如果要在恢复节点值之前,则必须反转它以计算它,并将其反转结果以再次使用它的节点。