Можно чуть оптимальнее.
inline void shortest_arc(const vector3& from, const vector3& to )
{
vector3 c( from*to );
set( c.x, c.y, c.z, from%to );
w += magnitude(); // reducing angle to halfangle
if( w <= TINY ) // angle close to PI
{
if( ( from.z*from.z ) > ( from.x*from.x ) )
set( 0, from.z, - from.y, w ); //from*vector3(1,0,0)
else
set( from.y, - from.x, 0, w ); //from*vector3(0,0,1)
}
normalize();
}
есть три точки
A (где мы щас расположены)
B (куда мы смотрим)
C (куда нам надо смотреть)
соответственно есть вектора BA (текущее направление) и CA(искомое направление). Как можно получить углы поворота между этими векторами по всем трем осям?
> Как можно получить углы поворота между этими векторами по всем трем осям?
Что это означает ? углы поаорота складываютс некомутативно .
Заинтересовала реализация функции shortest_arc. Есть несколько вопросов:
- Правильно ли я понял, что оператор % для векторов (from%to) - это скалярное произведение?
- Есть ли где посмотреть математические выкладки как получилась такая вот версия?
- Требует ли последняя реализаци (из сообщения 15), чтобы входящие from и to были нормализованы?
Если объяснять совсем просто , то это интерполяция между 2мя кватернионами , единичного (0,0,0,1) и данного единичного(x,y,z,w) , получаем половину вращения.
если сложно то вам сюда
http://www.euclideanspace.com/maths/algebra/vectors/angleBetween/minorlogic.htm
"% для векторов (from%to) - это скалярное произведение? " - да
в простой форме
inline void shortest_arc(const vector3& from, const vector3& to )
{
vector3 crossV( cross(from, to) );
set( c.x, c.y, c.z, dot(from,to) );
// contains quaternion of "double angle" rotation from to. can be non unit.
w += magnitude(); // reducing angle to halfangle but nonunit
normalize(); // make unit if required, but it is optional.
}
В статье есть ошибка в формуле нахождения инверсного кватерниона. Там деление на N(q),а N(q) подсчитывается как N(q) = xx + yy + zz + ww. Т.е. потерялся квадратный корень.
Ошибка в тексте
Для понимания того, как хранит вращение кватернион, вспомним про двумерные вращения. Вращение в плоскости можно задать матрицей 2x2, в которой будут записаны косинусы и синусы угла поворота. Можно представить, что кватернион хранит комбинацию оси вращения и матрицы половины поворота вокруг этой оси.
Нет буквы "х"
Vitalij_Serov
Лол
Вот сказано в статье, что угловую скорость/ускорение хранят в виде вектора. А как преобразовать эту угловую скорость в кватернион, так чтобы результат был однозначен? Функция преобразования из Axis вроде бы не годится.
Поэтому и хранят в виде вектораб что в кватернионе нельзя однозначно.
Ну а как тогда быть?
Допустим, некий объект имеет 6 пар двигателей, которые позволяют ему вращаться вокруг любой оси. Если включить одновременно несколько из них, вроде бы результирующее вращение будет вполне однозначно.
Алгоритм такой примерно:
1) Формируем вектор углового ускорения в соответствии с набором "включенных двигателей" (в каждую компоненту записывается -1, 0 или 1)
2) Поскольку "двигатели" вращаются вместе с объектом, поворачиваем вектор на кватернион ориентации (??? возможно, тут надо повернуть в противоположном направлении)
3) Прибавляем к вектору угловой скорости объекта полученный вектор, умноженный на время (??? вроде так можно делать)
4) Преобразуем новый вектор угловой скорости в кватернион (??? как это сделать?)
5) Умножаем кватернион ориентации объекта на полученный кватернион.
Вы ошибаетесь думая что можно угловую скорость перевести в кватернион. Мне кажется вы путаете угловую скорость и ориентацию.
Из угловой скорости и времени можно получить ПОВОРОТ совершенный за это время. Поворот задает изменение ориентации которое можно перевести в кватернион.
Результирующая ориентация это q1 * q2 где q1 ориентация в момент времени 0 и q2 изменение ориентации из 0 в о время t.
> Из угловой скорости и времени можно получить ПОВОРОТ совершенный за это время. Поворот задает изменение ориентации которое можно перевести в кватернион.
вот как это сделать, я собственно и хотел спросить
Легко. Если у вас угловая скорость задается в Радианы в секунды , прсто взять ось вращения и длину вектора как ось и угол Axis Angle.
у меня вопрос,
допустим в каждый момент времени t_n у нам имеются показания значений угловой скорости допустим машины. По осям X, Y, Z.
как получить из угловой скорости (wx, wy, wz) кватернион?
Причем учесть предыдущий поворот тоже, в момент времени t_{n-1}.
Тема в архиве.