多标识AR程序分析(一)

本文基于ARToolKit的relation例程,分析了实现多标识AR的技术细节。程序定义了自定义结构体来存储参数,并在mainloop中计算标识相对于相机的转换矩阵。通过可视化,动态展示两个标识之间的相对转换矩阵,随着标识移动而变化。在绘制函数中,根据标识ID绘制不同目标,最终实现多标识的AR效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在ARToolKit例程中有一个是relation,这个就是标准的多标识AR;
以下是简单的程序分析:
这个程序是在simple.c的基础上进行的,所以这里只是分析不同的部分,对simple不理解的清参考前几篇文章;
1:在这个程序中自定义了一个结构体:

typedef struct {
  char    *patt_name;
  int     patt_id;
  int     model_id;
  int     visible;
  double  width;
  double  center[2];
  double  trans[3][4];
} OBJECT_T;

这个机构体几乎涵盖了做基于标识的AR的一些常规参数;
然后定义了两个变量,初始化了目标的一些值;

OBJECT_T   object[2] = {
             {OBJ1_PATT_NAME, -1, OBJ1_MODEL_ID, 0, OBJ1_SIZE, {0.0,0.0}},
             {OBJ2_PATT_NAME, -1, OBJ2_MODEL_ID, 0, OBJ2_SIZE, {0.0,0.0}}
           };

2:在mainloop函数中增加了以下代码,可以求出多个标识相对于相机的转换矩阵:

 /* check for object visibility *///先检查第一个标识的匹配,计算旋转矩阵,然后计算第二个标识的转换矩阵;若识别了标识,则定义这个标识为可视的。
    for( i = 0; i < 2; i++ ) {
        k = -1;
        for( j = 0; j < marker_num; j++ ) {
            if( object[i].patt_id == marker_info[j].id ) {
                if( k == -1 ) k = j;
                else if( marker_info[k].cf < marker_info[j].cf ) k = j;
            }
        }
        object[i].visible = k;

        if( k >= 0 ) {
            arGetTransMat(&marker_info[k],
                          object[i].center, object[i].width,
                          object[i].trans);
            draw( object[i].model_id, object[i].trans );
        }
    }

3:在这个程序中扩展增加了解释通过可视化的两个标识相对于相机的转换矩阵,如何求出这两个标识之间的转换矩阵,在程序演示中可以看出,在后台打印出这个转换矩阵,随着两个标识的移动,计算出的转换矩阵是变化的。

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");
    }

4:在绘制函数中,针对不同的标识ID绘制不同的目标:

switch( object ) {
      case 0:
        glTranslatef( 0.0, 0.0, 25.0 );
        glutSolidCube(50.0);
        break;
      case 1:
        glTranslatef( 0.0, 0.0, 40.0 );
        glutSolidSphere(40.0, 24, 24);
        break;
      case 2:
        glutSolidCone(25.0, 100.0, 20, 24);
        break;
      default:
        glTranslatef( 0.0, 0.0, 10.0 );
        glutSolidTorus(10.0, 40.0, 24, 24);
        break;
    }

5:最后得出的运行结果是:
这里写图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值