GLUT鼠标跟踪和绘图

时间:2013-09-12 21:46:11

标签: opengl mouseevent glut

我正在制作一个简单的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;
}

但是我遇到的问题很少:

  1. Y坐标以相反方向运行。
  2. 在光标位置前方绘制点(在向一个方向移动时)。
  3. 有没有更好的方法呢?

3 个答案:

答案 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刻度改为与窗口尺寸相同,你会没事的。