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

OpenGL ES Screen Projection Matrix and Camera Projection Matrix

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

问题场景:

工作场景:

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

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

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

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

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

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

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

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

避免处理投影矩阵

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