【AR应用开发之五】artoolkit

概述

  • 在win10+VS2019环境下,搭建AR开发环境。

Artoolkit是一个计算机视觉跟踪库,允许创建增强现实应用程序,将虚拟图像覆盖在现实世界中。为此,它使用视频跟踪功能来实时计算相对于正方形物理标记的真实摄像机位置和方向。一旦知道了真实的摄像机位置,虚拟摄像机就可以定位在同一点上,并且3D计算机图形模型完全覆盖在真实的标记上。因此,Artoolkit解决了增强现实中的两个关键问题:视点跟踪和虚拟对象交互。
ArtoolKit最初由Hirokazu Kato于1999年开发,由华盛顿大学HIT实验室发布。目前它作为一个开源项目维护,托管在SourceForge上,商业许可证可从ArtoolWorks获得。

工具

  1. artoolkit
  2. DSVL
  3. OpenVRML
  4. glut
    如图所示

配置

  1. 将OpenVRML\bin\js32.dll 复制进 ARToolkit5/bin/路径

  2. 将dsvl-0.0.8c\bin\DSVLd.dll 复制进 ARToolkit5/bin/路径

  3. 将dsvl-0.0.8c\bin\DSVL.dll 复制进 ARToolkit5/bin/路径

  4. 将glut32.dll、glut.dll 放进 C:\Windows\System32 和C:\Windows\SysWOW64

  5. 将 glut32.lib、glut.lib 复制到此路径VC\Tools\MSVC\14.20.27508\lib\x86

  6. 把 glut.h 复制到VC\Tools\MSVC\14.11.25503\include\GL目录下,没有GL文件夹就自己新建
    在这里插入图片描述
    在这里插入图片描述

生成

通过按F7生成解决方案:
生成
遇到提示LNK2026,通过如下方法解决:
在这里插入图片描述

调试

直接运行该目录下应用程序:
在这里插入图片描述
得到结果如下:
在这里插入图片描述
如果出现msvcr71d.dll库出错,可以在这个CSDN地址下载:artoolkit之msvcr71d.dll
茶壶的源码如下:

#include <gl/glut.h>
 
GLfloat rx=0, ry=0 ,angle=0;
GLint winWidth=600, winHeight=600;
GLint mouseDx,mouseDy;
 
//显示函数
void Display(){
    GL_COLOR_BUFFER_BIT(用背景颜色填充)
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 
    //glPushMatrix();
    glRotatef(1, rx, ry, 0); 
    glColor3f(0.0,0.0,1.0);
    //glutWireTeapot(160);
    glutSolidTeapot(120);
    //glPopMatrix(); 
    //交换缓冲区
    glutSwapBuffers();
    //glFlush();// 刷新绘图命令
}
 
 
// 设置渲染状态(听起来像动画设计,实际上很简单)
void SetupRC(void)
{
    //清除颜色(这里为黑色,为了方便找画的那个点),可以理解成背景颜色
    //和glColor4f(1.0f, 0.0f, 0.0f,1.0f)一样,所有参数都在0.0到1.0之间,后缀f是表示参数是浮点型的
    //最后的那个1.0f是透明度,0.0f表示全透明,1.0f是完全不透明
    glClearColor(1.0f, 1.0f, 1.0f,1.0f);
}
 
