ПрограммированиеФорумОбщее

Вращение и кватернионы. Сборник рецептов. (Комментарии к статье) (2 стр)

Страницы: 1 2 3 Следующая »
#15
16:16, 7 янв 2009

Можно чуть оптимальнее.

    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();
    }

#16
12:03, 3 фев 2009

есть три точки
A (где мы щас расположены)
B (куда мы смотрим)
C (куда нам надо смотреть)

соответственно есть вектора BA (текущее направление) и CA(искомое направление). Как можно получить углы поворота между этими векторами по всем трем осям?

#17
16:33, 3 фев 2009

> Как можно получить углы поворота между этими векторами по всем трем осям?

Что это означает ?  углы поаорота складываютс некомутативно .

#18
15:36, 1 июня 2009

Заинтересовала реализация функции shortest_arc. Есть несколько вопросов:
- Правильно ли я понял, что оператор % для векторов (from%to) - это скалярное произведение?
- Есть ли где посмотреть математические выкладки как получилась такая вот версия?
- Требует ли последняя реализаци (из  сообщения 15), чтобы входящие from и to были нормализованы?

#19
15:51, 1 июня 2009

Если объяснять совсем просто , то это интерполяция между 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.
    }

Прошло более 7 месяцев
#20
14:57, 13 янв 2010

В статье есть ошибка в формуле нахождения инверсного кватерниона. Там деление на N(q),а N(q) подсчитывается как N(q) = xx + yy + zz + ww. Т.е. потерялся квадратный корень.

Прошло более 8 месяцев
#21
16:38, 12 сен 2010

Ошибка в тексте

Для понимания того, как хранит вращение кватернион, вспомним про двумерные вращения. Вращение в плоскости можно задать матрицей 2x2, в которой будут записаны косинусы и синусы угла поворота. Можно представить, что кватернион хранит комбинацию оси вращения и матрицы половины поворота вокруг этой оси.

Нет буквы "х"

#22
18:02, 12 сен 2010

Vitalij_Serov
Лол

#23
16:01, 28 окт 2010

Вот сказано в статье, что угловую скорость/ускорение хранят в виде вектора. А как преобразовать эту угловую скорость в кватернион, так чтобы результат был однозначен? Функция преобразования из Axis вроде бы не годится.

#24
17:03, 28 окт 2010

Поэтому и хранят в виде вектораб что в кватернионе нельзя однозначно.

#25
17:26, 28 окт 2010

Ну а как тогда быть?

Допустим, некий объект имеет 6 пар двигателей, которые позволяют ему вращаться вокруг любой оси. Если включить одновременно несколько из них, вроде бы результирующее вращение будет вполне однозначно.

Алгоритм такой примерно:
1) Формируем вектор углового ускорения в соответствии с набором "включенных двигателей" (в каждую компоненту записывается -1, 0 или 1)
2) Поскольку "двигатели" вращаются вместе с объектом, поворачиваем вектор на кватернион ориентации (??? возможно, тут надо повернуть в противоположном направлении)
3) Прибавляем к вектору угловой скорости объекта полученный вектор, умноженный на время (??? вроде так можно делать)
4) Преобразуем новый вектор угловой скорости в кватернион (??? как это сделать?)
5) Умножаем кватернион ориентации объекта на полученный кватернион.

#26
18:27, 28 окт 2010

Вы ошибаетесь думая что можно угловую скорость перевести в кватернион.  Мне кажется вы путаете угловую скорость и ориентацию.

Из угловой скорости и времени можно получить ПОВОРОТ совершенный за это время. Поворот задает изменение ориентации которое можно перевести в кватернион.

Результирующая ориентация это q1 * q2 где q1 ориентация в момент времени 0 и q2 изменение ориентации из 0 в о время t.

#27
19:49, 28 окт 2010

> Из угловой скорости и времени можно получить ПОВОРОТ совершенный за это время. Поворот задает изменение ориентации которое можно перевести в кватернион.

вот как это сделать, я собственно и хотел спросить

#28
13:59, 2 ноя 2010

Легко. Если у вас угловая скорость задается в Радианы в секунды , прсто взять ось вращения и длину вектора как ось и угол Axis Angle.

#29
11:09, 29 ноя 2010

у меня вопрос,
допустим в каждый момент времени t_n у нам имеются показания значений угловой скорости допустим машины. По осям X, Y, Z.
как получить из угловой скорости (wx, wy, wz) кватернион?
Причем учесть предыдущий поворот тоже, в момент времени t_{n-1}.

Страницы: 1 2 3 Следующая »
ПрограммированиеФорумОбщее

Тема в архиве.