Использование glutPassiveMotionFunc ();в глюте - PullRequest
0 голосов
/ 28 марта 2012

Я написал простую программу на OpenGL на C ++, которая отображает линию, соединяющую центр окна с текущей позицией указателя мыши.

Мой код:

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

Проблема, с которой я сталкиваюсь, заключается в том, что значения x и y, заданные в функции passive (), неправильно отображаются на экране, который использует проекцию перспективы.Таким образом, нарисованная линия соединяет центр с какой-то другой координатой за пределами экрана.Какие-либо изменения в коде, чтобы заставить его работать должным образом?

1 Ответ

1 голос
/ 28 марта 2012

Простым способом было бы создать матрицу ортографической проекции и затем визуализировать все ваши "2D" элементы (включая эту линию, используя экранные координаты, предоставленные glutPassiveMotionFunc).

Примерно так:

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

    ...
}

Сравните это с вашей модификацией перспективной проекции в вашем методе reshape.

Очевидно, вы также захотите отключить состояния, которые не имеют смысла для "2D""рендеринг (например, проверка буфера глубины и т. д.), но это должно быть довольно очевидно.Взгляните на этот пост GDSE для обсуждения того, как другие люди выполняют эту же задачу.

...