OpenGL协调问题

时间:2010-03-25 09:40:19

标签: opengl coordinates

我有一个简单的OpenGL绘图。当用户更改窗口的大小时,我希望绘图保持其纵横比。我通过在调用reshape方法时将glViewport设置为具有适当宽高比的最大矩形来实现这一点。

我的问题是,无论窗口的大小或形状如何,我都希望绘制一个始终位于窗口右上角的正方形。现在,只要重新塑造窗口,该正方形就会在屏幕上移动。

任何人都可以解释一下如何做到这一点吗?

谢谢,

4 个答案:

答案 0 :(得分:1)

当重新调整屏幕大小时,您需要移动/调整方块的大小。您可以使用设备坐标将方块固定到左上角,但不一定是宽高比更改的平方。因此,您需要调整方块的大小以使其保持正方形。

答案 1 :(得分:1)

这样做的一种方法是创建一个映射到像素坐标的新正交矩阵(left = 0,bottom = 0,right = window-width,top = window-height)并将gl-viewport设置为覆盖窗口改变时整个窗口。这样,如果确保设置了标识模型 - 视图矩阵,则可以通过指定像素坐标来绘制正方形。

但是,这不是唯一的方法。无论你有什么非奇异变换,只要gl-viewport覆盖了那些,就应该能够想出一种方法来击中正确的像素,这样就更容易了。

答案 2 :(得分:0)

要在窗口的右上角绘制一个正方形,您需要视口来覆盖此区域。视口小于窗口将不允许在角落中绘图。

您希望视口覆盖所有窗口(通常都是这样),并且您的方形坐标应该映射到以下内容:

X0 = 1-2*s/width
X1 = 1
Y0 = 1-2*s/height
Y1 = 1

其中s是方形(pix)的一侧,widthheight是窗口的尺寸(pix)。

答案 3 :(得分:0)

如果我理解正确,您希望在窗口的右上角绘制一个正方形,无论您的场景视口位于何处。

最简单的方法是,在渲染了具有所需宽高比的普通场景后,将gl视口更改为要在顶角绘制的方块。然后绘制一个“全屏”四边形填充方块,在这种情况下全屏实际上成为全视口。

未经测试的半伪代码将是这样的:

// Draw normal scene
glViewport(x, y, w, h);
drawScene();

// Draw top-right red square
glViewport( windowWidth - squareWidth, windowHeight - squareHeight,
            squareWidth, squareHeight );
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glColor3f(1.f, 0.f, 0.f);
glRectf(-1.f, -1.f, 1.f, 1.f);

确保glRectf的绕组与您当前的gl剔除面配置相匹配。或者,暂时禁用glDisable(GL_CULL_FACE)/ glEnable(GL_CULL_FACE)的剔除。