我试图以左右点击的形式接受用户输入,以在屏幕上绘制多边形。每次左键单击都被捕获为(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 );
这是我作业的一部分,因此不允许任何其他不涉及顶点数组的解决方案。
答案 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.
}
}
请注意,您需要取消投影点以将其从窗口坐标转换为世界坐标。 希望这会有所帮助。