Вопрос проекции OpenGL: Почему я ничего не вижу на экране? - PullRequest
0 голосов
/ 20 мая 2011
void init (void)
{
    glClearColor (1.0, 1.0, 1.0, 0.0);

    //glMatrixMode(GL_MODELVIEW);
    //gluLookAt(x0, y0, z0, xref, yref, zref, Vx, Vy, Vz);

    glMatrixMode(GL_PROJECTION);
    gluPerspective(45, 2, -1, 1);
    //glFrustum(xwMin, xwMax, ywMin, ywMax, dnear, dfar);
    //gluPerspective(45.0, 45, -1, 1);
}

void displayFcn (void)
{
    glClear(GL_COLOR_BUFFER_BIT);

    glColor3f(0.0, 1.0, 0.0);
    glPolygonMode(GL_FRONT, GL_FILL);
    glPolygonMode(GL_BACK, GL_LINE);

    glBegin(GL_TRIANGLES);
        glVertex3f(0.0, 0.0, 0.0);
        glVertex3f(0.1, 0.0, 0.0);
        glVertex3f(0.50, 0.866025, 0.0);    
    glEnd();

    glFlush();
}

void reshapeFcn(GLint newWidth, GLint newHeight)
{
    glViewport(0,0,newWidth, newHeight);

    winWidth = newWidth;
    winHeight = newHeight;

}
void main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
    glutInitWindowPosition(400,200);
    glutInitWindowSize(winWidth, winHeight);
    glutCreateWindow("Test");

    init();
    glutDisplayFunc(displayFcn);
    glutReshapeFunc(reshapeFcn);
    glutMainLoop();
}

Может кто-нибудь немного объяснить и предложить, как сделать этот треугольник видимым.

Ответы [ 2 ]

2 голосов
/ 20 мая 2011

Не думаю, что вам разрешено устанавливать zNear отрицательным.Это сделает странные вещи в буфере глубины и означает, что вы видите вещи за глазом. Документы говорят, что это всегда положительно .Вы также можете получить несколько странные результаты, если вы установите соотношение сторон 2, независимо от соотношения сторон окна.

Вам также необходимо установить текущую матрицу обратно в MODEL_VIEW, как показал datenwolf.Вам не нужно , чтобы использовать gluLookAt, но вам нужно что-то сделать, чтобы переместить треугольник от начала координат, где расположен глаз.Это можно сделать, установив для компонента z какое-либо отрицательное значение или применив перевод перед вершинами:

glPushMatrix();
glTranslated(0,0,-5);
glBegin(GL_TRIANGLES);
    glVertex3f(0.0, 0.0, 0.0);
    glVertex3f(0.1, 0.0, 0.0);
    glVertex3f(0.50, 0.866025, 0.0);    
glEnd();
glPopMatrix();
2 голосов
/ 20 мая 2011

gluPrespective и gluLookAt умножить поверх текущей матрицы в выбранном стеке.Вы должны сначала загрузить личность, чтобы иметь смысл.Также вам нужно установить область просмотра перед рендерингом.Рекомендуется устанавливать все матрицы и область просмотра в функции отображения, и нигде больше.Следование этому правилу сделает вашу жизнь намного проще.Также в OpenGL обычно нет выделенной фазы инициализации.Ресурсы загружаются по запросу.

void displayFcn (void)
{
    glViewport(0,0,winWidth, winHeight);

    glClearColor (1.0, 1.0, 1.0, 0.0);
    glClear(GL_COLOR_BUFFER_BIT);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(45, 2, 1, 10);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt(x0, y0, z0, xref, yref, zref, Vx, Vy, Vz);

    glColor3f(0.0, 1.0, 0.0);
    glPolygonMode(GL_FRONT, GL_FILL);
    glPolygonMode(GL_BACK, GL_LINE);

    glBegin(GL_TRIANGLES);
        glVertex3f(0.0, 0.0, 0.0);
            glVertex3f(0.1, 0.0, 0.0);
        glVertex3f(0.50, 0.866025, 0.0);    
    glEnd();

    glFinish();
}

void reshapeFcn(GLint newWidth, GLint newHeight)
{
    winWidth = newWidth;
    winHeight = newHeight;
    glutPostRedisplay();
}

void main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
    glutInitWindowPosition(400,200);
    glutInitWindowSize(winWidth, winHeight);
    glutCreateWindow("Test");

    glutDisplayFunc(displayFcn);
    glutReshapeFunc(reshapeFcn);
    glutMainLoop();
}
...