为什么我的点没有绘制在 OpenGL 中鼠标所在的位置?
Why are my points are not drawing where my mouse is in OpenGL?
除非我刚好是 window 高度的一半,否则我的点将不会绘制在鼠标所在的位置。如果我低于这条中线,它会画在这条线的上方,如果我在上面,它会画在下面。
附件是一张 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);
}
您需要 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 );
}
除非我刚好是 window 高度的一半,否则我的点将不会绘制在鼠标所在的位置。如果我低于这条中线,它会画在这条线的上方,如果我在上面,它会画在下面。
附件是一张 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);
}
您需要 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 );
}