OpenGL Z Axis Up - PullRequest
       4

OpenGL Z Axis Up

3 голосов
/ 15 мая 2011

Я пытался заставить мой движок opengl использовать ось z для оси вверх, но независимо от того, что я делаю, ничего не отображается.Я вычисляю матрицу вида следующим образом:

float width = xymax - xmin;
float height = xymax - ymin;

float depth = zfar - znear;
float q = -(zfar + znear) / depth;
float qn = -2 * (zfar * znear) / depth;

float w = 2 * znear / width;
w = w / aspect;
float h = 2 * znear / height;

m[0]  = w;
m[1]  = 0;
m[2]  = 0;
m[3]  = 0;

m[4]  = 0;
m[5]  = 0;
m[6]  = h;
m[7]  = qn;

m[8]  = 0;
m[9]  = q;
m[10] = 0;
m[11] = 0;

m[12] = 0;
m[13] = 0;
m[14] = -1;
m[15] = 0;

раньше, когда у меня была ось Y как вверх (что работало нормально), код был таким:

m[0]  = w;
m[4]  = 0;
m[8]  = 0;
m[12]  = 0;

m[1]  = 0;
m[5]  = h;
m[9]  = 0;
m[13]  = 0;

m[2]  = 0;
m[6]  = 0;
m[10] = q;
m[14] = -1;

m[3] = 0;
m[7] = 0;
m[11] = qn;
m[15] = 0;

Каждый объект/ вершина сначала умножается на простую матрицу перевода:

1 0 0 xposition
0 1 0 yposition
0 0 1 zposition
0 0 0 1

, а затем на матрицу проекции, сгенерированную выше, я просто получаю черный экран.Что-то еще, что мне нужно изменить, чтобы это работало?

1 Ответ

1 голос
/ 15 мая 2011

Это похоже на матрицы, которые вы использовали бы в матрице проекции, если вы поворачиваете эту матрицу, происходят странные вещи, поскольку вы балуетесь ожиданиями OpenGL в отношении поступающих данных.

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

Теперь, если вы используете конвейер с фиксированной функцией, просто используйте рабочий вариант, поместите его в матрицу проекции.А если вы используете шейдеры, поместите его в форму gl_ProjectionMatrix.Существует много алгоритмов шейдеров, которые требуют положения вершин в мировом пространстве;объединение проекции и вида модели проблематично.

Для вашего вида модели в качестве матрицы идентичности используйте следующее:

1 0 0 0
0 0 1 0
0 1 0 0
0 0 0 1

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


Однако вы бездумно обменивались всеми ненулевыми записями y <-> z, что неправильно:

w  0  0  0
0  h  0  0
0  0  q qn
0  0 -1  0

Правильно было бы поменять местами столбцы y и z:

w  0  0  0
0  q  0  0
0  0  h -1
0  0 qn  0

Теперь, если вы повторно умножите новую «идентичность», приведенную выше, в вашей рабочей проекции вы получите именно это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...