0

我正在制作一个简单的 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. 有没有更好的方法来做到这一点?
4

3 回答 3

2

被翻转的 Y 坐标实际上是预期的行为。只需在您的代码中纠正它,您就可以了。

如果要确保渲染的图像和鼠标光标完全同步,只需让 glut 隐藏鼠标光标,然后使用 OpenGL 自己渲染。

于 2013-09-14T17:57:27.207 回答
1

您应该知道,在 OpenGL 中使用传统投影矩阵时:(0,0) 是左下角。大多数窗口系统会将 (0,0) 映射到左上角。

在某些情况下,您可以通过在调用中交换底部/顶部字段来使它们匹配glOrtho (...)gluOrtho2D (...)- 这会产生其他后果,例如反转多边形绕组,因此它并不总是最好的方法。


至于“在光标前绘制点”,我认为您可能是在描述输入延迟(特别是如果您使用的是 VSYNC)。

当您使用软件光标与硬件光标时,鼠标的位置可能会偏离一帧或多帧。这里有一些关于缓冲区交换间隔(OpenGL 的 VSYNC 机制)对输入延迟的影响的技术讨论(参见:Idiosyncrasies )。

于 2013-09-12T22:06:27.400 回答
0

要修复反转,请执行 600 - y 设置 arr 元素。此外,您的 gluOrtho2D 的比例为 400 x 400,而您的窗口为 600 x 600,因此将 gluOrtho2D 比例更改为与窗口大小相同,您会没事的。

于 2016-06-27T21:38:41.970 回答