我在ARTOOLKIT例子中的simpleVRML.c改写(一)中修改代码后显示了自己绘制的模型,并且我还在每个模型的外面都画了一个线状的长方体。
现在我只想在茶壶的外面显示线状的长方体,那么怎么实现呢?我们来看一下代码中的static void Display(void)函数,其中在对标识进行遍历的过程中如果该标识被设置为可见且ID正确,那么就用arVrmlDraw()函数根据前面加载的模型ID绘制模型。我们可以在这一段修改代码。我们再来看一下该例子的标识和模型路径 “Data/object_data_vrml”中的内容,可以看到茶壶对应的vrml_id=0,那么我们就可以利用vrml_id来控制线状长方体。
#the number of patterns to be recognized 2
#pattern 1VRML Wrl/Teapot.dat Data/patt.hiro 80.0 0.0 0.0
#pattern 2VRML Wrl/model.dat Data/patt.kanji 80.0 0.0 0.0
修改的代码如下。
for (i = 0; i < gObjectDataCount; i++) {//对标识进行遍历
if ((gObjectData[i].visible != 0) && (gObjectData[i].vrml_id >= 0))
{ //如果该标识被设置为可见(该设置在Idle()函数中完成)且ID正确那么就执行以下代码
//fprintf(stderr, "About to draw object %i\n", i);
arglCameraViewRH(gObjectData[i].trans, m, VIEW_SCALEFACTOR_4);//创建一个视景矩阵,传递给OpenGL设置虚拟相机的视景变换。转换标识转换矩阵
//成OpenGL视景矩阵,这16个值就是真实相机的位置和方向,使用他们设置虚拟相机的位置,使三维目标准确的放置在物理标识上。
glLoadMatrixd(m);//这里是设置虚拟相机的位置。
//第三步:在标识上画出虚拟物体。
arVrmlDraw(gObjectData[i].vrml_id);//根据前面加载的模型ID绘制模型
if(gObjectData[i].vrml_id==0){//z指定在茶壶周围绘制长方体
glColor3f(0,1,0);
drawCuboid();//绘制线状长方体
}
}
}
运行结果如图1所示。可以与图2作一个对比,图2是ARToolkit例子中的simpleVRML.c改写(一)运行之后在每个模型外面都显示线状的长方体。
图1 只在茶壶外面显示线状的长方体 图2 在每个模型外面都显示线状的长方体