我正在使用OpenGL ES(IOS)和OpenCV。我想知道是否有一种方法可以从GLKMatrix4相机的位置获得2D像素坐标?
事实上,我有一个用OpenGL显示的特定3D对象,它只有它的大小和相机姿势,我想将它转换为OpenCV参考坐标,即2D像素。
更准确地说,我有一个IOS应用程序,我流式传输相机的颜色。这个流是用OpenGL显示在我的Ipad上的。在这个显示器上,我有一个特定的覆盖层,它是一个3D对象。同时,我用OpenCV做了一些检测。现在,我想将我的检测结果链接到我的框架中的OpenCV(这是一个矩形绘制)和3D对象,但对于这一个,我只有它的相机位置和大小。
我知道4x4相机姿势的内容,但我没有找到任何关于如何将其转换(如果可能的话)为2D坐标的信息。
简单地说:输入:2D矩形(仅获取2D坐标)和3D对象(仅获取其相机位置)
有办法吗?你能帮帮我吗?
感谢
要获得矢量的屏幕投影,您只需要将其乘以您在openGL中使用的矩阵。第三个坐标被简单地丢弃,并且仅用于深度缓冲区(也用于插值,但在这里这并不重要)。
在openGL中,您将通过将绘制的像素与矩阵相乘而获得的坐标将被标准化为所有轴中[-1,1]
范围内的坐标系。这意味着屏幕/视图左上角的像素将具有坐标(-1,1)
、右上角(1,1)
、中心(0,0)
。。。现在,与缓冲区像素相对应,必须对该值进行反规范化:
您需要有缓冲区width
和height
,因此像素位置为bufferX = ((x+1)/2.0) * width
和bufferY = ((y+1)/2.0) * height
。结果是浮动值,因此您需要将它们四舍五入为整数或进行类型转换。不过,我不知道openGL做了什么。
由于您已经在使用GLKit类型和数学,请尝试使用函数GLKMathProject
将3D模型空间转换为视口(窗口/像素2D)空间,如果您还需要其他方法,请尝试GLKMathUnproject
。您将需要(可能)传递给着色器以绘制场景的(相同)模型视图和投影矩阵。