2010-03-25 145 views
1

我有一个简单的OpenGL绘图。当用户改变窗口的大小时,我想让绘图保持其宽高比。我通过在调用reshape方法时将glViewport设置为具有适当纵横比的最大矩形来实现此目的。OpenGL坐标问题

我的问题是,我想绘制一个正方形,它将始终保留在窗口的右上角,而不管窗口的大小或形状如何。现在,只要窗口被重新塑造,该方块就会在屏幕上移动。

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

谢谢

回答

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)临时禁用剔除。

1

当屏幕重新调整大小时,您需要移动/调整正方形的大小。您可以使用设备坐标将左右方框固定在左上方,但不一定是纵横比更改的平方。因此,您需要调整广场的大小以保持广场。

1

这样做的一种方法是创建一个映射到像素坐标(左= 0,底= 0,右=窗宽,顶=窗高)的新的正交矩阵,并将gl-viewport设置为每当窗口改变时覆盖整个窗口。这样,您可以通过指定像素坐标来绘制一个正方形,如果您确定设置了标识模型 - 视图矩阵。

虽然这不是唯一的方法。不管你有什么非奇异变换,只要gl-viewport覆盖这些变换,你就应该能够想出一个正确像素点的方法,这样做更简单。

0

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

你希望你的视口覆盖所有窗口(如通常完成),以及你方坐标应该被映射到类似:

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

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