【问题标题】:OpenGL glViewport() (resetting coordinates)OpenGL glViewport()(重置坐标)
【发布时间】:2011-06-16 11:06:20
【问题描述】:

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

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

好的,这里有一个coden-p....

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();

}
}

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

【问题讨论】:

  • 也许你应该发布一些代码来阐明你想要做什么,因为你的描述不是很好,描述性的。
  • 在顶部你会看到我对我的问题所做的更改..
  • 你应该检查你的模型视图/投影矩阵,看看它们是否是你期望它们在每个函数中的样子。
  • 不相关,但不要使用 glFlush,它很慢,而且 glut 无论如何都会为你做到这一点
  • @buddy glutSwapBuffers(当然还有双缓冲)!顺便说一句,不要画你的运动功能,只需调用glutPostRedisplay,或类似的东西。

标签: c++ opengl coordinates reset viewport


【解决方案1】:

您应该检查您的模型视图/投影矩阵,看看它们是否是您期望它们在每个函数中的样子。

此外,正如 Christian 所评论的,没有必要也不建议绘制运动函数。根据输入更新您的应用程序状态并调用 glutPostRedisplay 以表示您要重绘窗口。这样,您的应用程序将拥有更简洁的设计,并且更容易使其行为一致。

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

【讨论】:

  • 为什么在motionfunc中绘制有问题?我不明白你的意思:“根据输入更新你的应用程序状态”你有一个例子。是否允许在 mousefunc 中绘图?当我在 glutdisplayfunc 中调用 glutPostRedisplay 时,没有任何效果。那么我可以在哪里画呢。
  • @buddy:您应该在其他变量中存储/使用来自 mousefunc 的输入(例如更新您的船航向,如果您正在编写游戏),并从 motionfunc 调用 glutPostRedisplay()。与键盘函数、菜单函数等类似。调用 glutpostredisplay 将告诉 GLUT 在处理完所有事件后立即调用 glutdisplayfunc。 (所以所有的绘图都进入了 displayfunc)。遵循该模式是进行事件/重绘的事实上的方式,并且可以避免像您遇到的问题,特别是如果有很多鼠标事件并且您以低帧率运行。
猜你喜欢
  • 2017-03-13
  • 1970-01-01
  • 1970-01-01
  • 2021-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-06
  • 2011-11-21
相关资源
最近更新 更多