在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:最后得出的运行结果是: