【问题标题】:Coordinates in openGLopenGL中的坐标
【发布时间】:2014-01-06 10:55:13
【问题描述】:

我在 openGL 中找不到正确的坐标。

例如: - 如果 h 和 w 是窗口的高度和宽度,那么我想在距离底部 h/4 处绘制一条长度为 w/2 的线。我将如何在 openGL 中执行此操作?

我没有找到任何说明坐标最大值和最小值的参考资料。 我的电脑屏幕是 1024*768 所以技术上的限制应该是:- x 坐标:-512 到 512 y 坐标:-384 到 384 z 坐标:-inf 到 0

但这不起作用。为什么?我需要知道坐标系是如何为 openGL 工作的。

【问题讨论】:

    标签: opengl


    【解决方案1】:

    在 OpenGL 中,您可以根据需要重新定义坐标系。默认坐标系由从模型空间到裁剪空间标识转换到 NDC 空间的标识变换定义。这意味着,xy 坐标范围 [-1,1]² 映射到您使用 glViewport 设置的视口。但是,通过应用正确的转换,您可以将该映射更改为您想要或需要的任何内容。

    所以我强烈建议你阅读一些关于 OpenGL 转换管道以及如何使用它的教程。

    固定函数流水线方法http://www.opengl.org/wiki/Vertex_Transformation

    现代方法http://arcsynthesis.org/gltut/Positioning/Tut03%20A%20Better%20Way.html

    【讨论】:

    • 我仍然有疑问:- 1)我将windowSize设置为400 x 400。但坐标仍然不在-200到200之间。为什么?我需要一个关于内部事情如何发生的详细教程。有链接吗?
    • @clereamusjd:请参阅我的第一个链接,它描述了您可能正在使用的固定功能管道。只要您不设置任何矩阵,范围 -1 到 1 就会映射到您正在使用的任何窗口大小。
    • 我还没有阅读您提供的链接页面,但我想我缩小了我的怀疑范围。在示例代码中,我有一行 gluPerspective (45.0, width/height, 1.0, 200.0);当我删除这条线时,x,y 坐标确实在 -1 到 1 的范围内。同样使用 gluPerspective 线,我需要将 z 坐标设为负值。 0.0 不起作用。任何帮助表示赞赏。
    • @clereamusjd:是的,这是 gluPrespective 的定义行为。除了左、右、上和下(实际上所有投影定义了所有 6 个剪裁平面)外,它还定义了一个前剪裁平面和一个近剪裁平面。超出范围的任何内容都将被剪裁。默认投影方向朝向负 Z 轴。因此,您必须在特定设置中将顶点在 -1.0 到 -200.0 之间移动才能显示出来。请注意,在透视投影中,near 值不允许为 0,实际上您应该选择尽可能大的 near。
    • 好的,现在我明白了。如果我将 z 坐标设置为 -5.0 或其他值,xy 范围会增加对吗?由于图像更深,它不会保持 -1 到 1。我对吗?还假设我想改变视野角度和纵横比。我不想更改剪裁平面。我该怎么做? gluPerspective 想让我改变一切
    【解决方案2】:

    一开始我也很难使用通用坐标系。

    我最终做的对我来说更有意义的是使用 OpenGL 坐标系,就好像我在真实世界坐标系中使用真实对象一样。

    我所做的是:我制作了一个 TARDIS(来自电视节目神秘博士)的蓝图,它的尺寸以英寸和英尺为单位构建蓝色盒子。

    从那里,我采用了 GL 坐标系,对于每个“1”GL 单位,我将其设为“1”英尺,即 12 英寸。

    并且 - 基于 0,0,0 作为我的 TARDIS 的中心点,我只是通过代码手工绘制了 TARDIS,正如我在蓝图上看到的那样,从我在蓝图上看到的转换精确的尺寸。

    这是我所做的一个小例子:

    glBegin( GL_QUADS );
        glNormal3f( 1.0f, 0.0f, 0.0f);
        glTexCoord2f(0.0f, 0.0f); glVertex3f(15.0f/12.0f, myTop, 2.0f-(ONEINCH*0.25f));
        glTexCoord2f(0.0f, 1.0f); glVertex3f(3.25f/12.0f, myTop, 2.0f-(ONEINCH*0.25f));
        glTexCoord2f(1.0f, 1.0f); glVertex3f(3.25f/12.0f, myTop-(14.5f/12.0f), 2.0f - (ONEINCH*0.25f));
        glTexCoord2f(1.0f, 0.0f); glVertex3f(15.0f/12.0f, myTop-(14.5f/12.0f), 2.0f - (ONEINCH*0.25f));
    glEnd();
    

    我在本练习中学到的第一件事是 - GL 单位是通用单位。因此,应用一个我更熟悉的系统 - 英尺和英寸 - 让我们更容易专注于 GL,而不是这个单位到底是什么意思?

    一旦开始绘图,我就可以更有效地使用 gluPerspective,这有助于我理解视口分辨率(不要与屏幕分辨率混淆)只需要处理一次,那就是在利用gluPerspective 命令(如下)

    gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,250.0f);
    

    所以回答您的问题:浮点值没有最大值,只有您正在处理的浮点数的准确度级别。

    例如,在我上面的透视示例中,我将视口放在非常近的位置(0.1 GL 单位,即 1.2 英寸),并将距离设置为 250 GL 单位,或 250 英尺的距离。

    我认为这部分是 OpenGL 的初衷。它是通用单位,因为如果您有一个真实世界的单位系统来再次测量它,那么三维设计会更有意义。

    我的建议是:不要认为 GL 单位除了与小规模和大规模的浮点不准确性相关的误差程度之外还有界限或限制。

    事实上,我建议将其与现实世界的单位进行比较。我以英尺和英寸为单位工作。公制和米是相当普遍的。如果这些对你不起作用,那就弥补一个。

    这是我构建的 TARDIS: https://universalbri.wordpress.com/2015/05/24/creators-journal-holodeck-management-system-progress-10/

    我正在开发一款包含所有这些内容的游戏,一款没有战斗的星际迷航 Online,现在正在做数据库工作 (SQL Server),OpenGL 是问题的一部分:我可以使用自己的引擎而不是利用其他人的引擎。

    答案是肯定的,我可以,事实上它更可取。

    祝你好运

    【讨论】:

      猜你喜欢
      • 2011-11-21
      • 1970-01-01
      • 2013-04-30
      • 1970-01-01
      • 2013-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      相关资源
      最近更新 更多