用MFC单文档改写ARToolKit5.4的例子simpleLite

RToolkit5.4自带的示例是控制台程序,用MFC单文档改写过程如下: 1、开发环境 Win10,VS2017,ARToolkit5.4 2、新建MFC单

RToolkit5.4自带的示例是控制台程序,用MFC单文档改写过程如下:
1、开发环境
Win10,VS2017,ARToolkit5.4

2、新建MFC单文档程序Test
在类向导中,为CTestView类添加WM_CREATE消息响应函数
在这里插入图片描述
3、在CTestView类的OnCreate函数中,执行以下步骤:
(1)初始化OpenGL

BOOL CTestView::InitializeOpenGL(void)
{PIXELFORMATDESCRIPTOR pfd;int n;m_pDC = new CClientDC(this);ASSERT(m_pDC != NULL);// 设置当前的绘图像素格式 if (!SetupPixelFormat()){return FALSE;}n = ::GetPixelFormat(m_pDC->GetSafeHdc());::DescribePixelFormat(m_pDC->GetSafeHdc(), n, sizeof(pfd), &pfd);// 创建绘图描述表 m_hRC = wglCreateContext(m_pDC->GetSafeHdc());if (m_hRC == NULL){return FALSE;}// 使绘图描述表为当前调用现程的当前绘图描述表 if (wglMakeCurrent(m_pDC->GetSafeHdc(), m_hRC) == FALSE){return FALSE;}glClearDepth(1.0f);glEnable(GL_DEPTH_TEST);return TRUE;
}
BOOL CTestView::SetupPixelFormat(void)
{static PIXELFORMATDESCRIPTOR pfd ={sizeof(PIXELFORMATDESCRIPTOR),  // pfd结构的大小   1,                              // 版本号   PFD_DRAW_TO_WINDOW |            // 支持在窗口中绘图   PFD_SUPPORT_OPENGL |            // 支持 OpenGL   PFD_DOUBLEBUFFER,               // 双缓存模式   PFD_TYPE_RGBA,                  // RGBA 颜色模式   24,                             // 24 位颜色深度   0, 0, 0, 0, 0, 0,               // 忽略颜色位   0,                              // 没有非透明度缓存   0,                              // 忽略移位位   0,                              // 无累计缓存   0, 0, 0, 0,                     // 忽略累计位   32,                             // 32 位深度缓存       0,                              // 无模板缓存   0,                              // 无辅助缓存   PFD_MAIN_PLANE,                 // 主层   0,                              // 保留   0, 0, 0                         // 忽略层,可见性和损毁掩模   };int pixelFormat;// 为设备描述表得到最匹配的像素格式   if ((pixelFormat = ChoosePixelFormat(m_pDC->GetSafeHdc(), &pfd)) == 0){MessageBox(_T("ChoosePixelFormat failed"));return FALSE;}// 设置最匹配的像素格式为当前的像素格式   if (SetPixelFormat(m_pDC->GetSafeHdc(), pixelFormat, &pfd) == FALSE){MessageBox(_T("SetPixelFormat failed"));return FALSE;}return TRUE;
}

(2)初始化摄像头和加载标签
两个关键的函数:setupCamera和setupMarker,直接从simpleLite中拷贝,分别添加如下:

int CTestView::setupCamera(const char *cparam_name, char *vconf, ARParamLT **cparamLT_p, ARHandle **arhandle, AR3DHandle **ar3dhandle)int CTestView::setupMarker(const char *patt_name, int *patt_id, ARHandle *arhandle, ARPattHandle **pattHandle_p)

然后CTestView类的OnCreate函数如下:

int CTestView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{if (CView::OnCreate(lpCreateStruct) == -1)return -1;// TODO:  在此添加您专用的创建代码char    glutGamemode[32] = "";char   *vconf = "-module=WinMF -devNum=2 -format=BGRA";char   *cparam_name = NULL;//int     i;//int     gotTwoPartOption;char    patt_name[] = "D:\\1-Desktop\\SingleDocTest\\SingleDocTest\\hiro.patt";InitializeOpenGL(); if (!setupCamera(cparam_name, vconf, &gCparamLT, &gARHandle, &gAR3DHandle)) {ARLOGe("main(): Unable to set up AR camera.\n");exit(-1);}if ((gArglSettings = arglSetupForCurrentContext(&(gCparamLT->param), arVideoGetPixelFormat())) == NULL) {ARLOGe("main(): arglSetupForCurrentContext() returned error.\n");cleanup();exit(-1);}arglSetupDebugMode(gArglSettings, gARHandle);arUtilTimerReset();// Load marker(s).if (!setupMarker(patt_name, &gPatt_id, gARHandle, &gARPattHandle)) {ARLOGe("main(): Unable to set up AR marker.\n");cleanup();exit(-1);}SetTimer(1, 30, NULL);//glutReshapeFunc(Reshape);return 0;
}

4、拷贝mainloop函数,用于获取视频图像、检测标志物、计算标志物和摄像机之间的变换矩阵
注意要注释掉其中OpenGL画图的代码,包括计算重新画图的时间间隔,以及用于标记窗口重画的glutPostRedisplay函数等。函数如下:
void CTestView::mainLoop(void)

5、在标志物上画出三维模型
从simpleLite中拷贝Display、DrawCube函数,如下所示:

void CTestView::Display(void)void CTestView::DrawCube(void)

并且修改Display代码,在函数第一行、最后一行分别添加代码:

wglMakeCurrent(m_pDC->GetSafeHdc(), m_hRC);SwapBuffers(wglGetCurrentDC());

并注释掉glutSwapBuffers();
在这里插入图片描述
在这里插入图片描述
6、在CTestView类中添加定时器,进行循环调用mainLoop、Display函数

void CTestView::OnTimer(UINT_PTR nIDEvent)
{// TODO: 在此添加消息处理程序代码和/或调用默认值if (nIDEvent == 1)    //定时器1处理函数,{mainLoop();Display();}CView::OnTimer(nIDEvent);
}

在OnCreate最后启动定时器
SetTimer(1, 30, NULL);

7、环境配置
包含目录:
在这里插入图片描述
库目录:
在这里插入图片描述
附加依赖项:
在这里插入图片描述
8、运行结果
在这里插入图片描述
例子下载地址
ARToolkit5.4+VS2017编译包下载地址