使用OpenGL ES在任何分辨率上的视口边界

时间:2011-09-20 23:04:55

标签: android opengl-es perspective

我很难理解OpenGL透视图。我已经阅读了大量的信息,但它并没有帮助我尝试实现我所追求的目标。这确保我的3D场景在每个Android设备上都填满整个屏幕。

为了测试这个,我将在3d空间中绘制一个四边形,最后应该触及每个角落,填满整个设备的屏幕。然后我可以使用这个四边形,或者实际上它的坐标指定一个Z距离的边界框,我可以使用它来放置我的几何体并确保它们填满我的屏幕。当屏幕调整大小,或者我要在另一个屏幕分辨率上运行它时,我会重新计算此边界框和几何体。我不是在谈论静态几何,但是比如说我想用球填充屏幕,无论有多大或多少球都没关系,唯一重要的是屏幕被填满而且没有多余的可见平截头体外的球。

enter image description here

  • 据我所知,在指定视口时,您实际上将像素值绑定到视锥体的边界。我知道您实际上可以以窗口像素与3d几何位置匹配的方式设置正交视图,但我不确定它在透视视图中的工作原理。
  • 这里我假设视口宽度和高度要映射到nearZ。因此,当球在Z = 1f时,它具有原始尺寸
  • 当将球移入屏幕以便朝向farZ方向移动时,球将按比例缩小以使透视工作。例如,Z = 51f的球在我的屏幕上会显得更小,我需要更多的球来填满整个屏幕。
  • 现在为了做到这一点,我正在寻找紫色边界
  • 实际上我需要这些边界以不同的平截头体尺寸(宽x高)填充整个屏幕,而球的平截头体角和Z距离始终相同
  • 我想我可以用trig来计算这些紫色边界(见蓝色三角形注释)
  • 我是否正确标记了平截头体角度,它是平截头体的垂直角度?
  • 有人可以详细说明绿色的1f和-1f值,因为我似乎已经读过它了吗?看起来像是用于调整平截头体内几何体大小的标量?

我实际上希望能够在任意分辨率/窗口的3d空间内针对任何Android设备的视口边界进行programmaticaly定位几何体。

注意:我有一个闪光背景,它使用一个具有任何分辨率的已知宽度x高度的舞台(视觉区域),这使得使用绝对测量或百分比测量很容易定位/缩放资产。我想我正在试图弄清楚这个系统如何应用于OpenGL的透视图。

1 个答案:

答案 0 :(得分:2)

我猜this post using gluUnproject回答了这个问题。