我的订单|我的收藏|我的商城|帮助中心|返回首页
虚拟现实新闻>VR>行业资讯>培训教程

ARToolKit教程:摄像头和标识关系

文章来源:第三维度 作者: 发布时间:2013年07月18日 点击数: 字号:

    来源:第三维度 

    介绍

    ARToolKit 提供了标识在摄像机的坐标系统中的位置,使用 opengl 矩阵系统计算出虚拟物体的位置。在本节教程中,我们会更详细地讲解这些不同的元素及其之间的关系。

    坐标系统

    我们先来介绍 simpleTest 程序。打开它,把下面这句代码加在 arGetTransMat 后:

        printf("%f %f %f\n",patt_trans[0][3],patt_trans[1][3],patt_trans[2][3]);

    重新编译,运行程序。注意输出值。如果把标识往左移动,第一个值就会增加,往上移动,第二个值就减小,往前移动最后一个值也会增加。下面是 ARToolKit 所使用的坐标系统(CS)。

ARToolKit教程:摄像头和标识关系
图 1 ARToolKit 坐标系统(摄像机和标识)

    输出的值与这些坐标系统相对应。标识坐标系统有着和 opengl 坐标系统一样的方位。

    因此任何应用于与标识关联的物体的转换都应遵循 opengl 的转换规则。比如说,如果不想把方块显示在标识坐标系统的中心,而是让它显示在顶部,可以把下面的代码:

            glTranslatef(0.0,0.0,25.0);

    代替为:

            glTranslatef(0.0,20.0,25.0);

    那么就会得到:

ARToolKit教程:摄像头和标识关系
图 2 虚拟物体移动后的 simpleTest

    更直观的是假设标识静止而真正的摄像头在移动。这就是说,我们想要得到摄像头在标识坐标系中的位置。在 bin 目录下运行 exview。这个程序的显示如图 3 所示,同时输出了摄像头在标识坐标系中的位置。另外一个视图显示的是摄像头和标识的三维模型。

ARToolKit教程:摄像头和标识关系
图 3 exview 视频截图

    在上面的图像中,可以看到标识卡的坐标(蓝色 Z 轴,绿色 Y轴,红色 X 轴)。下面的图像展示了摄像头在标识坐标系中的位置你可以把鼠标移动到三维外部视图中,试着操作感受它们之间的关系(图 4 是另外的例子)。

ARToolKit教程:摄像头和标识关系
图 4 摄像头的不同位置

    打开 examples/exview 下的 exview.c 文件。看程序 getResultRaw:

        if( arGetTransMat(marker_info, target_center,target_width, target_trans) < 0 ) return;

        if( arUtilMatInv(target_trans, cam_trans) < 0 ) return;

          sprintf(string," RAW: Cam Pos x: %3.1f y: %3.1f z: %3.1f",cam_trans[0][3], cam_trans[1][3], cam_trans[2][3]);

    可以看到,同样调用了 arGetTransMat,又调用了 arUtilMatInv,得到转换后的位置。

    标识卡和摄像机之间的关系非常重要,它们之间的转换使多个坐标系统的工作成为可能。

    在这些坐标系统的基础上,同样可以得到任何两个不同的坐标系统之间的转换关系。打开examples/relation 目录下的 relationtest.c 文件。可以得到和 simplem 一样的多个物体。主要的区别是增加了以下代码:

        if( object[0].visible >= 0 && object[1].visible >= 0 ) {

            double wmat1[3][4], wmat2[3][4];

            arUtilMatInv(object[0].trans, wmat1);

            arUtilMatMul(wmat1, object[1].trans, wmat2);

            for( j = 0; j < 3; j++ ) {

                for( i = 0; i < 4; i++ ) printf("%8.4f ", wmat2[j][i]);

                  printf("\n");

            }

    printf("\n\n");

    这段代码计算了两个标识之间的相对转移矩阵。object[0].trans 是标识卡 1 在摄像机坐标系里面的转移矩阵,object[1].trans 是标识卡 2 在摄像机坐标系里面的转移矩阵.因此object[0].trans 的转置乘以 object[1].trans 就得到了标识卡 2 在标识卡 1 坐标系里面的转移矩阵。运行程序,把标识卡放在如图所示位置上:

ARToolKit教程:摄像头和标识关系
图 5 relationtest(渲染视图和控制台输出)

     输出的最后一列是标识卡 2 在标识卡 1 坐标系里面的相对转移矩阵。锥体在球体的左侧(X 轴方向上 142mm 处),在标识卡 1 上(Y 轴方向上 27mm),它们几乎在同一平面上(Z 轴方向上 7mm).移动标识卡 1 和标识卡 2,观察输出值,理解它们之间的关系。

    尝试通过修改 relationTest 的代码做相反的操作(标识卡 1 在标识卡 2 坐标系里面的相对转移矩阵)。

  • 暂无资料
  • 暂无资料
  • 暂无资料
  • 暂无资料
  • 暂无资料