OpenGL顶点数组,从用户输入中提取

时间:2012-02-13 06:26:37

标签: c++ arrays opengl glut

我试图以左右点击的形式接受用户输入,以在屏幕上绘制多边形。每次左键单击都被捕获为(x,y)坐标并保存到数组中。用户按下右键后,鼠标功能应完成多边形(将最后一个点连接到原始点)并将其显示在屏幕上。我已经使用顶点数组验证了在显示功能中使用我的代码和硬编码值,所以我认为问题与我如何处理终止条件有关(即“GLUT_RIGHT_CLICK”)
你能在这里看到错误吗?当我测试该功能时,它会在右键单击时崩溃。

void mouseMove(int click, int state, int x, int y)
{
    clearFramebuffer();
    static int i = 0;
    drawit();
    glEnableClientState(GL_VERTEX_ARRAY);
    while(click!=GLUT_RIGHT_BUTTON){
        if(click==GLUT_LEFT_BUTTON && state == GLUT_DOWN){

            vertices[i]=x;
            vertices[i+1]=y;
            //{10, 10, 10, 50, 50, 50, 50, 10};
            //printf("Coords:  (%d,%d)\n",vertices[i],vertices[i+1]);
            i++;i++;
        }
    }
    //drawit();
    glVertexPointer(2, GL_INT, 0, vertices);
    glDrawArrays(GL_POLYGON, 0, 10);
    glDisableClientState(GL_VERTEX_ARRAY);  
    glutPostRedisplay();
}

mouseMove在main中被调用,如:

glutMouseFunc( mouseMove );

这是我作业的一部分,因此不允许任何其他不涉及顶点数组的解决方案。

1 个答案:

答案 0 :(得分:1)

每次按下鼠标时都会调用此函数,因此不需要循环。以下是您如何解决问题的一个建议。它不是最好的,但会起作用。请注意,您只能以这种方式绘制凸多边形,否则您需要进行tesselation:

std::vector<std::pair<int,int> > points;
void UnprojectPoint(std::pair<int,int> point, 
    std::pair<double,double>& unprojected) {
  double modelview[16], projection[16];
  int viewport[4];
  double objz;

  //get the modelview matrix        
  glGetDoublev( GL_MODELVIEW_MATRIX, modelview );
  //get the projection matrix
  glGetDoublev( GL_PROJECTION_MATRIX, projection );
  //get the viewport        
  glGetIntegerv( GL_VIEWPORT, viewport );

  //Unproject the window co-ordinates to 
  //find the world co-ordinates.
  gluUnProject( x, y, 0, modelview, projection, viewport, 
      &unprojected.first, &&unprojected.second, &objz);
}

void MousePressFunc(int button, int state, int x, int y) { 
  if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) {
    points.push_back(std::make_pair(x, y));
  } else if (button == GLUT_LEFT_BUTTON && state == GLUT_UP) {
    glBegin(GL_POLYGON);
      for (unsigned index = 0; index < points.size(); ++index) {
        std::pair<double, double> unprojected;
        UnprojectPoint(points[index], unporjected);
        glVertex2f(unprojected.first, unprojected.second);
      }
    glEnd(); // GL_POLYGON
    points.clear(); // Clear the polygon.
  }
}

请注意,您需要取消投影点以将其从窗口坐标转换为世界坐标。 希望这会有所帮助。