основная функция GL, похоже, не работает glTranslatef - PullRequest
0 голосов
/ 31 декабря 2010

Я следовал этому уроку , треугольник отрисовывается отлично, но когда я нажимаю клавишу Page Up, ничего не происходит.

Вот мой код:

// made in Visual Studio Express 2008
// OpenGL3-1.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"


// if you are not using Visual Studio to compile this then remove stdafx.h

#include <stdlib.h>
#include <windows.h>
#include "glut.h"

void init(void)
{

    glClearColor (0.0, 0.0, 0.0, 0.0);
    glEnable(GL_DEPTH_TEST);
    glShadeModel (GL_SMOOTH);

}


void display(void)
{

    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    /* Loading the Identity matrix means we reset the screen coordinate system to XYZ axis of lenght 1:
    The screen starts at z=0, x=-1 to x=1 and y=-1 to y=1 */
    glLoadIdentity ();

    glTranslatef(0,0.0f,-6.0f);
    // translate everything by 6 units in the z axis.

    glBegin(GL_TRIANGLES);

        glColor3f(1.0f,0.0f,0.0f);
        glVertex3f( 0.0f, 1.0f, 0.0f);
        glColor3f(0.0f,1.0f,0.0f); // Set The Color To Green
        glVertex3f(-1.0f,-1.0f, 0.0f);
        glColor3f(0.0f,0.0f,1.0f); // Set The Color To Blue
        glVertex3f( 1.0f,-1.0f, 0.0f);

    glEnd(); // Done Drawing A Triangle

    Sleep(5);
    glutSwapBuffers();



}

void reshape (int w, int h)
{
    // just the window reshape function

    glViewport (0, 0, (GLsizei) w, (GLsizei) h);
    glMatrixMode (GL_PROJECTION);
    glLoadIdentity ();
    gluPerspective(60.0, (GLfloat) w/(GLfloat) h, 1.0, 20.0);
    glMatrixMode (GL_MODELVIEW);

}

void keyboard(unsigned char key, int x, int y)
{
    // escapes from the program if the ESC key is hit

    switch (key) {

        case 27:
        exit(0);
        break;

    }

}



void keyspecial( int key, int x, int y )
{

    if( key == GLUT_KEY_PAGE_UP) // Page up
    {
        glTranslatef(90.0,0.0,0.0);
        // ...... do what ever you want to do
        glutPostRedisplay(); // redraw everything to reflect the changes

    }
    if (key == GLUT_KEY_PAGE_DOWN)
    {

        // ...... do what ever you want to do 

        glutPostRedisplay();// redraw everything to reflect the changes

    }
    if (key == GLUT_KEY_HOME)
    {

        // ...... do what ever you want to do
        glutPostRedisplay();// redraw everything to reflect the changes

    }
    if (key == GLUT_KEY_END)
    {

        // ...... do what ever you want to do
        glutPostRedisplay();// redraw everything to reflect the changes

    }


}

int main(int argc, char** argv)
{

    glutInit(&argc, argv);
    glutInitDisplayMode (GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE);
    glutInitWindowSize (500, 500);
    glutInitWindowPosition (100, 100);
    glutCreateWindow (argv[0]);
    init ();
    glutDisplayFunc(display);
    glutReshapeFunc(reshape);

    glutKeyboardFunc(keyboard); // tell glut to call this function when the user presses a key

    glutSpecialFunc(keyspecial); // tell glut to call this function when the user presses a special a key
    glutMainLoop();
    return 0;

}

Примечание:

В руководстве предлагается использовать glTranslate(x,y,z) вместо glTranslatef(x,y,z).Я предположил, что это опечатка, поскольку glTranslate() не существует

Ответы [ 2 ]

2 голосов
/ 31 декабря 2010

Вы сбрасываете свою матрицу в display, поэтому ваш glTranslate* из обработчика событий ключа теряется.Переосмыслите, чего вы пытаетесь достичь.

1 голос
/ 01 января 2011

То, что вы делаете в этой функции, не совсем правильно

void reshape (int w, int h)
{ // just the window reshape function

    glViewport (0, 0, (GLsizei) w, (GLsizei) h);
    glMatrixMode (GL_PROJECTION);
    glLoadIdentity ();
    gluPerspective(60.0, (GLfloat) w/(GLfloat) h, 1.0, 20.0);
    glMatrixMode (GL_MODELVIEW);
}

Поговорите со мной: Не устанавливайте размер области просмотра и проекцию в обработчике изменения формы!

Вы всегда устанавливаете область просмотра и проекцию вместе со всем остальным в обработчике дисплея. Это единственное правильное место, чтобы сделать это.

Далее, вы не «размещаете» объекты, используя матричные функции OpenGL. Вы просто манипулируете матрицей преобразования, которая должна быть установлена ​​в соответствии с расположением объектов, которые могут прекрасно храниться в виде матрицы, но независимо от состояния OpenGL. Таким образом, ваш обработчик клавиатуры должен установить некоторую переменную, которая затем используется для установки матрицы вида модели в нужный момент.

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