Трехмерное вращение вокруг фиксированных осей

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

Видео: правильно только одно вращение вокруг кольца (красное). два других - вокруг осей повернутого объекта. Они должны располагаться вокруг фиксированных осей.


person daniel    schedule 07.02.2014    source источник
comment
Какая у тебя проблема с кодом? Вы пытались изменить порядок вращения?   -  person Nico Schertler    schedule 07.02.2014
comment
это больше математическая задача   -  person daniel    schedule 07.02.2014
comment
Я все еще не вижу твоей проблемы.   -  person Nico Schertler    schedule 07.02.2014
comment
upated: видео для разъяснения   -  person daniel    schedule 07.02.2014
comment
Вы уверены, что SFVec3f(1, 0, 0) относится к оси Y? И имейте в виду, что повороты не коммутативны, если вы примените их в неправильном порядке, вы получите неправильный результат.   -  person pentadecagon    schedule 07.02.2014
comment
Тогда вы должны хранить поворот объекта не как три угла, а как один кватернион (или матрицу). Затем вы можете умножить новое вращение на этот кватернион, и вам не нужно заботиться о каком-либо порядке вращения.   -  person Nico Schertler    schedule 07.02.2014
comment
+1 для Нико. Мышление с точки зрения углов для представления ориентаций в 3D обычно (как в этом случае) добавляет ненужной сложности системе. Сохраните свою ориентацию как Matrix или Quat и откройте для себя простоту.   -  person Steve H    schedule 22.02.2014


Ответы (2)


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

person Gangnus    schedule 07.02.2014

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

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

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

person Snowww    schedule 28.05.2015