2012-03-28 8 views
0

Ich habe ein einfaches OpenGL-Programm in C++ geschrieben, das eine Linie anzeigt, die die Mitte des Fensters mit der aktuellen Position des Mauszeigers verbindet.Verwenden von glutPassiveMotionFunc(); in GLUT

My-Code ist:

#ifdef __APPLE__ 
#include <GLUT/glut.h> 
#else 
#include <GL/glut.h> 
#endif 
#include<iostream> 

using namespace std; 

void passive(int,int); 
void reshape(int,int); 
void init(void); 
void display(void); 
void camera(void); 

int x=3,y=3; 

int main (int argc,char **argv) { 
    glutInit (&argc,argv); 
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH | GLUT_RGBA); 
    glutInitWindowSize(1364,689); 
    glutInitWindowPosition(0,0); 
    glutCreateWindow("Sample"); 
    init(); 
    glutDisplayFunc(display); 
    glutIdleFunc(display); 
    glutPassiveMotionFunc(passive); 
    glutReshapeFunc(reshape); 
    glutMainLoop(); 
    return 0; 
} 

void display(void) { 
    glClearColor (0.0,0.0,0.0,1.0); 
    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glLoadIdentity(); 
    camera(); 

    glBegin(GL_LINES); 
     glVertex3f(0,0,0); 
     glVertex3f(x,y,0); 
    glEnd(); 
    glutSwapBuffers(); 
}  

void camera(void) { 
    glRotatef(0.0,1.0,0.0,0.0); 
    glRotatef(0.0,0.0,1.0,0.0); 
    glTranslated(0,0,-20); 
}  

void init(void) { 
    glEnable (GL_DEPTH_TEST); 
    glEnable (GL_BLEND); 
    glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
    glEnable(GL_COLOR_MATERIAL); 
}  

void reshape(int w, int h) { 
    glViewport(0,0,(GLsizei)w,(GLsizei)h); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluPerspective(60,(GLfloat)w/(GLfloat)h,1.0,100.0); 
    glMatrixMode(GL_MODELVIEW); 
} 

void passive(int x1,int y1) { 
    x=x1; y=y1; 
} 

Das Problem, das ich bin vor, dass die x und y in der passiven() Funktion gesetzten Werte nicht korrekt in den Bildschirm abgebildet, die perspektivische Projektion verwendet. Die gezeichnete Linie verbindet also die Mitte mit einer anderen Koordinate außerhalb des Bildschirms. Irgendwelche Änderungen am Code, damit er richtig funktioniert?

Antwort

1

Ein einfacher Weg wäre, eine orthographische Projektionsmatrix zu erstellen und dann alle Ihre "2D" -Elemente (einschließlich dieser Linie, unter Verwendung der von glutPassiveMotionFunc bereitgestellten Bildschirmkoordinaten) zu rendern.

Etwas wie folgt aus:

void display() { 
    // clear 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluPerspective(...) // create 3D perspective projection matrix 
    glMatrixMode(GL_MODELVIEW); 

    // Render 3D content here 

    // Render 2D content 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluOrtho2D(0, width, height, 0); // create 2D orthographic projection matrix with coordinate system roughly equivalent to window position 
    glMatrixMode(GL_MODELVIEW); 

    glBegin(GL_LINES); 
    glVertex2f(width/2, height/2); // now we can use "pixel coordinates" 
    glVertex2f(cursorX, cursorY); 
    glEnd(); 

    ... 
} 

Vergleichen Sie dies mit Ihrer Änderung der perspektivischen Projektion in Ihrem reshape Methode.

Offensichtlich wollen Sie auch Zustände deaktivieren, die für ein "2D" Rendering (wie Tiefenpufferprüfung, etc.) nicht sinnvoll sind, aber es sollte ziemlich offensichtlich sein. Werfen Sie einen Blick auf this GDSE post für eine Diskussion darüber, wie andere Menschen diese gleiche Aufgabe erledigen.

+0

Vielen Dank! Habe es funktioniert. –