2

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

编辑:

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

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

4

1 回答 1

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 上下文。

于 2012-05-06T13:32:49.920 回答