我正在制作一个简单的GLUT程序,它跟踪鼠标并在路径上放置点。
这是我的代码:
void init()
{
glClearColor( 0.0, 0.0, 1.0, 1.0);
glMatrixMode( GL_PROJECTION);
gluOrtho2D( 0.0, 400.0, 0.0, 400.0);
for(int i=0;i<5000;i++)
{
arr[i][0]=0;
arr[i][1]=0;
}
glPointSize(10.0);
}
void drawPoints()
{
glBegin( GL_POINTS );
glColor3f( 0.0,0.0,0.0 );
for ( int i = 0; i < z; i++ )
{
glVertex2f( arr[i][0], arr[i][1]);
}
glEnd();
}
void myDisplay()
{
glClear( GL_COLOR_BUFFER_BIT);
drawPoints();
glutSwapBuffers();
glutPostRedisplay();
}
void myMouseMove( int x, int y)
{
arr[z][0]=x;
arr[z++][1]=y;
}
int main( int argc, char ** argv)
{
glutInit( &argc, argv);
glutInitDisplayMode( GLUT_DOUBLE| GLUT_RGB);
glutInitWindowPosition( 100, 100);
glutInitWindowSize(600,600);
glutCreateWindow( "Testing");
init();
glutDisplayFunc( myDisplay);
glutPassiveMotionFunc( myMouseMove);
glutMainLoop();
return 0;
}
但是我遇到的问题很少:
答案 0 :(得分:2)
正在翻转的Y坐标实际上是预期的行为。只需在代码中纠正它,你应该没问题。
如果你想确保你的渲染图像和鼠标光标完全同步,只需让鼠标隐藏鼠标光标,然后使用OpenGL自己渲染它。
答案 1 :(得分:1)
你应该知道在OpenGL中使用传统的投影矩阵时:(0,0)是左下角。大多数窗口系统会将(0,0)映射到左上角。
在某些情况下,您只需将呼叫中的底部/顶部字段交换为glOrtho (...)
或gluOrtho2D (...)
即可使它们匹配 - 这会产生其他后果,例如反转多边形绕组,因此它不是永远是最好的方法。
至于“在光标前面绘制点”,我认为你可能正在描述输入延迟(特别是如果你使用的是VSYNC)。
当您使用软件光标与硬件光标时,鼠标的位置可能会偏离一帧或多帧。有关缓冲区交换间隔(OpenGL的VSYNC机制)对输入延迟的影响的技术讨论here(参见:Idiosyncrasies )。
答案 2 :(得分:0)
要修复反转,请执行600 - y以设置arr元素。另外你的gluOrtho2D的尺寸是400乘400,而你的窗户是600乘600,所以将你的gluOrtho2D刻度改为与窗口尺寸相同,你会没事的。