ARToolkit例子中的simpleVRML.c改写(三)

来源:互联网 发布:淘宝高达模型的黑店 编辑:程序博客网 时间:2024/06/05 18:38

        ARToolkit提供了标识在摄像机坐标系统中的位置,可以使用opengl矩阵系统计算出虚拟物体的位置。标识坐标系统有着和opengl坐标系统一样的方位。因此任何应用于与标识关联的物体的转换都应遵循opengl的转换规则。ARToolKit所使用的坐标系统如图1所示。


图1   ARToolKit坐标系统

(1)摄像机坐标系与标识物坐标系的关系。


(2)摄像机坐标系与理性屏幕坐标系的关系。



        其中 为摄像机坐标系与标记物坐标系的变换矩阵;C为摄像机参数,为已知量;M为标记物坐标系,也就是物理坐标系;R为3×3的单位正交矩阵;T为三维平移向量;f是摄像机的焦距;(x,y)是空间任意一点p的物理坐标。

      标识卡和摄像机之间的关系非常重要,它们之间的转换使多个坐标系统的工作成为可能。在这些坐标系统的基础上,同样可以得到任何两个不同的坐标系统之间的转换关系。

     我在simpleVRML.c代码的static void Display(void)函数中添加了如下代码,得到标识卡2在标识卡1坐标系里面的转移矩阵wmat2[3][4],其中(wmat2[0][3],wmat2[1][3],wmat2[2][3])是标示卡2在标示卡1坐标系里面的相对转移矩阵。将其在控制台输出,观察输出的值,输出结果如图2所示,让标识物2与标识物1之间的距离在某个范围内,就触发事件。

程序通过 arUtilMatInv()函数来对矩阵求逆,通过arUtilMatMul()函数来做一个矩阵乘法,即wmat2=gObjectData[1].trans*wmat1。

if( gObjectData[0].visible >= 0&& gObjectData[1].visible >= 0 ) {        double  wmat1[3][4], wmat2[3][4];        arUtilMatInv(gObjectData[0].trans, wmat1);        arUtilMatMul(wmat1, gObjectData[1].trans, wmat2);printf("%8.4f,%8.4f,%8.4f\n",wmat2[0][3],wmat2[1][3],wmat2[2][3]);double dis=wmat2[0][3]*wmat2[0][3]+wmat2[1][3]*wmat2[1][3]+wmat2[2][3]*wmat2[2][3];if(dis<8000){glTranslatef(300.0,100.0,100.0);arVrmlDraw(gObjectData[0].vrml_id);}

图2   转移矩阵wmat2的值
        运行结果如图3、图4所示。图3表示的是标识物2与标识物1之间的距离不在我定义的范围内,不触发任何事件。图4表示的是标识物2与标识物1之间的距离在我定义的范围内,就在沿x轴方向平移300mm,沿y轴方向平移100mm,沿z轴方向平移100mm的位置重新绘制一个茶壶。

                                        

   图3   两个标识物之间的距离不在某个范围内                                                                图4   两个标识物之间的距离在某个范围内,触发事件




原创粉丝点击