1

我最近开始学习 OpenGL,到目前为止它看起来很直观,但我坚持下去。如何更改设置以便 OpenGL 使用基于像素的坐标系而不是现在使用的坐标系。例如,这段代码绘制了一个大约 10x20 像素的矩形:

glBegin(GL_QUADS); {
     glVertex3f(player.x, player.y, 0);
     glVertex3f(player.x+0.05, player.y, 0);
     glVertex3f(player.x+0.05, player.y+0.1, 0);
     glVertex3f(player.x, player.y+0.1, 0);
}

我怎样才能使这段代码:

glBegin(GL_QUADS); {
     glVertex3f(player.x, player.y, 0);
     glVertex3f(player.x+10.0, player.y, 0);
     glVertex3f(player.x+10.0, player.y+20.0, 0);
     glVertex3f(player.x, player.y+20.0, 0);
}

会产生基本相同的东西吗?谢谢。

编辑:我看到有人建议在某处使用 glOrtho() ,但他们没有提供有关如何执行此操作的任何信息。这会奏效吗?如果可以,我该怎么做?

4

1 回答 1

2

对不起,如果我听起来很简短;事实证明,iPad 上的 Safari 会丢掉你的打字,其中一个可能是内存警告导致的重新加载。

假设:您已经标记了问题 iPhone,所以您在谈论 Cocoa Touch(原点在左上角,y 轴上的正数向下)。同样,您可能想要的是点,而不是像素——因此无论是否在视网膜显示器上,屏幕上的像素都是 320x480。

glOrtho 正是您想要的 - 请参阅http://www.khronos.org/opengles/documentation/opengles1_0/html/glOrtho.html上的手册页。因此,您可能希望对投影堆栈执行此操作:

    glOrthof(0, 320, 480, 0, 1, 1000);

然后在模型视图上执行一次:

    glTranslatef(0, 0, -500)

并提交所有没有 az 组件的未来几何图形。

这样做是设置一个没有透视的视口(即,z 位置不影响对象大小),屏幕的左边缘在 x=0,右边缘在 x=320,顶部在 y=0 和y=480 处的底部。它任意地将近裁剪平面放置在距离 1 处,将远裁剪平面放置在距离 1000 处,因为它们必须在某个地方。但是随后它转换为两者之间的中间(好吧,不完全准确),因此如果您不再提交任何 z 坐标,那么您的所有几何图形都将可见,并且如果您有一些围绕 y 或 x 旋转的余地要他们。

但请注意:glVertex 调用在 iOS 上不可用,因为它们不是 OpenGL ES 的一部分。它们在现代 OpenGL 中也已被弃用。简短的版本是,它们确实效率低下,驾驶员很难快速处理。glVertexPointer 是要使用的东西,传入一个 C 数字数组。

于 2010-12-11T03:24:59.123 回答