虽然VRML语言已经被HTML5取代,但是仍有许多早期的三维模型文件采用wrl文件存储,并且偶尔会在转存成其它文件的过程中遇到问题,于是我们常常需要直接解析wrl文件。这里给需要解析wrl文件的同学指一条明路:Openvrml

        Openvrml本身调用了许多库,可以借助ARToolKit或者OGN进行安装,据说OGN比较容易一些,博主并没有使用过上述工具。而编译openvrml的过程极其痛苦,于是博主自己写了一个解析CASIA-3D-Face数据库中wrl文件的程序,仅供参考。这里附上中科院三维人脸数据库的链接,感谢中科院免费提供的资源。

        这里特别提醒:真正完全解析wrl文件,还是需要使用一个树来存储各个节点的信息,然后遍历树来去除所需节点的信息,实现文件的完全解析。而这篇博文中所使用的代码并没有采用这种思路,博主处理的仅仅是特定的一种结构,节点类型都已经是确定的,仅仅将数据读出来,所以,仅作参考。

        废话不多讲,看了上节对VRML文件的介绍,直接来看解析wrl文件的代码:

        博主没有给上面的代码添加注释,之作简单解释。代码前半部分在读取wrl文件并解析,提取出文件中各节点中的信息,如点云,颜色,视角等。代码后半部分是icp类,该类使用Opengl对模型进行绘制,这一节博客主要讲解wrl类解析wrl文件,关于使用opengl对模型进行绘制的代码将在下一节的博客中进行讲解。

        代码中使用到了google的glog库,protobuf库,和用于绘制图形的glew opengl库。glog是谷歌的开源日志系统,使用glog有诸多好处,详情请google<glog>。此外,程序还是用了google的protobuf,protobuf是谷歌的开源项目,作用类似于xml和json,但由于protobuf简洁的格式和卓越的性能,已经被越来越多的程序员接受,作为程序协议 配置文件等的必备良品。在预处理的宏定义中添加如下宏,可以在静态库中使用google的库和opengl的库,就不需要在程序运行时添加相关的dll(动态链接库)了。

        当然,你也可以选择不使用静态库,这样会使程序本体较小,但是请务必添加上述宏中最后一条,这条宏指明了程序使用glog,否则在编译时会报错。

好了,我们来直接看wrl类的代码吧:

        public下定义了外部访问的接口,在类构造时打开文件,使用read来读取指定节点的数据,节点名是第一个参数,读出的数据会被存入第二个参数(容器)中。由于在处理CASIA数据库中的wrl文件时,需要读取两类节点,于是对read函数重载,第二个read读取的信息是多边形,每个多边形被存储在一个vector中,多边形的定点被存储在第二级(嵌套在里面的)vector容器中。

下面来看wrl类的实现:

        这个类的实现就不多介绍了,通过字符串的处理,搜索节点名,然后对结点名后的数字进行解析,直到节点结束,数据都被保存在容器中了。

        点云数据读取进来之后,就可以被OpenGL绘制出来,关于OpenGL绘制的部分将在下一节进行讲解。

        See You Next Chaper!

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注