3D вращение вокруг неподвижных осей

Мне нужны ось и угол для вращения вокруг 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 ответа

Решение

Я думаю, это очень хорошо объясняется в вики. Только вместо двух обычных ходов у вас их три. Итак, вам нужно умножить не 2, а три матрицы плоских поворотов. Это все.

Проблема в том, что вы вращаете ось локального узла, чтобы фиксированная ось Мантани вам понадобилась использовать обратный кватернион для узла, но только для узла, чтобы вычислить вращение, вам нужно использовать исходный кватернион. Как это:

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

Если вы хотите до восстановления значения узла, вы должны инвертировать его, чтобы вычислить, и инвертировать результат, чтобы использовать его снова.

Другие вопросы по тегам