我的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();
}
}
第二个和第三个视口工作正常。第一个与第二个相同,但图片显示得更高。为什么会这样? 我怎么能改变它,以便我像第二个一样获得相同的视口。 我希望你现在明白我的意思。
答案 0 :(得分:1)
你应该检查你的模型视图/投影矩阵,看看它们是否符合你对每个函数的期望。
此外,正如克里斯蒂安所评论的那样,没有必要也没有建议吸引动作。根据输入更新您的应用程序状态,并调用glutPostRedisplay来表示您要重绘窗口。这样,您的应用程序将具有更清晰的设计,并且更容易使其表现一致。
(将我的评论添加为答案,因为那是问题所在,并添加了Christian的评论,因为这是正确的解决方案。不要在motionfunc中绘制!。)