如何在 opengl 中使用子窗口

How to use subwindows in opengl

本文关键字:窗口 opengl      更新时间:2023-10-16

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

编辑:

好的,这就是我在左侧绘制点的方式。这些点基本上是用户的点击。我捕获这些事件并制作一个列表,然后使用 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();
}

当我按下按钮时,调用了上述函数,但没有任何反应。我的坐标系有误吗?不过,我没有做太多设置坐标系的工作。

我建议尽可能避免使用 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上下文。