superlazyname
superlazyname

Reputation: 265

basic GL function glTranslatef don't seem to be working

I was following this tutorial, the triangle renders perfectly, but when I hit the Page Up key, nothing happens.

Here's my code:

// 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;

}

Note:

The tutorial suggested using glTranslate(x,y,z) instead of glTranslatef(x,y,z). I assumed that was a typo since glTranslate() doesn't exist

Upvotes: 0

Views: 895

Answers (2)

datenwolf
datenwolf

Reputation: 162327

What you're doing in this function is not the right thing to do

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);
}

Speak with me: Don't set the viewport size and projection in the reshape handler!

You always set viewport and projection together with everything else in the display handler. It's the only right place to do it.

Next, you don't "place" objects using OpenGL matrix functions. You're just manipulating the transformation matrix, which should be set according to the placement of the objects, which may be perfectly well stored as matrix but independently of OpenGL state. So your keyboard handler should set some variable, which is then used for setting the modelview matrix at the right moment.

Upvotes: 1

Blindy
Blindy

Reputation: 67487

You're resetting your matrix in display, so your glTranslate* from the key event handler is lost. Rethink what you're trying to achieve.

Upvotes: 2

Related Questions