Серия кватернионов

0

Пожалуйста, извините мое невежество в отношении кватернионов (пытаясь узнать их, когда я печатаю это). В контексте 3D-графики предположим, что у меня есть точка p1, которая трансформируется серией кватернионов от q0 до qn, уступая точке p2. Зная все кватернионы, чтобы получить от p1 до p2, можно ли сделать обратное, чтобы вернуться к p1?

Я пробовал что-то глупое, но это не дало мне того, что я хотел:

int main(void)
{
    vmath::vec4 p1(4.0f, 3.0f, 2.0f, 1.0f);
    print_vec4(p1);

    vmath::quaternion q1(1.0f, 0.0f, 0.0f, M_PI);
    vmath::vec4 p2 = p1 * q1.asMatrix();
    print_vec4(p2);

    vmath::quaternion q2(q1);
    q2 = q2.conjugate();
    p2 = p2 * q2.asMatrix();
    print_vec4(p2);

    return 0;
}
  • 1
    Я догадываюсь сейчас, но что произойдет, если вы сначала нормализуете q1, прежде чем делать что-то еще? Или замените q2 = q2.conjugate(); с q2 = q2.conjugate() / (q2.length() * q2.length()); ? РЕДАКТИРОВАТЬ: исправлена ошибка, это должно быть q2.length () в квадрате.
  • 0
    Вы должны опубликовать здесь math.stackexchange.com , возможно, использовать язык сценариев, чтобы ознакомиться с кватернионами и немного поиграть с ними перед написанием кода на C ++ (что является гораздо более утомительным занятием по сравнению с тем, как вы это делаете сейчас), помните, что кватернион так сказать состоит из 4 элементов: 1 скалярного и 3 мнимых чисел; это даже не близко к тому, что вы делаете. Выберите книгу по математике, прежде чем пытаться использовать C ++ для этого.
Показать ещё 1 комментарий
Теги:
series
quaternions

1 ответ

0
Лучший ответ

T = q1 * q2 *... qn обратное преобразование к этому равно T ^ -1 = qn ^ -1.. * q2 ^ -1 * q1 ^ 1; где "^ 1" означает "обратный", для кватерниона единичной длины мы можем отменить знак "векторных" (x, y, z) компонент для обратной операции.

И хотя бы

p2 = T * p1; и p1 = T ^ -1 * p2

  • 0
    Спасибо за разъяснение этого. Оценил!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню