2010-12-31 10 views
0

Ich folgte this tutorial, das Dreieck rendert perfekt, aber wenn ich die Bild-nach-oben-Taste drücken, passiert nichts.grundlegende GL-Funktion glTranslatef scheint nicht zu arbeiten

Hier ist mein 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; 

} 

Hinweis:

Das Tutorial vorgeschlagen glTranslate(x,y,z) statt glTranslatef(x,y,z) verwenden. Ich nahm an, dass dies ein Tippfehler war, da glTranslate() nicht existiert

Antwort

2

Sie setzen Ihre Matrix in display zurück, so dass Ihre glTranslate* aus dem Key-Event-Handler verloren geht. Überdenken Sie, was Sie erreichen möchten.

+0

Sie haben Recht, was soll ich tun, um es zu beheben? Wie funktioniert glutMainloop()? Wiederholt es end end einfach main()? (Ich habe noch nie zuvor eine Schwemme oder OpenGL benutzt) – superlazyname

+0

Wenn du endlos "Anzeige" nennst, dann ja. Es prüft auch auf Tastenbetätigungen, Fenstergrößen und alle anderen Windows-Ereignisse. Um Ihr spezifisches Problem zu beheben, sollten Sie das Dreiecksbewegungsdelta in einer Variablen halten und es in Ihrem Tastatur-Ereignishandler aktualisieren, und in der Anzeige die Variable verwenden, um die Übersetzung zu erstellen. – Blindy

1

Was Sie in dieser Funktion tun nicht das Richtige zu tun

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

mit mir sprechen: Sie nicht die Darstellungsgröße und Projektion im reshape Handler gesetzt!

Sie stellen Ansichtsfenster und Projektion immer zusammen mit allem anderen im Display-Handler ein. Es ist der einzig richtige Ort dafür.

Als nächstes "platzieren" Sie keine Objekte mit OpenGL-Matrixfunktionen. Sie manipulieren nur die Transformationsmatrix, die entsprechend der Platzierung der Objekte eingestellt werden sollte, die perfekt als Matrix, aber unabhängig vom OpenGL-Status gespeichert werden können. Ihr Keyboard-Handler sollte also eine Variable setzen, die dann zur richtigen Einstellung der Modelview-Matrix verwendet wird.

+0

Aus Neugier: Was ist der Vorteil des Aufrufs von 'glViewport' im Zeichnungshandler, wenn das einzige Ereignis, in dem sich das Ansichtsfenster ändert, die Fenstergrößenänderung ist? Können Sie diesen Rat begründen? – ComicSansMS

+0

@ComicSansMS: Was lässt Sie glauben, dass sich das Ansichtsfenster nur bei Fenstergrößen ändert? Angenommen, Sie rendern HUD- oder GUI-Elemente oder eine Minikarte oder eine Bild-in-Bild-Ansicht. In jedem dieser Fälle (einige mehr) ändern Sie das Ansichtsfenster mehrmals während der Wiedergabe eines einzelnen Frames. – datenwolf

+0

Das macht Sinn. Danke fürs klarstellen. – ComicSansMS

Verwandte Themen