2013-10-10 3 views
1

Я делаю свой собственный мир -> 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 

Вопрос в том, что статья правильная ???

+0

Ну, вы правы, когда говорите, что матрица GL_MODELVIEW правша, а матрица камеры левая. Я прочитаю статью, чтобы узнать, могу ли я сделать больше выводов. – fvdalcin

+0

NDC, который является координатным пространством, которое вы в конечном итоге завершаете до того, как окончательное преобразование видового экрана будет левым. Это единственное координатное пространство в OpenGL, которое вы не контролируете, z = -1 всегда самая близкая глубина, а z = 1 всегда самая глубина. Диапазон глубины, проекция и матрица модели могут иметь разные промежуточные координатные пространства в разной степени, пока конечный продукт логически отображает левую НДЦ. В конвейере с фиксированной функцией все до проекции было правным, а матрица проекции/диапазон глубины - это то, что создало надлежащий NDC. –

ответ

0

Сам OpenGL не является левым или правым. Заглавные и оконные пространства OpenGL обычно считаются правшами (хотя можно было бы использовать их наоборот, если это действительно нужно).

В классическом трубопроводе с фиксированной функцией, как правило, определялось пространство для глаз и объектов осталось. gluLookAt() использует это соглашение. Также gluPerspective()/glFrustum()/glOrtho() используют это соглашение как положительные значения для ближнего и дальнего, что они принимают, фактически относятся к отрицательным значения z в пространстве глаза. Эти проекционные матрицы обычно изменяют ручность.

Смежные вопросы