// 当绘制的窗口大小改变时重新绘制,使绘制的图形同比例变化,
//几乎所有OpenGL程序中的这个函数都是一样的,所以,放心大胆的拷贝吧
void ChangeSize(int w, int h)
{
    winWidth = w;
    winHeight = h;
    // 设置观察视野为窗口大小(用FLASH里面的话来说应该叫设置摄象机视野)
    glViewport(0,0,w,h);
    // 重置坐标系统,指定设置投影参数
    glMatrixMode(GL_PROJECTION);
    ///调用单位矩阵,去掉以前的投影参数设置
    glLoadIdentity();
        //设置投影参数
    glOrtho(-w/2,w/2,-h/2,h/2,-w,w);
     
    glMatrixMode( GL_MODELVIEW );
    glLoadIdentity();
}
 
 
void init() //初始化背景颜色,光照,材质等 
{
    glClearColor(0.9,0.9,0.8,1.0); //初始背景色 
    /********* 光照处理 **********/ 
    GLfloat light_ambient[] = { 0.0, 0.0, 0.0, 1.0 };
    GLfloat light_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
    GLfloat light_specular[] = { 1.0, 1.0, 1.0, 1.0 };
    GLfloat light_position0[] = { 100.0, 100.0, 100.0 ,0 }; 
    //定义光位置得齐次坐标(x,y,z,w),如果w=1.0,为定位光源(也叫点光源),
    //如果w=0,为定向光源(无限光源),定向光源为无穷远点,因而产生光为 
    //平行光。 
    glLightfv(GL_LIGHT0, GL_AMBIENT , light_ambient ); //环境光 
    glLightfv(GL_LIGHT0, GL_DIFFUSE , light_diffuse ); //漫射光 
    glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular); //镜面反射 
    glLightfv(GL_LIGHT0, GL_POSITION, light_position0); //光照位置 
    /******** 材质处理 ***********/ 
    GLfloat mat_ambient[] = { 0.0, 0.2, 1.0, 1.0 };
    GLfloat mat_diffuse[] = { 0.8, 0.5, 0.2, 1.0 }; 
    GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };
    GLfloat mat_shininess[] = { 100.0 }; //材质RGBA镜面指数,数值在0~128范围内 
     
    glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
    glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
    glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess); 
    glEnable(GL_LIGHTING); //启动光照 
    glEnable(GL_LIGHT0); //使第一盏灯有效 
    glEnable(GL_DEPTH_TEST); //测试深度缓存 
    /******** 其他可选项 ***********/ 
    // glDepthFunc(GL_LESS); //函数指定比较函数,用来比较每个引入象素的z值和深度缓存中给定的z值,只有当
    //激活深度检验时才执行此比较。 
    // glEnable(GL_CULL_FACE); //剔除多边形表面:在三维空间中,一个多边形虽然有两个面,但我们无法看见背
    //面的那些多边形,而一些多边形虽然是正面的,但被其他多边形所遮挡。如果将
    //无法看见的多边形和可见的多边形同等对待,无疑会降低我们处理图形的效率。
    //在这种时候,可以将不必要的面剔除。
    // glCullFace(GL_FRONT); //glCullFace的参数可以是GL_FRONT,GL_BACK或者GL_FRONT_AND_BACK,分别表示
    //剔除正面、剔除反面、剔除正反两面的多边形。
    // glEnable(GL_COLOR_MATERIAL); //材质颜色追踪当前颜色
} 
 
 
/鼠标点击
void MousePlot(GLint button,GLint action,GLint xMouse,GLint yMouse)
{
    if(button==GLUT_LEFT_BUTTON && action==GLUT_DOWN)
    {
        mouseDx = xMouse;
        mouseDy = yMouse;
    }
    if(button==GLUT_LEFT_BUTTON && action==GLUT_UP)
    {
        glutPostRedisplay();
    }
}
 
鼠标移动
void MouseMove(GLint xMouse,GLint yMouse)
{
    //angle+=2;
    if(xMouse>mouseDx && yMouse==mouseDy)
    {
        rx=0;
        ry=1;}
    else if(xMouse<mouseDx && yMouse==mouseDy)
    {
        rx=0;
        ry=-1;
    }
    else if(xMouse==mouseDx && yMouse<mouseDy)
    {
        rx=-1;
        ry=0;
    }
    else if(xMouse==mouseDx && yMouse>mouseDy)
    {
        rx=1;
        ry=0;
    }
    else if(xMouse>mouseDx && yMouse<mouseDy)
    {
        rx=-1;
        ry=1;
    } 
    else if(xMouse>mouseDx && yMouse>mouseDy)
    {
        rx=1;
        ry=1;
    }
    else if(xMouse<mouseDx && yMouse<mouseDy)
    {
        rx=-1;
        ry=-1;
    }
    else if(xMouse<mouseDx && yMouse>mouseDy)
    {
        rx=1;
        ry=-1;
    }
           
    mouseDx = xMouse;
    mouseDy = yMouse;
    glutPostRedisplay();
}
 
