【发布时间】: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