Я делаю свой собственный мир -> cam transforms (вместо использования gluLookAt
). Я следил за информацией here, но Im получал другой знак для перевода для окончательного преобразования вида модели 4x4.DIY камера преобразуется для openGL
В статье говорится: «Поскольку мы смотрим вниз по оси х, мир преобразуется отрицательным положением камеры».. И затем они переводят на -eye
, что составляет -camPos
в моем коде.
Я не думаю, что это правильно, так как opengl правша, и камера обычно смотрит вниз -Z (в сторону экрана). Таким образом, кажется правильным преобразование перевода должно быть +camPos
.
float lookAtP[3] = {0,0,0}; /* camera look at point */
float camPos[3] = {0,0,-150}; /* camera location */
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(camPos[0],camPos[1],camPos[2], lookAtP[0],lookAtP[1],lookAtP[2], 0,1,0);
GLfloat matrix[16];
glGetFloatv (GL_MODELVIEW_MATRIX, matrix);
mat_print(matrix);
Результат (gluLookAt):
-1.0000 0.0000 0.0000 0.0000
0.0000 1.0000 0.0000 0.0000
0.0000 0.0000 -1.0000 0.0000
0.0000 0.0000 -150.0000 1.0000
Когда я следовать статье, я получаю перевод разного знака (+150). Я вычисляю матрицу вращения R
, затем перевод T
. Затем загрузите транспонирование T*R
с помощью glLoadMatrix
(причина заключается в том, что opengl правша, а статья посвящена левым координатным системам).
-1.0000 0.0000 0.0000 0.0000
0.0000 1.0000 0.0000 0.0000
0.0000 0.0000 -1.0000 0.0000
0.0000 0.0000 150.0000 1.0000
Вопрос в том, что статья правильная ???
Ну, вы правы, когда говорите, что матрица GL_MODELVIEW правша, а матрица камеры левая. Я прочитаю статью, чтобы узнать, могу ли я сделать больше выводов. – fvdalcin
NDC, который является координатным пространством, которое вы в конечном итоге завершаете до того, как окончательное преобразование видового экрана будет левым. Это единственное координатное пространство в OpenGL, которое вы не контролируете, z = -1 всегда самая близкая глубина, а z = 1 всегда самая глубина. Диапазон глубины, проекция и матрица модели могут иметь разные промежуточные координатные пространства в разной степени, пока конечный продукт логически отображает левую НДЦ. В конвейере с фиксированной функцией все до проекции было правным, а матрица проекции/диапазон глубины - это то, что создало надлежащий NDC. –