// 主函数
int main(int argc, char* argv[])
{
    glutInit(&argc, argv);
    //设置显示模式
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
    //设置窗口大小像素
    glutInitWindowSize(600, 600);
    设置窗口出现在屏幕的位置
    glutInitWindowPosition(300,160);
    //建立一个叫OpenGL的窗口
    glutCreateWindow("鼠标旋转的茶壶");
     
    //调用函数Display进行绘制
    glutDisplayFunc(Display);
    //调用鼠标移动函数
    //glutPassiveMotionFunc(PassiveMouseMove);
    glutMotionFunc(MouseMove);
    //调用鼠标点击函数
    glutMouseFunc(MousePlot);
     
    //如果窗口大小改变则调用函数ChangeSize重新进行绘制
    glutReshapeFunc(ChangeSize);
     
    init();
     
    //清屏
    //SetupRC();
    //循环绘制
    glutMainLoop();
     
    return 0;
}

最后,如果OpenVRML出问题,通过重新编译覆盖原来文件解决。

参考博文:

https://blog.csdn.net/qingyang8513/article/details/45577721

https://blog.csdn.net/ly945707194/article/details/34932271

https://blog.csdn.net/drunkpragrammer/article/details/78740055
VS2005(2008)下的ARToolkit编译完全版:
https://wenku.baidu.com/view/e89571c1bb4cf7ec4afed0a9.html
OpenVRML:
https://wenku.baidu.com/view/e89571c1bb4cf7ec4afed0a9.html
ARToolKit中文安装教程附VRML:
https://www.docin.com/p-678940860.html

如果出现libpng或者libjpeg
安装上述教程下载安装库(.ext).
遇到下面的问题:
1>glaux.lib(tk.obj) : error LNK2019: 无法解析的外部符号 _sscanf,该符号在函数 _GetRegistrySysColors@8 中被引用
1>glaux.lib(tk.obj) : error LNK2019: 无法解析的外部符号 _vsprintf,该符号在函数 _PrintMessage 中被引用

VS2015编译会出现这个问题,解决办法在项目属性->链接器->输入->附加依赖项中添加依赖项 legacy_stdio_definitions.lib;
遇到libc库的问题:
libc.lib,libcmt.lib,msvcrt.lib,libcd.lib,libcmtd.lib,msvcrtd.lib
#pragma comment(linker, “/NODEFAULTLIB:libc.lib”)
(开发经验,非常重要!!!)

  1. 注意变量的初始化,尤其是指针变量,数组变量的初始化(很大的情况下另作考 虑了)。
  2. 自定义消息及其他声明的标准写法
  3. 使用调试宏时使用后最好注释掉
  4. 尽量使用 try - catch(…)
  5. 尽量使用模块,不但表达清楚而且方便调试

解决方法:(应用到所有属性)
1.打开该项目的“属性页”对话框。
2.单击“链接器”文件夹。
3.单击“命令行”属性页。
4.将 /SAFESEH:NO 键入“附加选项”框中,然后点击应用

  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在Three.js AR开发中,第三方识别是指利用第三方库或平台来实现增强现实应用的图像识别功能。在增强现实应用中,图像识别是非常重要的一环,它能够识别现实世界中的特定图像,并将虚拟对象或信息与之相结合显示在用户的设备上。 第三方识别可以借助一些专门的图像识别库和平台,如ARToolKit、Vuforia等。这些库和平台提供了丰富的图像识别技术和算法,使得开发者可以更加便捷地实现图像识别功能。通过在Three.js AR开发中集成这些第三方库或平台,可以大大提高应用的图像识别准确度和稳定性。 具体来说,开发者需要将三维场景和图像识别功能进行融合。首先,通过Three.js创建一个虚拟场景,包括模型、纹理、光照等元素。然后,使用第三方图像识别库或平台提供的API,将现实世界中的图像转化为计算机能够理解的数据。接下来,将这些数据与虚拟场景进行匹配,并将虚拟对象或信息叠加显示在用户的设备上,实现增强现实效果。 借助第三方识别,开发者可以更加便捷地实现Three.js AR应用中的图像识别功能。这不仅提高了开发效率,还能为用户提供更好的交互体验。然而,选择合适的第三方库或平台是关键,开发者需要根据项目需求、识别准确度和稳定性等因素综合考虑,并进行测试和调试,确保图像识别功能的正常运行。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值