Беда с использованием gluLookAt - PullRequest
0 голосов
/ 17 октября 2018

Я посмотрел несколько вопросов по этому поводу, включая этот один.Я хочу, чтобы человек смотрел по коридору, смотрел на заднюю стенку, а левая и правая стены были на боковом виде человека.Вот мой код:

Инициация

float lookAtX = 0, lookAtY = 0, lookAtZ = -2.5, posX = 0, posY = 0, posZ = 0;

Рисование

    glEnable(GL_DEPTH_TEST);
    glMatrixMode(GL_MODELVIEW);

    gluLookAt(
        posX, posY, posZ, 
        lookAtX, lookAtY, lookAtZ, 
        0, 0, 1
    );
    // Back
    glBegin(GL_POLYGON);
    glColor3f(255, 0, 0); // Red
    glVertex3f(-2.5, -2.5, 2.5);
    glVertex3f(2.5, 2.5, 2.5);
    glVertex3f(2.5, -2.5, 2.5);
    glVertex3f(-2.5, -2.5, 2.5);
    glEnd();

    // Left
    glBegin(GL_POLYGON);
    glColor3f(0, 255, 0); // Green
    glVertex3f(-2.5, 2.5, 2.5);
    glVertex3f(-2.5, 2.5, -2.5);
    glVertex3f(-2.5, -2.5, 2.5);
    glVertex3f(-2.5, -2.5, -2.5);
    glEnd();

    // Right
    glBegin(GL_POLYGON); 
    glColor3f(0, 0, 255); // Yellow
    glVertex3f(2.5, 2.5, 2.5);
    glVertex3f(2.5, 2.5, -2.5);
    glVertex3f(2.5, -2.5, 2.5);
    glVertex3f(2.5, -2.5, -2.5);
    glEnd();

    glFlush();
    window.pushGLStates();

Я уверен, что внешний код правильный, потому что у меня был другой кусок кода с таким жескелет.Я также был уверен, что это будет работать ... но я думаю, что это не xD.Почему там черный экран и почему он не показывает стены?Спасибо, что нашли время, чтобы прочитать это

1 Ответ

0 голосов
/ 17 октября 2018

Фират всего отмечает, что рисование последовательностями glBegin / glEnd устарело уже несколько лет.Прочитайте о конвейере с фиксированными функциями и посмотрите Спецификация вершин и Шейдер для современного способа рендеринга.


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

Используйте gluPerspective, чтобы установить перспективную проекцию на стек матрицы проекций - glMatrixMode( GL_PROJECTION ):

glMatrixMode( GL_PROJECTION );
glLoadIdentity();
gluPerspective( 90.0f, view_width / view_height, 0.1f, 10.0f );

При установкеПосмотрите матрицу, тогда вам придется изменить точку зрения и посмотреть в направлении «коридора».Поскольку вы смотрите по оси z, вектор вверх должен быть (0, 1, 0):

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
float lookAtX = 0, lookAtY = 0, lookAtZ = 0, posX = 0, posY = 0, posZ = -5;
gluLookAt( posX, posY, posZ, lookAtX, lookAtY, lookAtZ, 0, 1, 0 );

Наконец, ваши координаты вершины смешаны.Измените его следующим образом:

// Back
glBegin(GL_POLYGON);
glColor3ub(255, 0, 0); // Red
glVertex3f(-2.5, -2.5, 2.5);
glVertex3f(-2.5,  2.5, 2.5);
glVertex3f( 2.5,  2.5, 2.5);
glVertex3f( 2.5, -2.5, 2.5);
glEnd();

// Left
glBegin(GL_POLYGON);
glColor3ub(0, 255, 0); // Green
glVertex3f(-2.5,  2.5,  2.5);
glVertex3f(-2.5,  2.5, -2.5);
glVertex3f(-2.5, -2.5, -2.5);
glVertex3f(-2.5, -2.5,  2.5);
glEnd();

// Right
glBegin(GL_POLYGON); 
glColor3ub(0, 0, 255); // Blue
glVertex3f(2.5,  2.5,  2.5);
glVertex3f(2.5,  2.5, -2.5);
glVertex3f(2.5, -2.5, -2.5);
glVertex3f(2.5, -2.5,  2.5);
glEnd();

Предварительный просмотр:

...