В настоящее время я создаю свою собственную камеру кватерниона. Насколько я знаю, вам нужен только один кватернион, чтобы полностью указать ориентацию камеры (поправьте меня, если я ошибаюсь). Итак, как бы я занялся созданием матрицы вида? Кстати, я использую C ++ в качестве языка программирования.
Любая помощь будет оценена.
Сначала несколько предостережений. Вы увидите множество явно противоречивых формул в сети и в литературе по этому вопросу. Большинство конфликтов очевидны только. Некоторые из них являются настоящими конфликтами, но это потому, что кто-то неправильно понял математику. Проблема в том, что не существует единственно правильного способа сделать это. Вам необходимо знать, как вы используете кватернионы и матрицы, как их использует источник и как исправить эти очевидные расхождения.
Вращение против преобразования
С вашей камерой связана система отсчета, а также базовое пространство. Представляет ли ваша матрица физическое вращение камеры из нижележащего пространства в ориентацию камеры или матрицу, которая преобразует векторы, представленные в нижележащем пространстве, в кадр камеры? (Или что-то еще; здесь есть четыре варианта.) Эти варианты связаны; Матрица преобразования — это транспонирование матрицы вращения. Преобразование и вращение являются сопряженными операциями. То же самое относится и к кватернионам. Используете ли вы кватернионы преобразования или вращение кватернионов? Это опять связанные понятия; одно сопряжено с другим.
Левый или правый кватернионы
Учитывая единицу кватерниона Q преобразовать или повернуть вектор v, некоторое использование qvq* чтобы преобразовать / повернуть вектор, другие используют Q*VQ. Какая форма правильная? Оба. Эти две формы отличаются только тем, находится ли неконъюгированный кватернион слева (qvq*) или вправо (Q*VQ) вектора, который будет преобразован / повернут.
Столбец и векторы строки
Большинство людей используют векторы столбцов, но некоторые используют векторы строк. Здесь вы столкнетесь с левой или правой проблемой с матрицами. Векторы столбцов преобразуются / вращаются с помощью милливольт, с матрицей слева от векторов; векторы строки через Vm, с матрицей справа.
Влияние
Вы должны быть осторожны при чтении литературы. Что касается формирования матрицы из кватерниона, вам нужно следить за изменениями знака при построении недиагональных элементов матрицы. Сложение / вычитание одного состава может измениться на вычитание / сложение в другом составе.
Левые преобразования кватернионов в матрицы преобразования векторов строк
Я использую левые кватернионы преобразования и матрицы преобразования, и я представляю векторы как векторы строк. Я также представляю кватернион Q в составе реальной скалярной части Qs и векторная мнимая часть Qv. Учитывая эти представления, вычисления для генерации матрицы из кватерниона (псевдокод):
// Compute the cosine of the rotation angle.
cost = 2.0*qs*qs - 1.0;
// Construct the diagonal of the matrix:
// T_ii = cost + 2qv_i^2
for (i = 0; i < 3; ++i) {
T[i][i] = cost + 2.0*qv[i]*qv[i];
}
// Construct off-diagonal transformation matrix elements:
// T_ij = 2 (qv_i qv_j - eps_ijk qs qv_k), where eps is the Levi-Civita symbol
for (k = 0; k < 3; ++kk) {
i = (k+1)%3;
j = (i+1)%3;
T[i][j] = 2.0*(qv[i]*qv[j] - qs*qv[k]);
T[j][i] = 2.0*(qv[i]*qv[j] + qs*qv[k]);
}
Возможно, вы захотите расширить эти петли. Первый цикл расширяется на три утверждения, последнее — на шесть. Вам не нужно вычислять я а также J в расширении последнего цикла; расширение цикла делает их фиксированными величинами.
Альтернативные представления
Эти предостережения выше не так плохи, как кажутся. Вы должны убедиться, что мое представление соответствует вашему. Шансы 50-50, что это не так. Если это не так, просто поменяйте местами недиагональные элементы. Используйте вычисление T[i][j]
за T[j][i]
, и наоборот. Как сказать:
Используйте мою формулировку, если окончательное значение s 1. Если это -1, просто поменяйте местами назначения T[i][j]
а также T[j][i]
, Или вы можете изменить сложение на вычитание, вычитание на сложение.
Один последний гоча
Приведенный выше расчет применяется, когда скалярная часть не близка к нулю. Это было бы справедливо везде, если бы у нас была арифметика с бесконечной точностью. Возможно, вы захотите использовать отдельный расчет для поворотов, которые очень близки к нулю или 180 градусов.
Википедия это знает: Кватернионы и пространственное вращение
Я бы порекомендовал использовать собственный C ++ библиотека для представления ваших кватернионов и матриц. Когда у вас есть кватернионный объект, вы можете просто вызвать .toRotationMatrix()
на нем, чтобы получить матрицу 3х3.
Другая библиотека, которая, вероятно, будет работать GLM.
Настраиваемая математическая библиотека ( http://cmldev.net/ ) — это очень легкая библиотека, которая может выполнить вычисления за вас. Это библиотека заголовков, поэтому интеграция в ваш код не должна быть проблемой. Эта функция ( http://cmldev.net/?p=196 ) может вам тоже помочь.