前面两篇求出了模板图像在相机坐标系的位姿变换矩阵,那么现在就有了透视矩阵(相机内参数,失真参数),和外参数(视景矩阵:位姿矩阵(旋转矩阵和平移矩阵)),这就基本把虚拟三维物体如何投射在显示屏幕上的变换矩阵基本确定了。
四要素:
1、 相机拍摄的最新的图像
2、 相机标定的矩阵
3、 3D的模式姿态(如果需要显示)
4、 与OpenGL相关的内部数据(纹理ID,等等)
下面分析下OpenGL是如何渲染一个三维目标。
1:OpenGL初始化。
ARDrawingContext drawingCtx("Markerless AR", frameSize, calibration);//这个应该是OpenGL初始化的阶段。
在ARDrawingContext.cpp中是这个函数的具体实现:
//在OpenGL的初始化中,调用namedWindow使用最后一个参数调用cv::WINDOW_OPENGL,把OpenGL接口到highgui的模块中,设置窗口大小。
//然后调用setOpenGLContext建立窗口关联(参数就是窗口名称),为了在这个窗口上画虚拟物体,需要使用回调函数,建立方法就是setOpenGLDrawCallback,
//注意这个函数第一个参数是窗口名称,第二个参数是回调函数名,第三个参数是回调函数的参数,因为我这里回调函数onDraw是无参函数,所以这里为NULL
//在需要重绘的时候还要调用updateWindow
ARDrawingContext::ARDrawingContext(std::string windowName, cv::Size frameSize, const CameraCalibration& c)
: m_isTextureInitialized(false)
, m_calibration(c)
, m_windowName(windowName)
{
// Create window with OpenGL support
cv::namedWindow(windowName, cv::WINDOW_OPENGL);//OpenGL接口到highgui的模块中
// Resize it exactly to video size
cv::resizeWindow(windowName, frameSize.width, frameSize.height);//设置窗口大小,
// Initialize OpenGL draw callback:
cv