Компактное представление матрицы просмотра модели OpenGL 4x4 - PullRequest
0 голосов
/ 04 февраля 2011

Каков наиболее удобный способ хранения только вращающейся части матрицы вида модели OGL (4x4)?

Например;в редакторе уровней для установки поворота объекта было бы легко использовать углы XYZ Эйлера.Однако это кажется очень сложной системой для использования с матрицами.

Мне нужно иметь возможность получить И установить вращение из этого нового представления.

(Альтернативой является сохранение вращающейся части (4 * 3 числа), но пользователю трудно манипулировать ими)

Я нашел здесь некоторый код http://www.google.com/codesearch/p?hl=en#HQY9Wd_snmY/mesh/matrix3.h&q=matrix3&sa=N&cd=1&ct=rcпозволяет установить и получить угол поворота (3 поплавка).Это идеально.

Ответы [ 5 ]

2 голосов
/ 04 февраля 2011

Хотя они используются регулярно, я не обращаю внимания на использование углов Эйлера.Они проблематичны, так как они сохраняют только направление на объект, но не касаются этого направления.Что еще более важно: они склонны к блокировке гибала http://en.wikipedia.org/wiki/Gimbal_lock

Гораздо лучший метод хранения вращений - Квартернионы .С точки зрения непрофессионала, кватернион состоит из оси вращения и угла поворота вокруг этой оси.Таким образом, это кортеж из 4 скаляров a, b, c, d.Тогда кватернион имеет вид Q = a + i * b + j * c + k * d, | Q |= 1, со специальными свойствами i, j, k, которые i² = j² = k² = i · j · k = -1 и i · j = k, j · k = i, k · i = j, что подразумевает j· I = -k, k · j = -i, i · k = -j

Таким образом, кватерионы являются расширениями комплексных чисел.Если вы вспомните теорию комплексных чисел, вы помните, что произведение двух комплексных чисел a = / = b на | a |= | b |= 1 - вращение в комплексной плоскости.Таким образом, легко предположить, что вращение в 3D можно описать расширением комплексных чисел в комплексную гиперплоскость.Вот что такое кватернионы.

Подробности смотрите в этой статье.http://en.wikipedia.org/wiki/Quaternions_and_spatial_rotation

1 голос
/ 04 февраля 2011

В стандартной трехмерной матрице вам нужно только верхнее левое значение 3х3, чтобы задать вращение. Чтобы применить матрицу как 4x4 позже, вам нужно сделать другие значения 0 отдельно от диагонали.

Вот матрица только вращения, где значения vXY дают повороты.

[v00 v01 v02  0]
[v10 v11 v12  0]
[v20 v21 v22  0]
[  0   0   0  1]

Интересно, что значения образуют основы системы координат, в которую вы повернули объект, поэтому в новой системе ось X расположена вдоль [v00 v01 v02], а ось y - вдоль [v10 v11 v12] и ось z, очевидно, [v20 v21 v22].

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

1 голос
/ 04 февраля 2011

Я бы сказал, что это зависит от пользователя, но для меня самый «удобный» способ - хранить «roll», «pitch» и «yaw».Это очень нетехнические термины, которые средний пользователь может понять и откорректировать, и вам будет легко взять эти значения и вычислить матрицу.

0 голосов
/ 04 февраля 2011

Кватернион, хотя математика «неясна и неописуема», удивительно удобна для пользователя, поскольку представляет вращение вокруг оси на заданный угол.

Ось вращения - это просто единичный вектор, указывающий в этом направлении, умноженный на синус, равный 1/2 угла поворота, а «неясный» 4-й компонент равен косинусу 1/2 угла поворота.

На первый взгляд это кажется "неестественным", но как только вы это поймете ... может ли быть легче?

0 голосов
/ 04 февраля 2011

IMO, самый «удобный для пользователя формат» для вращения - это сохранение углов Euler XYZ, это, как правило, то, как вращаются в любом программном обеспечении для создания 3D-контента.

Углы Эйлера легко преобразовать в матрицы, см. здесь для задействованного матричного продукта.

Но не следует путать формат, заданный для GUI / пользователя, и формат хранения данных: углы Euler XYZ имеютС их собственными проблемами при выполнении анимации блокировка карданного подвеса может привести к нежелательному поведению.

Другим кандидатом для хранения / вычисления поворотов является кватернионы .Они предлагают математические преимущества перед углами XYZ, особенно при интерполяции между двумя поворотами.Конечно, вы не хотите предоставлять значения кватернионов непосредственно любому пользователю, вам нужно преобразовать их в углы XYZ.Вы найдете много кода для этого в Интернете.

Я бы не рекомендовал хранить вращение непосредственно в матричном формате.Извлечь из него удобные для пользователя значения сложно, он не предлагает никакого интересного поведения для анимации / интерполяции, он требует хранения.IMO, матрицы должны создаваться, когда необходимо преобразовать геометрию.

В заключение, есть несколько вариантов, вы должны выбрать то, что подходит вам больше всего.Планируете ли вы иметь анимацию или нет?и т. д.

РЕДАКТИРОВАТЬ Кроме того, вам не следует создавать амальгаму с матрицами моделей и видов.Они семантически сильно различаются и объединяются в OpenGL только по соображениям производительности.То, что я имел в виду выше, в «матрице моделей».Матрица просмотра обычно предоставляется вашей системой наблюдения / менеджером камеры и комбинируется с вашей матрицей модели.

...