【问题标题】:OpenGl changing the unit of measure for coordinate systemOpenGL更改坐标系的测量单位
【发布时间】:2011-11-14 21:16:52
【问题描述】:

我正在使用最新的蓝皮书学习 OpenGL,我希望能得到一点澄清。书中说坐标系可以使用任何测量系统,但是在进行 3d 透视编程时,世界坐标为 +1/-1。

我想我有点困惑的地方是假设我想在我的世界中使用英尺和英寸,并且我想建造我的房子的内部。我会只使用 translates (x(feet), y(feet), z(feet)), extra,还是有一些函数可以改变你的 x,y 世界坐标(即将默认值从 -1/+1 更改为让比如说(-20/20)。我知道 openGl 会转换剩下的所有单位。

所以我想我最大的知识差距是如何对现实世界的对象(长度)进行建模以在 OPenGL 中有意义?

【问题讨论】:

  • 我会像这样缩放,说 20/20 = 1 opengl 单位,说我有 5 英尺的东西,它的长度是 5/20 还是 .25,然后手动进行所有缩放方式?

标签: c++ opengl scaling coordinate-systems units-of-measurement


【解决方案1】:

标准化的窗口坐标范围始终为 -1 到 +1。但它可以随心所欲地使用。 假设我们想要一个 -100 到 +100 的范围,然后将实际坐标除以 100。在这种情况下,使用 仅限函数 glVertex2f 或 glVertex3f。 例如glVertex2f(10/100,10/100).

【讨论】:

    【解决方案2】:

    ...但是在进行 3d 透视编程时,世界坐标为 +1/-1。

    说谁?也许您指的是剪辑空间,但这只是一个特殊空间,所有坐标都在投影之后。

    你的世界单位可以是任何东西。相关部分是,这些是如何预测的。假设您有一个 90°FOV 的透视投影,近裁剪平面为 0.01,远裁剪平面为 10.0,二次方位(为简单起见)。然后,您进入世界的视图体积将解析一个边长为 0.01 且距离观察者近 0.01 的矩形,并在远处以 0.02 的边长拉伸到 10.0。减小 FOV 并相应地缩小横向长度。

    不过,大约 0.01 到 10 范围内的坐标会被投影到 +/-1 剪辑空间中。

    因此,您可以自行选择投影限制以匹配您的场景和选择的单位。

    【讨论】:

    • 我认为剪辑空间部分与我的困惑有关。
    【解决方案3】:

    我认为作者指的是在透视分割之后出现的归一化坐标(设备坐标)。

    通常,当您在 OpenGL 中实际操作对象时,您会使用不限于 -1/+1 的标准世界坐标。这些世界坐标可以是任何您喜欢的坐标,并通过乘以模型视图和投影矩阵然后除以齐次坐标“w”来转换为归一化坐标。

    OpenGL 将为您完成所有这些工作(直到您进入着色器),所以不必担心归一化坐标。

    【讨论】:

    • 好的,所以如果我想建造一个 20x20 英尺的房间,我可以将我的正方形设置为类似 grayFloorBatch.Begin(GL_TRIANGLE_STRIP,4); grayFloorBatch.Vertex3f(-10.0f, -.56f,-10.0f); grayFloorBatch.Vertex3f(10.0f, -.56f,-10.0f); grayFloorBatch.Vertex3f(-10.0f, -.56f,10.0f); grayFloorBatch.Vertex3f(10.0f, -.56f,10.0f); grayFloorBatch.End();您通常会在 0,0,0 附近将对象分成两半,还是可以在正象限中构建,只使用全部 20 而不是 10?
    • 如果有帮助的话,我一直在玩 spear wold 的例子。
    • 原则上你所做的看起来不错(我没有检查你的数字)。通常,为了制作一个好的通用程序,您将在对象空间(具有本地原点)中定义您的几何图形,并使用变换(平移等)将其放入世界空间中的正确位置。
    • 所以如果我有 20x20 的东西,可以是英尺单位或厘米,我的选择对吗?然而,如果它的厘米,那似乎相当大,根本不按比例。
    • 是的,您的选择。出于调试和精度的原因,我会冒险保持您的单位数量较小。许多游戏使用米或英尺作为基本单位。
    【解决方案4】:

    嗯,这都是相对的。如果您将 1 个 OpenGL 单位设置为 1 米,然后在此基础上完美地构建所有内容以进行缩放,那么您就有了您想要的比例(即 10 米将是 10 个 OpenGL 单位,1 毫米将是 0.001 个 OpenGL 单位。

    但是,如果您要引入一个设计为 1 个 OpenGL 单位 = 1 英尺的模型,那么对象最终会变得大约大 3 倍。

    当然,您可以在各种方法之间进行更改,但到目前为止,最好的方法是在将模型加载到引擎之前重新缩放模型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-02
      • 2017-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多