如何在opengl中使用子窗口

时间:2012-05-06 05:20:10

标签: c++ opengl stl glut

我正在尝试使用子窗口通过旋转来生成曲线中的对象。我能够生成所有曲线。现在我也将窗口分为两部分。我想在左子窗口中绘制曲线,并希望通过沿右侧的轴旋转来生成实体。我无法在正确的子窗口中绘制任何内容。

编辑:

好的,这就是我在左边部分画点的方法。点基本上是用户点击的。我捕获这些事件并制作一个列表,然后使用for循环打印它们。

// This function takes a list of points and draws the dots in the screen
void drawDot(vector<vec2> listPts)
{
    glBegin(GL_POINTS);
    glColor3f(1.0,1.0,1.0);

    if(j==0) // J=0 means points are being added using add option, no insert after is currently being used
    {
        for(int i=0;i<listPts.size();i++)
        {
            glVertex2i(listPts[i].x,listPts[i].y);
        }
    }
    else if(j!=0)// this else part is for making selected points look red, as for this j!=0 
    {
        for(int i=0;i<listPts.size();i++)
        {
            if(i==j ) // make only the selected point red
            {
                glColor3f(1.0,0.0,0.0);
                glVertex2i(listPts[i].x,listPts[i].y);
            }
            else // rest all the points are same as before i.e. white
            {
                glColor3f(1.0,1.0,1.0);
                glVertex2i(listPts[i].x,listPts[i].y);
            }
        }
    }

    glEnd();
    glFlush();
}

现在假设我有一组积分。我只想在右侧子窗口中绘制相同的点,以确定它是否正常工作。所以,我创建了一个按钮,当我按下按钮时,我想切换到正确的窗口并绘制一些东西。我在VS2010中使用了调试并检查了如果绘图功能完全被调用并且正在调用它并且屏幕上仍然没有任何内容。

这是我用来在第二个窗口中绘制的函数。

void drawDotWin2(vector<vec2> listPts)
{
    glBegin(GL_POINTS);
    glColor3f(1.0,1.0,1.0);

    for(int i=0;i<listPts.size();i++)
        {
            glVertex2i(listPts[i].x,listPts[i].y);
        }
    glEnd();
    glutWireTeapot (0.5);
    glFlush();
}

当我按下按钮时。调用上面的函数但没有任何反应。我的坐标系统错了吗?我没有做太多设置坐标系。

1 个答案:

答案 0 :(得分:2)

我建议尽可能避免使用GLUT实用程序,特别是当它们在应用程序实现中不是绝对必要时; glutCreateSubWindow 可能就是其中之一。

如果您需要在不同的部分拆分窗口,请了解如何使用glViewport

例如,如果主窗口的客户区域为800x600像素,并且我想水平分割窗口,则绘制例程将为:

void draw()
{
    // Draw on left side
    glViewport(0, 0, 400, 600);
    glClear(...);
    gluOrtho2D(0, 0, 400, 600);

    // ... DrawCommands1

    // Draw on left side
    glViewport(400, 0, 400, 600);
    glClear(...);
    gluOrtho2D(0, 0, 400, 600);

    // ... DrawCommands2
}

以这种方式,两幅图不重叠。在每一侧绘制的图元被定义的视口区域剪切,该区域以相对于主窗口客户区域的像素坐标定义。

投影矩阵(在上面的情况下是2D正交)是相对于视口的,而不是窗口区域,确实你不需要担心视口位置。

另请注意,每个GLUT子窗口都会创建一个OpenGL上下文,实际上每个GLUT子窗口都拥有自己的状态,状态更改不会影响其他子窗口。相反,在我的回答中,这两个例程共享相同的OpenGL上下文。