OpenGL ES屏幕投影矩阵和相机投影矩阵

时间:2015-02-11 10:18:31

标签: ios matrix opengl-es projection-matrix

我有一个投影矩阵,它来自增强现实应用中的相机校准,只要屏幕宽高比与相机图像宽高比相匹配,一切都很好。当相机图像与屏幕边缘不匹配时,您将在跟踪中出现失真。

问题场景:

  • iPad上的1280x720视频
  • iPhone 5S上的640x480视频。

工作方案:

  • iPad上的640x480视频
  • iPhone 5S上的1280x720视频。

目标:我想以一般方式处理此屏幕/相机宽高比不匹配。

Example of letterbox format

此问题的存在是因为视图在屏幕的宽高比(iPad为4:3)中规范了设备坐标,而投影矩阵具有相机图像的宽高比(对于720p为16:9)。背景图像需要与投影矩阵相匹配或者增强现实的幻觉失败,所以如果我想在“适合”之间切换。和'填充'我需要更改投影矩阵以匹配图像大小。

注意:我希望在没有OpenGL特定解决方案的情况下处理此问题。因此,我正在寻找一个涉及操纵投影矩阵的更一般的数学答案。

2 个答案:

答案 0 :(得分:1)

  

然而,我意识到我需要将相机的投影矩阵映射到   屏幕投影矩阵或者可能缩放它。

宽高比实际上只是确定屏幕上的内容(即你获得的周边视觉量) - 它不应该从根本上改变投影(假设你保持近距离和远距离剪辑相同)。

首先要注意的是,实际上没有安全的映射(即屏幕视图中的每个坐标都不具有相机视图中的等效坐标,反之亦然)。

为了避免失真,您确实有两个选项 - 剪辑到两个选项中较窄的选项(丢弃信息)或缩小信箱并保持原始宽高比(丢弃屏幕区域)。

两者都觉得应该可以将一个简单的比例因子应用于最终的剪辑空间变换(假设你在平截头体的两侧均匀地剪辑,你应该能够增加轴的剪辑空间坐标如果你想要信箱,你想要剪辑(缩放> 1)或多个缩小(缩放< 1)。要使letterboxing工作,你需要使用glViewport或glScissor来停止绘制信箱之外的原语。

答案 1 :(得分:0)

避免处理投影矩阵

简单的方法,虽然不像数学解决方案那样在理智上令人满意,但是将场景放在相机图像大小的视图中。然后将该视图放在包含的视图中。然后调整整个视图的大小以匹配屏幕或填充屏幕大小。