simpleVRML这个例子比较特殊,它使用的框架与之前的例子不同。VRML(Virtual Reality Modeling Language)即虚拟现实建模语言。是一种用于建立真实世界的场景模型或人们虚构的三维世界的场景建模语言,也具有平台无关性。是目前Internet上基于 WWW的三维互动网站制作的主流语言。VRML的场景模型文件的扩展名为.wrl,wrl文件是一种虚拟现实文本格式文件,可以用VrmlPad软件编辑,也可以在3Ds MAX软件中画3D图形,然后导出为.wrl类型的文件。(simpleVRML.c原始代码的理解请查看我博客里的一篇文章“Artoolkit的例子simpleVRML详解”,这里讲的是我修改之后的程序)
该例子的标识和模型路径为“Data/object_data_vrml”,内容如下。第1行表示pattern被识别的个数为2;第3行表示第一个pattern的模型路径为“Wrl/Teapot.dat”,标识路径为“Data/patt.hiro”,标识的宽度为80,标识的中心坐标为(0,0);第5行表示第一个pattern的模型路径为“Wrl/model.dat”,标识路径为“Data/patt.kanji”,标识的宽度为80,标识的中心坐标为(0,0)。(如果想使用自己的模型和标识,就要修改这个文件的内容)
#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
我在文件里添加了以下代码:
static void drawCuboid()
{
glColor3f(0,1,0);
glBegin(GL_LINE_LOOP);
glVertex3f(150.0f,100.0f,0.0f);
glVertex3f(-150.0f,100.0f,0.0f);
glVertex3f(-150.0f,100.0f,250.0f);
glVertex3f(150.0f,100.0f,250.0f);
glVertex3f(150.0f,-100.0f,250.0f);
glVertex3f(-150.0f,-100.0f,250.0f);
glVertex3f(-150.0f,-100.0f,0.0f);
glVertex3f(150.0f,-100.0f,0.0f);
glEnd();
glBegin(GL_LINES);
glVertex3f(150.0f,-100.0f,0.0f);
glVertex3f(150.0f,-100.0f,250.0f);
glVertex3f(-150.0f,-100.0f,0.0f);
glVertex3f(-150.0f,100.0f,0.0f);
glVertex3f(-150.0f,-100.0f,250.0f);
glVertex3f(-150.0f,100.0f,250.0f);
glVertex3f(150.0f,100.0f,0.0f);
glVertex3f(150.0f,100.0f,250.0f);
glEnd();
}
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);
glLoadMatrixd(m);
arVrmlDraw(gObjectData[i].vrml_id);//根据前面加载的模型ID绘制模型
drawCuboid();//添加的代码,绘制线性长方体
}
}
我修改代码之后,运行的结果如图1所示。我们可以看到在patt.hiro标识上显示的是一个茶壶,在patt.kanji标识上显示的是一个球和圆柱的组合体,而且我还给每个模型都添加了一个线状的长方体。
图1 修改simpleVRML.c后的运行结果