2012-02-13 3 views
-1

사용자 입력을 왼쪽 및 오른쪽 클릭 형태로 받아서 다각형을 화면에 그려 봅니다. 모든 왼쪽 클릭은 (x, y) 좌표로 캡처되어 배열로 저장됩니다. 사용자가 마우스 오른쪽 버튼을 누른 후 마우스 기능은 다각형을 끝내고 (마지막 점을 원본에 연결) 화면에 표시해야합니다. 버텍스 배열을 사용하여 하드 코드 된 값으로 표시 기능에서 코드를 사용했는지 확인 했으므로 종료 조건 (즉, "GLUT_RIGHT_CLICK")을 처리하는 방법과 관련이 있다고 생각합니다.
여기에 오류가 표시 될 수 있습니까? 함수를 테스트 할 때 마우스 오른쪽 버튼을 클릭하면 충돌이 발생합니다.사용자 입력에서 그리기 OpenGL 버텍스 배열

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 나은과 같이 메인에서 호출됩니다

glutMouseFunc(mouseMove); 

이 너무 정점 배열과 관련이없는 다른 솔루션이 허용되지 않는 숙제의 일부입니다.

답변

1

이 함수는 마우스를 누를 때마다 호출되므로 루프를 사용할 필요가 없습니다. 문제를 어떻게 해결할 수 있는지에 대한 하나의 제안이 있습니다. 그것은 최고의 것이 아니지만 작동합니다. 그렇지 않으면 인스턴스 다듬기에 필요한, 당신은 단지 볼록 다각형이 방법을 그릴 수 있습니다 : 세계 좌표에

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. 
    } 
} 

당신이 창에서 변환하는 점을 unproject 할 필요가 있습니다 좌표. 희망이 도움이됩니다.