OpenGL glViewport()(重置坐标)

时间:2011-06-16 11:06:21

标签: c++ opengl coordinates reset viewport

我的glViewport有问题。在我的liitle程序中,我有两个视口。我可以在其中一个视口中绘制一个表单(使用motionfunc),在另一个视口中自动绘制一条线。 到现在为止还挺好.. 当我尝试用mousefunc绘制一些东西时,视口处于完全不同的位置。并且很难找到该视口的新正确坐标。 是否有可能重置坐标.. 我不能在鼠标或动作中使用glLoadIdentity,因为什么也没有显示。

我希望你明白我的意思。这有点难以解释。

好的,这里有一个codenippet ....

void mouse (int button, int state, int mx, int my)
{
if (modus == 0 && button==GLUT_LEFT_BUTTON && state != GLUT_DOWN) 
{
    ...
}

else if (modus == 1 && button==GLUT_LEFT_BUTTON && state == GLUT_DOWN) 
{


    **glViewport(10,10 , sw_w1, sw_h1);** 
//the drawing is much higher than in the first viewport in motion. 
//But it should be the same viewport like the first in motion.
    glBegin()...glEnd()
            glFlush();
}   
}   
void motion(int mousex,int mousey)
{
GLdouble h=12;
GLdouble winkel=360/h;
Line liste[num];

liste[++last].x =(mousex)-((sw_w1+2*GAP)/2);
liste[last].y   =(mousey)-((sw_h1+2*GAP)/2);

if (modus==0 && gruppe == 0) {
    if (last>=1)
    {
        glViewport(10, 10, sw_w1, sw_h1); //works fine
        glColor3d(R, G, B);
        for(h+1;h>0;h--){
            glRotated(winkel, 0, 0, 1);
            glBegin(GL_LINE_STRIP);
            for(int i=last-1;i<=last;i++){
                glVertex2i(liste[i].x,liste[i].y);
            }
            glEnd();
        }

        glLineWidth(linewidth+0.5);
        glColor3f(1, 0, 0);
        glBegin(GL_LINE_STRIP);
        for(int i=last-1;i<=last;i++){
            glVertex2i(liste[i].x,liste[i].y);
        }
        glEnd();
        glViewport(1020,10 , sw_w2, sw_h2); //works fine
        glColor3f(1, 0, 0);
        glBegin(GL_LINE_STRIP);
        for(int i=last-1;i<=last;i++){
            glVertex2i(liste[i].x,liste[i].y);
        }
        glEnd();
    }
    glFlush();

}
}

第二个和第三个视口工作正常。第一个与第二个相同,但图片显示得更高。为什么会这样? 我怎么能改变它,以便我像第二个一样获得相同的视口。 我希望你现在明白我的意思。

1 个答案:

答案 0 :(得分:1)

你应该检查你的模型视图/投影矩阵,看看它们是否符合你对每个函数的期望。

此外,正如克里斯蒂安所评论的那样,没有必要也没有建议吸引动作。根据输入更新您的应用程序状态,并调用glutPostRedisplay来表示您要重绘窗口。这样,您的应用程序将具有更清晰的设计,并且更容易使其表现一致。

(将我的评论添加为答案,因为那是问题所在,并添加了Christian的评论,因为这是正确的解决方案。不要在motionfunc中绘制!。)