Кватернионы C + OpenGL


Кватернион-это число вида:

a + bi + cj + dk

Верно? Хорошо, но ... ..

  1. Как интерпретировать это число на языке Си?

  2. Если, например, я хочу повернуть куб, что умножить на кватернион? Вектор?

2 2

2 ответа:

Что касается вашего первого вопроса, я думаю, что вы имеете в виду "как я представляю", а не "интерпретирую".

Самый простой способ-использовать struct:

typedef struct quaternion_t {
  double x,y,z,w;
} quaternion_t;
Обратите внимание, что обычная практика, как описано выше, также заключается в использовании x, y, z и w для имен компонентов (но ваше именование вполне приемлемо, если вы знаете, какой из них какой). Использование двойных или одиночных поплавков точности для компонентов зависит от ваших потребностей: точность или пространство.

Простые операции тогда легко выполнить. реализация:

void conjugate(quaternion_t *q){
    q->x = -q->x;
    q->y = -q->y;
    q->z = -q->z;
}

double product(quaternion_t *q1, quaternion_t *q2){
    return q1->x * q2->x + q1->y * q2->y + q1->z * q2->z + q1->w * q2->w;
}

double norm(quaternion_t *q){
    double p = product(q,q);
    return sqrt(p);
}

// etc

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

Обеспечьте хорошее введение.

Независимо от того, кодируете ли вы это в C или C++, математика будет точно такой же.

Смотрите здесь некоторые подробности:

Библиотеки кватернионов в C / C++ http://en.wikipedia.org/wiki/Quaternion http://irrlicht.sourceforge.net/docu/classirr_1_1core_1_1quaternion.html https://irrlicht.svn.sourceforge.net/svnroot/irrlicht/trunk/include/quaternion.h