【问题标题】:Set coordinate system to pixels in OpenGL for Cocoa在 OpenGL for Cocoa 中将坐标系设置为像素
【发布时间】:2010-12-11 00:52:09
【问题描述】:

我最近开始学习 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(),但他们没有提供有关如何执行此操作的任何信息。这行得通吗?如果行得通,我该怎么做?

【问题讨论】:

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


    【解决方案1】:

    对不起,如果我听起来很简短;事实证明,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)

    并提交所有没有 z 分量的未来几何体。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-13
      • 1970-01-01
      • 1970-01-01
      • 2015-12-31
      • 1970-01-01
      • 1970-01-01
      • 2011-11-21
      • 2017-06-13
      相关资源
      最近更新 更多