将坐标系设置为OpenGL for Cocoa中的像素

时间:2010-12-11 00:52:09

标签: iphone objective-c opengl-es coordinate-systems

我最近学习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(),但他们没有提供任何有关如何操作的信息。这会起作用,如果是的话,我该怎么做?

1 个答案:

答案 0 :(得分: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);

然后在modelview上执行一次:

glTranslatef(0,0,-500)

并且在没有z组件的情况下提交所有未来的几何体。

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

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