ARToolKit 中摄像头与虚拟物体之间存在一个对应的矩阵变换,正是由这个矩阵变换,所以才在摄像头与标识卡上的虚拟物体之间建立了联系,如下图,摄像头和标识卡之间有着x,y,z的坐标轴的对应变换。
其中能够对应的原因ARToolKit 提供了标识在摄像机的坐标系统中的位置,使用 opengl 矩阵系统计算出虚 拟物体的位置。
坐标系统存在于每一个ARToolkit程序之中,我们以之前文章中提到的 simpleTest 程序为例。打开它,把下面这句代码加在 arGetTransMat 后: printf("%f %f %f\n",patt_trans[0][3],patt_trans[1][3],patt_trans[2][3]);
重新编译,就会出现一个这样的图
其中运行程序。注意输出值。如果把标识往左移动,第一个值就会增加,往上 移动,第二个值就减小,往前移动最后一个值也会增加输出的值与这些坐标系统相对应。标识坐标系统有着和 opengl 坐标系统一样的方位。 因此任何应用于与标识关联的物体的转换都应遵循 opengl 的转换规则,上述显示的值都是根据摄像头的坐标系来确定的,正负是以原点为界限,这个坐标系与数学中的坐标系理解类似。
下面就将介绍如何改变模型出现在标识卡上的位置。
还是以simpletest为例:
比如说,如果不想 把方块显示在标识坐标系统的中心,而是让它显示在顶部,可以把下面的代码:
glTranslatef(0.0,0.0,25.0);
代替为:
glTranslatef(0.0,20.0,25.0);
其中第一幅图为glTranslatef(0.0,0.0,25.0); 时候的图像
第二幅图为 glTranslatef(0.0,20.0,25.0); 时候的图像
glTranslatef(float x,float y, float z);分别对应着标识卡上的坐标系,只需要改变x,y,z的值就能改变虚拟物体出现在标识卡上的位置。
下面举几个例子,例如代码为:glTranslatef( 50.0, 0.0, 25.0 )的时候,是这样的
再把代码改为:glTranslatef( 100.0, 0.0, 25.0 )的时候,出现的图则是这样的
只需要改变x,y,z的值就能改变虚拟物体出现在标识卡上的位置
其中为glTranslatef( 0.0, 0.0, 0.0 )时,是这样的效果