Quaternion - повернуть на

У меня есть объект в мировом пространстве, пустьs сказать в (0,0,0) и хотите повернуть его лицом (10,10,10).

Как мне сделать это с помощью кватернионов?

 Oualid Jabnoune22 окт. 2012 г., 19:04
@ AK4749 хорошо, я понял
 im so confused22 окт. 2012 г., 18:42
@ user1654209, что 'Только половина полезного. Хотя я лично считаю, что кватернионы лучше подходят для однородных преобразований и т. П., В отличие от эйлеровых углов, неверно, что вам нужно делать то, что вы упомянули, чтобы получить кватернионы, которые дали бы заданный результат.
 Oualid Jabnoune22 окт. 2012 г., 18:47
@ AK4749: Не могли бы вы расширить, пожалуйста? Как вы соотносите свой ответ с вращением? Мой комментарий основан на типичном использовании кватернионов в анимации камеры ...
 PeeS22 окт. 2012 г., 18:13
@ AK4749 - Привет, яЯ спрашиваю о математике, которая стоит за кулисами здесь. Имея два вектора Vector, где (1) - это положение объекта, а (2) - это положение, в которое я хочу, чтобы этот объект вращался - как рассчитать кватернион, который будет представлять это вращение?
 im so confused22 окт. 2012 г., 18:56
@ user1654209 это (en.wikipedia.org/wiki/Quaternions_and_spatial_rotation ) ответит на многие ваши вопросы
 Oualid Jabnoune22 окт. 2012 г., 19:03
Спасибо, но мне не нужен курс кватерниона из Википедии:) Я беспокоился о том, чтобы вы нашли мой комментарий наполовину полезным. Я просто хотел знать, почему.
 im so confused22 окт. 2012 г., 18:56
@ user1654209 пока это должно быть в чате,Немного, что может вас удовлетворить - Прежде всего, можно подумать о единичных кватернионахкак севообороты. Они охватывают группу SO (3), которую яя уверен, что тызнакомы с матрицами вращения 3х3, еще одним набором, который охватывает SO (3) - группу операций вращения. Таким образом, лучше всего рассматривать кватернион как вращение (компоненты i, j, k) с необязательным скалярным компонентом (1 компонент) при визуализации кватернионов для этой цели.
 im so confused22 окт. 2012 г., 17:51
Вы спрашиваете о математике вращений кватернионов или как ее реализовать? Если вы понимаете, как работают кватернионы, реализовать их в C ++ довольно просто, и в зависимости от того, является ли это разовым делом, можно выполнить несколько строк математического кода. Если вы нене понимаю кватернионов, это не в том месте
 im so confused22 окт. 2012 г., 18:43
@PeeS см. Мой ответ для псевдокода, который должен сделать математику довольно понятной, но обеспечить отправную точку для вашего кода
 Oualid Jabnoune22 окт. 2012 г., 18:37
Quaternion хороши для интерполяции между матрицами, а не векторами. Вы'Вам понадобится как минимум два набора из двух векторов (позиция + направление), чтобы построить две матрицы (то есть, положение + вращение). Затем вы преобразуете эти матрицы в кватернионы, интерполируете их и преобразовываете обратно в матрицы.
 im so confused22 окт. 2012 г., 19:03
@ user1654209, чтобы прямо ответить на твой вопрос, мой ответ отвечает на его вопрос так, как ему нужно "» кватернион, представляющий вращение, выполняемое для преобразования одного вектора в другой. Алгоритм, который я предоставил, производит (?) Кватернион, который удовлетворяет этому требованию.

Ответы на вопрос(4)

Решение Вопроса

что хотите, чтобы объект "лицо" конкретный момент, но это неДостаточно информации.

Во-первых, что это значит длялицо это направление? В OpenGL это означает, что-z ось в локальной системе отсчета выровнена с указанным направлением в некоторой внешней системе отсчета. Чтобы это выравнивание произошло, нам нужно знать, в каком направлении находится соответствующая ось объекта »лицо».

Тем не менее, это все еще неопределить уникальное преобразование. Даже если вы знаете, в каком направлении-z ось точки, объект все еще может вращатьсявокруг эта ось. Вот почему функцияgluLookAt() требует, чтобы вы предоставилив' направлениеа также ивверх» направление.

Следующее, что нам нужно знать, - это в каком формате должен быть конечный результат? Ориентация объекта часто сохраняется в кватернионном формате. Однако, если вы хотитеграфически поверните объект, тогда вам может понадобиться матрица вращения.

Так что давайте'сделать несколько предположений. Я'Я предполагаю, что ваш объект сосредоточен в миреточка с и имеет выравнивание по умолчанию. Т.е. объект х, уи z оси выровнены с миром x, yи z Оси. Это означает, что ориентация объекта относительно мира может быть представлена как единичная матрица или кватернион идентичности:[1 0 0 0] (используя кватернионное соглашение, где W приходит первым).

Если вы хотите самое короткое вращение, которое выровняет объект-z ось с точкой р: = [p.x p.y p.z], то вы будете вращаться на φ вокруг оси а, Теперь мы'найду эти значения. Сначала мы находим ось нормализуя векторПК а затем взять перекрестное произведение с длиной единицы-z вектор, а затем снова нормализуется:

 = нормализовать (crossProduct (-zнормализовать (ПК)));

Самый короткий угол между этими двумя единичными векторами, найденными путем взятия обратного косинуса их точечного произведения: φ

 = acos (dotProduct (-zнормализовать (ПК)));

К сожалению, это мера абсолютного значения угла, образованного двумя векторами. Нам нужно выяснить, если этоположительный или отрицательный при вращении вокруг, Должен быть более элегантный способ, но первый способ, который приходит на ум, - это найти третью ось, перпендикулярную обеим а также-z и затем возьмите знак от его точечного произведения с нашей целевой осью. Vis: б

 = кроссПродукт (а,-z );

если (dotProduct (бнормализовать (ПК)) <0) φ = -φ;

Как только мы получим нашу ось и угол, легко превратить ее в кватернион: q

 = [cos (φ/ 2) грех (φ/ 2)];

Этот новый кватернион представляет новую ориентацию объекта. Он может быть преобразован в матрицу для визуализации, или вы можете использовать его для непосредственного вращения объекта.s вершины, при желании, используя правила умножения кватернионов.

 PeeS22 окт. 2012 г., 20:38
Большое спасибо за отличное объяснение

представляющего вращение между двумя векторами, можно найти в исходном коде OGRE дляОгре :: Класс Vector3.

ть этостатья для справки о том, как сделать это в C ++

али очень интересный и аккуратный алгоритм поиска квата между двумя векторами, который, как я никогда раньше не видел,Вот, Математически это кажется правильным, и, поскольку ваш вопрос касается математики, яя уверен, что тыЯ смогу конвертировать этот псевдокод в C ++.

quaternion q;
vector3 c = cross(v1,v2);
q.v = c;
if ( vectors are known to be unit length ) {
    q.w = 1 + dot(v1,v2);
} else {
    q.w = sqrt(v1.length_squared() * v2.length_squared()) + dot(v1,v2);
}
q.normalize();
return q;

Дайте мне знать, если вам нужна помощь в разъяснении каких-либо фрагментов этого псевдокода. Должно быть простым, хотя.

dot(a,b) = a1*b1 + a2*b2 + ... + an*bn

а также

cross(a,b) = well, the cross product. it's annoying to type out and
can be found anywhere.
 PeeS22 окт. 2012 г., 20:38
Спасибо за ваше объяснение. Моя проблема была решена благодаря Вашему описанию и JCooper 's.

Ваш ответ на вопрос