【发布时间】:2010-03-26 01:13:44
【问题描述】:
我有一个简单的 OpenGL 绘图。当用户更改窗口的大小时,我希望绘图保持其纵横比。我通过在调用 reshape 方法时将 glViewport 设置为具有适当纵横比的最大矩形来实现这一点。
我的问题是我想画一个永远留在窗口右上角的正方形,不管窗口的大小或形状是什么。现在,只要窗口被重新塑造,这个方块就会在屏幕上移动。
谁能解释一下如何做到这一点?
谢谢,
【问题讨论】:
标签: opengl coordinates
我有一个简单的 OpenGL 绘图。当用户更改窗口的大小时,我希望绘图保持其纵横比。我通过在调用 reshape 方法时将 glViewport 设置为具有适当纵横比的最大矩形来实现这一点。
我的问题是我想画一个永远留在窗口右上角的正方形,不管窗口的大小或形状是什么。现在,只要窗口被重新塑造,这个方块就会在屏幕上移动。
谁能解释一下如何做到这一点?
谢谢,
【问题讨论】:
标签: opengl coordinates
在调整屏幕大小时,您需要移动/调整正方形的大小。您可以使用设备坐标将一个正方形固定在左上角,但它不一定是长宽比变化的正方形。因此,您需要调整正方形的大小以使其保持正方形。
【讨论】:
这样做的一种方法是创建一个映射到像素坐标的新正交矩阵(左 = 0,底部 = 0,右 = 窗口宽度,顶部 = 窗口高度)并将 gl-viewport 设置为覆盖每当窗口改变时整个窗口。这样,您可以通过指定像素坐标来绘制正方形,前提是您确保设置了单位模型-视图矩阵。
不过,这不是唯一的方法。不管你有什么样的非奇异变换,只要 gl-viewport 覆盖这些像素,你应该能够想出一种方法来击中正确的像素,这样会更容易。
【讨论】:
如果我理解正确,您希望在 窗口 的右上角绘制一个正方形,而不管您的场景 viewport 位于何处。
执行此操作的最简单方法是,在以所需的纵横比渲染正常场景后,将 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) 暂时禁用剔除。
【讨论】:
要在窗口的右上角绘制一个正方形,您需要视口覆盖该区域。视口小于窗口将不允许在角落绘图。
您希望您的视口覆盖所有窗口(如通常所做的那样),并且您的方形坐标应映射到以下内容:
X0 = 1-2*s/width
X1 = 1
Y0 = 1-2*s/height
Y1 = 1
其中s 是正方形的边 (pix),width、height 是窗口的尺寸 (pix)。
【讨论】: