Смущает локализация матрицы - работает, когда передается в OpenGL, но не когда я делаю свою собственную арт-метку? - PullRequest
0 голосов
/ 07 марта 2011

Я очень смущен тем, что моя проблема здесь.Я установил матрицу, которая преобразует глобальные / мировые координаты в локальное координатное пространство объекта.Эта матрица преобразования построена с использованием информации об объектах из четырех векторов (вперед, вверх, сторона и положение).Эта матрица локализации затем передается в glMultMatrixf() во время рисования для каждого объекта, чтобы я мог нарисовать простые оси вокруг каждого объекта для визуализации локальной системы координат.Это работает совершенно нормально, как и ожидалось, и когда объекты движутся и вращаются в мире, так же поступают их локальные оси координат.

Проблема в том, что когда я беру эту же матрицу и умножаю ее на вектор столбца (преобразовать глобальную позицию одного объекта в локальную систему координат другого объекта) результат совсем не такой, как я ожидал.Например:

Моя матрица локализации выглядит следующим образом:

0.84155    0.138      0.5788     0
0.3020     0.8428    -0.5381     8.5335
0.4949    -0.5381    -0.6830    -11.6022
0.0        0.0        0.0        1.0

Я ввожу вектор столбца положения:

-30.0
-30.0
-30.0
1.0

И получаю вывод:

-99.2362
-1.0199
4.8909
1.0000

Поскольку положение моего объекта в данный момент времени (-50.8, 8.533, -11.602, 1), я знаю, что выход для координаты x не может быть таким же большим, как -99.2362.Кроме того, когда я нахожу расстояние между двумя глобальными точками и расстояние между локализованной точкой и началом координат, они различаются.

Я проверил это в Matlab, и кажется, что мое умножение матриц правильное (Примечание: в Matlab вы должны сначала транспонировать матрицу локализации).Поэтому мне остается думать, что моя матрица локализации строится неправильно, но затем OpenGL успешно использует эту матрицу для рисования локальных координатных осей!

Я пытался не включать ненужные детали в этот вопросно если вы чувствуете, что вам нужно больше, пожалуйста, не стесняйтесь спрашивать!:)

Большое спасибо.

1 Ответ

1 голос
/ 07 марта 2011

Я должен догадаться, но я хотел бы указать на два источника проблем с умножением OpenGL-матрицы:

  1. матрица вида модели преобразуется в систему координат, где камера всегдав начале координат (0,0,0), глядя вдоль оси Z.Поэтому, если вы сделали некоторые преобразования для «перемещения камеры» перед применением локальных> глобальных преобразований, вы должны компенсировать движение камеры, иначе вы получите координаты, локальные по отношению к координатному пространству камеры.Включали ли вы преобразования камеры при создании матрицы?

  2. Матрицы в OpenGL являются COLUMN-мажорными.Если у вас есть массив с 16 значениями, элементы будут упорядочены следующим образом:

    [0] [4] [8] [12]

    [1] [5] [9][13]

    [2] [6] [10] [14]

    [3] [7] [11] [15]

Ваша матрица также кажется странной.Первые три столбца говорят мне, что вы применили некоторые преобразования вращения или масштабирования.Последний столбец показывает количество сдвигов, примененных к каждому элементу координат.Числа совпадают с позицией вашего объекта.Это означает, что если вы хотите, чтобы выходная координата x была -50,8, первые три элемента в первой строке должны складываться в ноль:

-30 * 0,8154 -30 * 0,3020 -30 * 0,4939 + 1 *-50.8967

<--- это должно быть ноль --------> но это -48,339.

Так что я думаю, что действительно существует проблема при построении матрицы.Возможно, вы сможете объяснить, как вы строите матрицу ...

...