版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
代码结构解析 1如何只用自己的MQO模型文件 6原创作者:黑白日记我用的是C++2005,当然你也可以使用别的版本,建议2003以上的版本代码:代码结构解析〃头文件部分#ifdef_WIN32#include<windows.h>//WINDOWS的头文件#endif#include<stdio.h>#include<stdlib.h>#ifndef__APPLE__#include<GL/gl.h>#include<GL/glut.h>#else#include<OpenGL/gl.h>#include<GLUT/glut.h>//OpenGL实用库#endif#include<AR/gsub.h>#include<AR/video.h>#include<AR/param.h>#include<AR/ar.h>〃头文件部分没啥可说的,1个WINDOWS的头文件,OPENGL的实用库,AR的4个头文件//摄像头设置#ifdef_WIN32〃这里七。0试保存了摄像头配置文件,XML中记录了设想头的ID等信息,如果你有多个摄像头,那就需要对它多了解一些了〜char*vconf="Data\\WDM_camera_flipV.xml";#elsechar*vconf="";#endifint xsize,ysize; 〃窗口XY尺寸int thresh=100;〃这个参数与摄像头检测标识图部分有关,二值化闸值int count=0; 〃计数器,记录帧数的,后面有专门处理帧的部分char*cparam_name="Data/camera_para.dat";//摄像机参数,记录〃识别精度信息ARParamcparam;char *patt_name ="Data/patt.hiro";//标识图int patt_id;〃标记的大小,下面这3个都是记录标识图几何外形的,在坐标变换时用double patt_width=80.0;〃尺寸double patt_center[2]={0.0,0.0};〃中心double patt_trans[3][4];〃矩阵〃这里是对函数的声明staticvoidinit(void);staticvoidcleanup(void);staticvoidkeyEvent(unsignedcharkey,intx,inty);staticvoidmainLoop(void);staticvoiddraw(void);//主函数:每一个C++程序都应该有一个主函数(模块除外)intmain(intargc,char**argv){glutInit(&argc,argv);//初始化OpenGLinit(); 〃基本参数初始化arVideoCapStart(); 〃摄像头开始工作argMainLoop(NULL,keyEvent,mainLoop);〃主循环return(0); 〃返回0,必写,想知道为什么的话去看C++Primer第四版}/*我看程序喜欢从主程序开始看,根据主程序中的流程来分析整个程序〜不知道大家是不是也是这样〜总之从主函数,我们看出来我们最应该关心的是什么了。主循环,大部分工作都在这里,以后修改的重点也在此*/〃键盘检测staticvoidkeyEvent(unsignedcharkey,intx,inty){//ESC键退出if(key==0x1b){〃这句……其实没啥用,输出的东西一般无人看,测试的时候可能会用到吧printf("***%f(frame/sec)\n",(double)count/arUtilTimer());cleanup(); //退出时清理使用过的内存等资源exit(0);}}//主循环staticvoidmainLoop(void)ARUint8*dataPtr;//图像数据ARMarkerInfo*marker_info;〃标记信息int marker_num;〃寻找到的标记号码int j,k;//下面这部分代码是从摄像头获取图像的if((dataPtr=(ARUint8*)arVideoGetImage())==NULL){arUtilSleep(2);〃这里是如果2毫秒内没有获取图像则程序返回return;}if(count==0)arUtilTimerReset();//定时器复位count++;〃帧数+1〃渲染前更新摄像头参数,主要是为渲染2D或3D对象做准备的argDrawMode2D();argDispImage(dataPtr,0,0);//在摄像头画面中检测标记图案,如果出错,程序退出//参数说明:dataPtr帧数据,thresh二值化闸值,&marker_info标识特征信息//&marker_num标识数量if(arDetectMarker(dataPtr,thresh,&marker_info,&marker_num)<0){cleanup();exit(0);}arVideoCapNext();〃获取下一帧图像//下面这部分是寻找标记图案的k=-1;//k=-1代表没有寻找到标记图案for(j=0;j<marker_num;j++){if(patt_id==marker_info[j].id){if(k==-1)k=j;elseif(marker_info[k].cf<marker_info[j].cf)k=j;}}if(k==-1){argSwapBuffers();//屏幕缓冲return;}//计算出标识图案和摄像头之间的坐标变化,这里是关键之一哦~arGetTransMat(&marker_info[k],patt_center,patt_width,patt_trans);draw(); //渲染模型argSwapBuffers();//屏幕缓冲}//下面是初始化,我们来看看初始化中都要做什么staticvoidinit(void){ARParamwparam;//有很多这种类的存在,有兴趣的可以去看看如何实现,没兴趣的可〃以无视它,只到有什么用,怎么用就好〃设定视频设备,出错退出if(arVideoOpen(vconf)<0)exit(0);〃获取窗口大小,出错退出if(arVideoInqSize(&xsize,&ysize)<0)exit(0);printf("Imagesize(x,y)=(%d,%d)\n",xsize,ysize);//初始化摄像头特征参数,这个参数可以用例子中的程序来得到if(arParamLoad(cparam_name,1,&wparam)<0){//摄像头精度参数//也可以说是范围参数printf("Cameraparameterloaderror!!\nH);exit(0);}arParamChangeSize(&wparam,xsize,ysize,&cparam);//根据精度参数修改设置arInitCparam(&cparam);〃初始化摄像头printf("***CameraParameter***\n");arParamDisp(&cparam);//加载标识图矩阵if((patt_id=arLoadPatt(patt_name))<0){printf("patternloaderror!!\nH);exit(0);}//打开图像窗口argInit(&cparam,1.0,0,0,0,0);}//退出时清理程序使用过的内存等资源,无论写什么程序,一定要记得这步,擦好你的屁股staticvoidcleanup(void){arVideoCapStop();//停止捕捉arVideoClose();//关闭视频设备argCleanup(); //清理以及回收资源,真的别指望WINDOWS会自动帮你释放资源}//绘制渲染部分,基于OpenGL框架,这部分我就不细说了,OpennGL的教程到处都是,//我只写写跟AR有关的,想要多了解下OpenGL的东西就自己去看教程吧。//推荐教程地址:///u/20090817...d-c86abb0721a8.htmlstaticvoiddraw(void){doublegl_para[16];GLfloatmat_ambient[]={0.0,0.0,1.0,1.0};GLfloatmat_flash[]={0.0,0.0,1.0,1.0};GLfloatmat_flash_shiny[]={50.0};GLfloatlight_position[]={100.0,-200.0,200.0,0.0};GLfloatambi[] ={0.1,0.1,0.1,0.1};GLfloatlightZeroColor[]={0.9,0.9,0.9,0.1};//3D绘图模式argDrawMode3D();argDraw3dCamera(0,0);glClearDepth(1.0);glClear(GL_DEPTH_BUFFER_BIT);glEnable(GL_DEPTH_TEST);glDepthFunc(GL_LEQUAL);//加载摄像头变换矩阵argConvGlpara(patt_trans,gl_para);glMatrixMode(GL_MODELVIEW);glLoadMatrixd(gl_para);//灯光部分glEnable(GL_LIGHTING);glEnable(GL_LIGHT0);glLightfv(GL_LIGHT0,GL_POSITION,light_position);glLightfv(GL_LIGHT0,GL_AMBIENT,ambi);glLightfv(GL_LIGHT0,GL_DIFFUSE,lightZeroColor);glMaterialfv(GL_FRONT,GL_SPECULAR,mat_flash);glMaterialfv(GL_FRONT,GL_SHININESS,mat_flash_shiny);glMaterialfv(GL_FRONT,GL_AMBIENT,mat_ambient);glMatrixMode(GL_MODELVIEW);//模型的坐标(x,y,z)//想使用自己的模型,或者修改坐标,那就要操作下面这两个函数了~~glTranslatef(0.0,0.0,25.0);glutSolidCube(50.0);〃绘制一个50的正方体glDisable(GL_LIGHTING);glDisable(GL_DEPTH_TEST);}这就是最简单的ARTOOLKIT基础框架,大家要做的就是看懂它,然后会用它,最后修改它,让它变成你的东西,整个流程很简单,很容易就能看懂的。如果有不明白的或者其它问题可以给我留言或者给我发封电子邮件,我尽量抽出时间帮忙吧~(拒绝连编程是什么都不知道的超级白联系我!)也欢迎高手们指正帖子中的错误~或者有好的建议也请发封邮件给我~E-MAIL:riji@常驻论坛:PS:下一贴可能说说具体原理,也可能说说应用层的东西,具体还没定~如何只用自己的MQO模型文件MQO文件格式简单,编辑软件水杉有汉化版本,而且GL对它有支持库,更加让人振奋的是MQO可以实现动画~好了,来看看在程序上怎么去写。你需要看了我的第一篇文章,因为这篇文章是建立在第一篇文章的框架之上的。假定你已经了解(1)的内容了,现在我们开始吧~首先,我们需要增加两个MQO文件的头文件:#include<GL/GLMetaseq.h>//MQO模型渲染依赖头文件#include<GL/GLLight.h>//MQO模型渲染光照文件然后增加一个全局变量:MQO_MODELmqoObject;//定义MQO模型数据为MQO_MODEL类这句写在doublepatt_trans[3][4];后面就可以了。如果是多个MQO模型,可以用mqoObject1,mqoObject2,mqoObjectn…的形式来定义模型。全局部分只有这些,接下来我们来看初始化部分如何修改找到staticvoidinit(void),在argInit()后面写入:/*MQO文件初始化以及读取*/mqoInit();printf("loadingmode\n");mqoObjectl=mqoCreat
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 筑牢粮食安全防线:新时代粮食安全生产保障体系构建
- 2025 高中信息技术数据与计算之数据可视化的误差线图设计课件
- 2026年生猪标准化养殖全流程技术与管理规范
- 2026年深海钻探与原位监测机器人模块化多体节设计规范
- 2026年数据脱敏匿名化处理技术标准与操作规范
- 2026年差异化乡土账号打造避免同质化竞争
- 2026年专项债消化政府拖欠账款:额度分配与项目申报操作指南
- 2026年行业大模型私有化垂类应用场景开发指南
- 2026年政务数据“微循环”打通:智能体跨系统协同方案
- 2026年文旅产业游客行为与资源数据集融合应用
- 2026广西来宾市从“五方面人员”中选拔乡镇领导班子成员69人笔试备考题库及答案解析
- 2026年安徽卫生健康职业学院单招职业技能测试题库(含答案详解)
- 2.1《依宪治国》 课件(共17张)+内嵌视频 道德与法治 八年级下册 统编版
- 2026年陕西航空职业技术学院单招职业技能测试题库必考题
- GB/T 33130-2016高标准农田建设评价规范
- T∕CMATB 7001-2020 冷冻肉冷藏规范
- 六年级比例教材分析课件
- 宠物店如何给宠物做SPA
- 国别与地区经济(第二版)全套课件
- (5年高职)网络信息编辑实务教学课件汇总完整版电子教案全书课件(最新)
- 2022年管式加热炉题库
评论
0/150
提交评论