为什么我的点不在OpenGL中绘制鼠标的位置?

问题描述 投票:0回答:1

除非我恰好是窗口高度的一半,否则我的点不会画出鼠标所在的位置。如果我在中途线以下,它将在该线上方绘制;如果我在中途,它将在以下绘制。

如果不清楚,则为GIF:https://gyazo.com/407d679430c70c3235d9e5c43e521347

我希望坐标系从屏幕的左下角开始(以及鼠标所在的绘制点)。如果有帮助,我正在开发Ubuntu的VirtualBox实例。

#include <iostream>
#include <vector>
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>
#include "Point.h"


const int w = 640;
const int h = 480;

// Prototypes
void display(void);
void myInit(void);
void myMouse(int button, int state, int x, int y);

// Globals
std::vector<Point> points;

int main(int argc, char** argv){    
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE);
    glutInitWindowSize(w, h);
    glutInitWindowPosition(0, 100);
    glutCreateWindow("My First Attempt");
    glutDisplayFunc(display);
    glutMouseFunc(myMouse);
    myInit();
    glutMainLoop();

}

void display(void){
            glClear(GL_COLOR_BUFFER_BIT);
            glBegin(GL_POINTS);
            // for each point in points, draw a point
            for(Point p : points)
                glVertex2i(p._x,p._y);
            glEnd();

            glFlush();
}
void myMouse(int button, int state, int x, int y){
            if(button == GLUT_LEFT_BUTTON && state == GLUT_DOWN){
                Point p;
                p._x = x;
                p._y = y;
                points.push_back(p);
                std::cout << p._x << "   " << p._y << std::endl;
                glutPostRedisplay();

            }
            if(button == GLUT_LEFT_BUTTON && state == GLUT_UP){

            }
}
void myInit(void){

            glClearColor(1.0,1.0,1.0,0.0);
            glColor3f(0,0,0);
            glPointSize(4.0);
            glMatrixMode(GL_PROJECTION);
            glLoadIdentity();
            gluOrtho2D(0.0f,w, 0,h);

}
c++ opengl glut
1个回答
2
投票

您需要Y翻转鼠标坐标或调整投影矩阵以匹配其坐标系:

// broken
gluOrtho2D( 0.0f, w, 0, h );

// works
gluOrtho2D( 0.0f, w, h, 0 );

全部:

#include <iostream>
#include <vector>
#include <GL/glut.h>
#include <GL/gl.h>
#include <GL/glu.h>

struct Point
{
    int _x, _y;
};

const int w = 640;
const int h = 480;

// Prototypes
void display( void );
void myInit( void );
void myMouse( int button, int state, int x, int y );

// Globals
std::vector<Point> points;

int main( int argc, char** argv )
{
    glutInit( &argc, argv );
    glutInitDisplayMode( GLUT_SINGLE );
    glutInitWindowSize( w, h );
    glutInitWindowPosition( 0, 100 );
    glutCreateWindow( "My First Attempt" );
    glutDisplayFunc( display );
    glutMouseFunc( myMouse );
    myInit();
    glutMainLoop();
}

void display( void )
{
    glClear( GL_COLOR_BUFFER_BIT );
    glBegin( GL_POINTS );
    // for each point in points, draw a point
    for( Point p : points )
        glVertex2i( p._x, p._y );
    glEnd();

    glFlush();
}

void myMouse( int button, int state, int x, int y )
{
    if( button == GLUT_LEFT_BUTTON && state == GLUT_DOWN )
    {
        Point p;
        p._x = x;
        p._y = y;
        points.push_back( p );
        std::cout << p._x << "   " << p._y << std::endl;
        glutPostRedisplay();
    }
}

void myInit( void )
{
    glClearColor( 1.0, 1.0, 1.0, 0.0 );
    glColor3f( 0, 0, 0 );
    glPointSize( 4.0 );
    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();
    gluOrtho2D( 0.0f, w, h, 0 );
}
© www.soinside.com 2019 - 2024. All rights reserved.