1

当鼠标单击我在屏幕上创建的按钮时,我希望我的程序绘制一个多边形。我应该把绘制多边形命令放在哪里?我知道我无法放入我的鼠标功能,因为下次我的显示回调运行时它的效果会丢失,它必须在我的显示功能中。但是我可以在我的显示功能中设置一个 if 条件吗?

4

1 回答 1

0

希望这对您有所帮助,就像它帮助了我一样。一旦您将鼠标坐标转换为您的 3D 对象可以使用的东西(参见下面的代码)并将其存储在某处,您就可以使用变换在存储的坐标处在循环中绘制您的对象。我在我的 OpenGL 程序的 init 函数中初始化了我的形状、颜色等,但只有在我在键盘上选择了一个数字然后在我的视口中单击某处时才绘制它。重复这些步骤将该对象移动/转换到新坐标。

void MouseButton(int button, int state, int x, int y)
{
if (button == GLUT_LEFT_BUTTON)
{
    leftmousebutton_down = (state == GLUT_DOWN) ? TRUE : FALSE;     
    if(leftmousebutton_down)
    {
        cout << "LEFT BUTTON DOWN" << endl;
        //pTransInfo[0].vTranslate  = Vector3( 0.5f, 0.5f, 0.5f ); // center of scene
        GLint viewport[4]; //var to hold the viewport info
        GLdouble modelview[16]; //var to hold the modelview info
        GLdouble projection[16]; //var to hold the projection matrix info
        GLfloat winX, winY, winZ; //variables to hold screen x,y,z coordinates
        GLdouble worldX, worldY, worldZ; //variables to hold world x,y,z coordinates

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

        winX = (float)x;
        winY = (float)viewport[3] - (float)y;
        winZ = 0;

        //get the world coordinates from the screen coordinates
        gluUnProject( winX, winY, winZ, modelview, projection, viewport, &worldX, &worldY, &worldZ);

        cout << "coordinates: worldX = " << worldX << " worldY = " << worldY << " worldZ = " <<  worldZ << endl; //THIS IS WHAT YOU WANT, STORE IT IN AN ARRAY OR OTHER STRUCTURE
    }
}

}

于 2012-05-25T05:46:40.930 回答