Open Inventor 库简介
在三维显示编程中,OpenGL是行业标准。任何跨平台的三维显示软件都要使用OpenGL技术。但OpenGL技术不是面向对象的,其难于采用OOP思想来进行编程。这造成OpenGL程序编写效率很低。所以,Open Inventor 库应运而生。
Open Inventor 库是采用OOP技术对OpenGL的完美封装,如果你采用能支持OOP设计模式的语言(如C++,Java),强烈建议放下OpenGL参考手册,投入 Open Inventor 库的怀抱吧。
Open Inventor 是OpenGL技术的母公司SGI公司开发的一个开源软件库。因为是开源的,所以许多公司都在为这个库增加/修改代码,从而使得Open Inventor 库成长速度很快。其中不得不提及 TGS 公司,该公司专注于开发 Open Inventor库,所以我们最常用的TGS版本的Open Inventor库。
Open Inventor 中最基本的概念是类(Class)。从功能上可以将这些类分为两大块。
- 存储类:目的在于存储三维信息的类,比如 节点(Node),群组(Group)与路径(Path)等;
- 动作类:目的在于实现某种动作行为,比如造型变换类、相机变换类、颜色变换类、场景遍历类等
掌握 Open Inventor ,应该从基本三类入手,即:节点(Node),群组(Group)与路径(Path)。
节点就是三维场景中的空间点,其最需要注意的是,节点(Node)类的属性(Property),在Open Inventor库中被拓展为域(Field)的概念。在OOP中,类的某个变量就是它的属性,而在Open Inventor库中,Node节点上的属性还可以进行“联合赋值”等灵动控制,所以其已经超出了一般OOP编程的类属性概念。对于“域”的了解与掌握,是熟悉节点(Node)类的关键。
群组(Group)就是节点(Node)的组合,而路径(Path)则是将不同的节点或群组以某种形式进行串联,从而利于实现某个动作类的传递。
在Open Inventor 库中,节点(Node)、群组(Group)与路径(Path)是基本概念,其构建了最基本的三维空间信息存储模型;Open Inventor 在基础模型上,提供了基于B样条的NURBS曲面概念。NURBS曲面是Open Inventor库的高级概念,其主要由控制顶点、节点序列与阶来进行控制。一般的商业三维软件,都支持NURBS曲面,其提供了“橡皮泥”式的三维曲面操控能力,但对于基本编程而言,NURBS曲面实在是很难也无意义的东东,如果你仅仅是Open Inventor库的初学者,所编写的软件也就是个课程作业或者学位科研项目实验的话,“远离NURBS,珍惜时间”是我给你的建议。
除了用于存储三维空间信息的类,Open Inventor 还提供了许多的动作类。将这些动作类附加在上述的存储类上,就可以实现许多三维显示效果,如渲染、移动视角、变换纹理等。因为Open Inventor库是面向对象的,所以其具有良好的事件响应功能。你可以通过事件响应的方式来进行编程,如当移动某个节点时进行某个动作,这样就能极大地提高三维编程的效率,这可是OpenGL最不具备的功能,也是Open Inventor库最吸引我的地方。
为了方便事件编程,Open Inventor库还创造性地提出两个新概念,即
- 传感器:用于侦听场景中的数据变化,采用统一的事件回调函数;
- 引擎:将某些动作进行自动化,实现连贯的动作操作;
“传感器”与“引擎”是很伟大的概念,其极大地方便了三维动画编程。看看Open Inventor库所提供的引擎名称,如 耗时器、单触发器、计时器、闸引擎、算术类引擎,就让人“垂涎三尺”了。噢,三维动画编程将成为“dream(美梦)”而非“nightmare(梦魇)”了。
参考资料
- Mercury Computer Systems, Open Inventror from TGS User Guide
- 闫锋欣等,Open Inventor 程序设计从入门到精通,北京:清华大学出版社,2007