OpenGL ES 2.0:投影矩阵和宽高比之间的联系是什么?

时间:2018-01-01 23:04:59

标签: android opengl-es

问题: 我正在阅读" OpenGL ES 2 for Android:快速入门指南"并且到了第5章他们开始使用这些设备'考虑宽高比和我似乎无法理解它们在正投影和设备纵横比之间的联系。在书中他们提到了使用正交投影,这将允许一步走出OpenGL使用的标准化坐标空间,进入虚拟坐标空间,以便能够考虑纵横比。然后,一旦考虑了纵横比,就必须将虚拟坐标带回标准化系统。 我对他们使用单词"虚拟坐标系"感到有点困惑。这里也是

我理解的是: 据我所知,如果要制作一个圆圈并将其放置在OpenGL的标准化坐标系中,则圆圈将根据设备的方向拉伸和压扁,因为设备的纵横比不同于纵横比1 OpenGL的规范化坐标系有。我不明白的是,使用正交投影将如何帮助我们解决问题。我想我理解正投影是什么,但万一我不能用简单的术语来定义它?

1 个答案:

答案 0 :(得分:1)

  

我想我理解正投影是什么,但万一我不能用简单的术语定义这个?

我认为这是问题的一部分。您在数学意义上理解术语投影 - 幂等映射,这在减少数据维度时是典型的。在典型的渲染管道中,&#34;投影&#34;矩阵根本不进行任何投影。相反,渲染API为3D 视图 定义了一些约定。在OpenGL中,查看量被定义为规范化设备坐标中的多维数据集-1 <= x,y,z <= 1。每个立方体的边形成六个剪裁平面。这些平面之外的任何几何体都将被剪裁或剔除 - 因此这些平面仅代表屏幕的边缘(或实际上是视口,但想象一下这里的屏幕更直观)。

投影矩阵的任务(结合透视除以w)只是从3D眼睛空间转换(某些笛卡尔坐标系相对于&#34;相机&#34;,如果有的话我想用这些术语来思考3D规范化的设备空间。在正常情况下没有发生数学预测。这也意味着投影矩阵定义了6个剪裁平面在眼睛空间中的位置。您基本上可以在标准化的设备空间中拍摄明确定义的视角体积角,并应用投影矩阵的反转(并进行另一个透视分割)并在眼睛空间中取回观察体积的八个角。 因此,投影矩阵定义了世界的哪个范围被映射到屏幕,并且如果对象看起来没有失真,则视锥体的纵横比必须等于用于渲染的视口的纵横比。

对于正交&#34;投影&#34;,投影矩阵所做的就是在眼睛空间中定义一些长方体(通常是轴对齐的长方体,因此它按比例缩小并按尺寸平移)。通常,通过直接指定眼睛空间中的观看体积来定义这种正交变换,即指定leftrighttopbottomnear以及far值。现在,投影矩阵只是将x_eye=left映射到-1(NDC中的左剪裁平面),将x_eye=right映射到1(NDC中的右剪裁平面),依此类推。

如果是透视&#34;投影&#34;,观看体积将是眼睛空间中的金字塔平截头体。因为我们必须使用同质w组件,所以数学运算有点复杂,我不想在这里详细介绍,但关键是我试图获得通过这里是仍然没有投影。透视投影将金字塔视锥体变换为NDC中的立方体,并且用它来转换该体积内的所有物体 - 视锥体中的立方体实际上将变形为稍微倒置的#34;金字塔截头体,在NDC中,实际的距离越远。

真正的投影正在发生的唯一情况是在光栅化过程中只考虑xy坐标时 - 这始终是沿{{的正交投影1}} m并且它不是由任何预测矩阵完成的。