1. Вопрос-1:
Нужно тупо вращать объект вокруг оси Y.
Как я понимаю для этого нужно завести два кватерниона.
Первый кватернион это текущий поворот и второй кватернион, который будет хранить угол приращения?
Далее обновляем первый путём перемножения или сложения?
Ну и в конце конвертируем в модельную матрицу?
2. Вопрос-2:
Нужно вращать объект вокруг осей X и Y в локальной системе вращаемого объекта.
Тут, допустим есть два кватерниона qX и qY хранящих углы соответственно для оси X, и для оси Y.
Какую операцию нужно провести, чтобы получить искомый кватернион qXY.
В сети полно уроков с различными либами с математикой для кватернионных преобразований, среди которых я никак не могу найти достойный пример по их применению. Но знаю, что есть, раньше попадались, но было не до них. Буду признателен, если кто даст нормальную ссылку на такой источник.ъ
OpenGL версии 1.5 я взял спец. чтобы не морочиться и втыкать главное..
Вот в этих статьях этого нет?
При желании, можно взять какой-нибудь учебник и прочитать страниц 20:
http://padaread.com/?book=28008&pg=33 .. http://padaread.com/?book=28008&pg=53
Конкретно по вопросам:
>Нужно тупо вращать объект вокруг оси Y.
Глобальной оси Y?
>Первый кватернион это текущий поворот и второй кватернион, который будет хранить угол приращения?
Ну, например, да.
Или вместо угла приращения хранить угловую скорость:
\(\omega=2 \dot{q} \circ \bar{q}\)
Или каждый раз вычислять полный кватернион тупо из угла поворота:
\(q=\{ \cos \frac{\varphi(t)}{2},\, 0,\, \sin \frac{\varphi(t)}{2},\, 0 \}\)
Или кватернион угла приращения через dt.
>Далее обновляем первый путём перемножения или сложения?
Сложение поворотов -> произведение кватернионов (они, в общем случае, не коммутируют, естественно).
>Ну и в конце конвертируем в модельную матрицу?
Ну да, если не возникло странного желания использовать glRotatef, параметры которой из кватерниона тоже можно выковырять.
>Нужно вращать объект вокруг осей X и Y в локальной системе вращаемого объекта.
>Тут, допустим есть два кватерниона qX и qY хранящих углы соответственно для оси X, и для оси Y.
>Какую операцию нужно провести, чтобы получить искомый кватернион qXY.
Сложение поворотов не коммутирует. Т. е. "вокруг осей X и Y" - странное выражение.
"Вокруг X, затем вокруг Y" и "вокруг Y, затем вокруг X" - в общем случае дадут разные повороты.
А вообще:
http://padaread.com/?book=28008&pg=47
(то, что ты спрашиваешь - "пассивная точка зрения", насколько я понял).
сделай по простому.. матрицами.. зачем искать гемор в кватернионах ? формулы матриц вращения куча.. заведи floatы в которых храница текущий угол по всем осям.. потом перемножь матрицы и отдай матрицу.. всё.. в конечном итоге всё равно кватернион в матрицу переводить
FordPerfect
За ссылочки спасибо. Такое мне не подалось.
Наверно нужно было вбивать в гугл site:http://www.gamedev.ru кватернион
> Сложение поворотов -> произведение кватернионов
и
> Сложение поворотов не коммутирует
несколько диссонансируют(и именно в этом контексте).
Так как в математике кватернионов сложение и умножение всё-таки разные операции, то если мат-умножение это композиция поворотов, а мат-сложение тогда чему же будет соответствовать?
Клапауций
>мат-умножение это композиция поворотов
Композицию поворотов я назвал (следуя Журавлёву) "сложением поворотов". И ей соответствует произведение кватернионов.
>мат-сложение тогда чему же будет соответствовать
А хрен его знает.
Я какого-то геометрического смысла за этой операцией и не припомню.
Сложение кватернионов возникает, например, в slerp, но самостоятельно - оно, похоже, не особо осмысленно, если речь именно об использовании кватернионов для представления поворотов.
Например, результат сложения, в общем случае,- не единичный.
>не совсем понял, что ты имеешь в виду под "пассивная точка зрения".
Я об вот этом:
http://padaread.com/?book=28008&pg=43
т. е. как раз повороты, задающиеся в локальной (связанной с объектом) системе координат.
В OpenGL 1.5 кватернионы применять все равно нельзя. Т.е. тупо совать некуда .
Клапауций
Если в одной фразе находятся кватернионы и повороты вокруг осей X, Y, Z, то ты что-то делаешь не так.
Кватернионы предназначены для свободных вращений, в этом случае есть только вектор угловой скорости и никаких Эйлеровых углов быть не должно.
FordPerfect
да, я посмотерел эти книги, чем истолковывать эти академические нагромождения, так лучше уж методом тыка(
мне нужно сугубо пару мелких, но очень важных деталей, который на практике помогут исцелить мой батхерт.
Wraith
> В OpenGL 1.5 кватернионы применять все равно нельзя. Т.е. тупо совать некуда .
щто?
void glLoadMatrix[f d] (GLtype *m)
}:+()___ [Smile]
> Если в одной фразе находятся кватернионы и повороты вокруг осей X, Y, Z, то ты
> что-то делаешь не так
может есть необходимость уточнять про локальную или мировую систему координат?
Пока я ещё не экспериментировал с Quaternions, поэтому мне не ясно, как будет выглядеть рассинхронизация мировой и локальной системы координат в процессе вращений в плане того что в результате я желаю получить.
Клапауций
> void glLoadMatrix[f d] (GLtype *m)
Вот именно, матрица. Не кватернион.
Wraith
> Вот именно, матрица. Не кватернион.
void quaternion_fill_opengl_rotation_matrix(quaternion q, GLfloat * m) { vector x, y, z; vector x_t, y_t, z_t; x = make_vector( 1, 0, 0); y = make_vector( 0, 1, 0); z = make_vector( 0, 0, 1); x_t = quaternion_rotate_vector( q, x); y_t = quaternion_rotate_vector( q, y); z_t = quaternion_rotate_vector( q, z); m[ 0] = vector_dot_product( x, x_t); m[ 1] = vector_dot_product( y, x_t); m[ 2] = vector_dot_product( z, x_t); m[ 3] = 0; m[ 4] = vector_dot_product( x, y_t); m[ 5] = vector_dot_product( y, y_t); m[ 6] = vector_dot_product( z, y_t); m[ 7] = 0; m[ 8] = vector_dot_product( x, z_t); m[ 9] = vector_dot_product( y, z_t); m[10] = vector_dot_product( z, z_t); m[11] = 0; m[12] = 0; m[13] = 0; m[14] = 0; m[15] = 1; }
Что не так?
/facepalm
Wraith
> /facepalm
ну а что, существует проблема конвертации кватерниона в матрицу?
В место этого в старом OGL нет необходимости возиться на шейдерах с преобразованиями V'=q V q–1
:)
О-о, мля, и в шейдер, оказывается можно передавать матрицу, вместо того чтобы передавать кватернион!
А смысл тогда вообще использовать кватернионы? Ну считал бы всё изначально в матрицах.
Клапауций
> возиться на шейдерах с преобразованиями V'=q V q–1
Ты так говоришь, будто это что-то плохое.
Я, используя кватернион, часто просто считаю, как будто это ортонормированная матрица поворота 3x3. У меня перегружены операторы умножения так что q*vec == mat3(q)*vec и mat3(q1*q2) == mat3(q1)*mat3(q2). Если есть математическая библиотека, то не надо вникать в детали их реализации, а можно просто использовать так же, как знакомые матрицы.
Но так как ты используешь OpenGL 1.x, то вряд ли у тебя используется какая-то математическая библиотека. Поэтому советую взять GLM.
Delfigamer
> Ты так говоришь, будто это что-то плохое.
нет, мне просто не ясен /facepalm от Wraith
Delfigamer
> А смысл тогда вообще использовать кватернионы?
Разумеется, что шейдеры это наше всё, но ничаво страшного, что я начал из далека.
На данном этапе у меня стоит задача разобраться с практическим применением Quat в отрыве от конкретной версии.
Тема в архиве.