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

标签 ios matrix opengl-es projection-matrix

我有一个从增强现实应用程序中的相机校准导出的投影矩阵,只要屏幕纵横比与相机图像纵横比匹配,一切都很好。当相机图像与屏幕边对边不匹配时,您会在跟踪中出现失真。

问题场景:

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

工作场景:

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

目标:我想以一般方式处理屏幕/相机纵横比不匹配的问题。

Example of letterbox format

此问题的存在是因为 View 在屏幕纵横比(iPad 为 4:3)中具有归一化设备坐标,而投影矩阵具有相机图像的纵横比(720p 为 16:9)。背景图像需要与投影矩阵匹配,否则增强现实的错觉会失败,因此如果我想在“适合”和“填充”之间切换,我需要更改投影矩阵以匹配图像大小。

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

最佳答案

However, I realize I need to map the camera's projection matrix to the screen projection matrix or perhaps scale it.

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

首先要注意的是,并没有真正安全的映射(即并非屏幕 View 中的每个坐标在相机 View 中都有对应的坐标,反之亦然)。

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

两者都感觉应该可以通过将简单的比例因子应用于最终的裁剪空间变换(假设您在平截头体的两侧进行均等裁剪,您应该能够乘以轴的裁剪空间坐标你想要裁剪(比例 > 1),或者如果你想要信箱则多次向下(比例 < 1))。要使信箱正常工作,您需要使用 glViewport 或 glScissor 来停止绘制信箱之外的图元。

关于ios - OpenGL ES屏幕投影矩阵和相机投影矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28451752/

相关文章:

ios - 单击选项卡时,选项卡栏 Controller 不显示 XIB UIViewController

c++ - 如何改变矩阵中字段的各个方面?

c - "segmentation fault"将值分配给动态分配矩阵中的特定位置时

matlab - 从给定向量创建下三角矩阵

ios - 为 GPUImage 创建耗时的制服

android - 如何使用 OpenGL ES 2 从相机获取灰度预览

objective-c - objective-c : Reading text files

ios - 将 json 数据存储在 TableView 中的交替单元格中

iphone - 覆盖自定义 UITableViewCell

Android 在相机框架上应用效果