利用ACIS、HOOPS开发三维软件
一、 ACIS相关知识
ACIS是基于英国剑桥大学博士论文提出的边界表示法生成三维实体的理论体系而开发的三维几何造型引擎,它采用面向对象的数据结构,集线框、曲面和实体造型于一体,并允许这三种表示共存于统一的数据结构中,为各种三维造型应用系统的开发提供了几何造型平台。许多著名的CAD/CAM系统都是以ACIS作为几何内核,如Auto CAD、Turbo CAD、CADKEY等。
几何、拓扑和属性是ACIS模型的三个基本类,三者统一由最基础的抽象类ENTITY派生。虽然ENTITY本身不代表任何对象,但在ENTITY中定义了它的所有子类应具有的数据和方法,如存储、恢复、回溯等。ACIS模型数据的ENTITY及派生类层次关系如图1所示。
图1 ACIS数据的C++类层次结构图
1. 几何体。几何体是指模型的物理描述,如点(point)、曲线(curve)、曲面(surface)和直线(straight)等。这些元素之间不存在空间或拓扑关系。几何体的实现方式有两种:一是构造几何体,是含有几何体的数学定义的C++类,它主要用于数学计算,不被直接作为用户模型的一部分保存在模型中,但可以被包含在模型几何体中形成永久的实体对象,名称用小写字母表示,如cone、ellipse、sphere等;二是模型几何体,是为构造几何体增加模型操作功能的C++类,它和模型一起被保存在SAT文件中。模型操作功能包括模型数据的保存和恢复、模型操作历史记录及其回溯、变换以及为模型附加系统定义属性和用户定义属性的功能。模型几何体派生于ENTITY类,名称用大写字母表示,如APOINT、CONE、ELLIPSE等。
2. 拓扑。拓扑是指组成模型的各个对象之间的空间关系,也就是几何实体之间是如何连接的。ACIS的拓扑包括BODY(体)、LUMP(块)、SHELL(壳)、SUBSHELL(子壳)、FACE(面)、LOOP(环)、WIRE(线框)、COEDGE(有向边)、EDGE(边)和VERTEX(顶点)。它们继承了ENTITY的所有性质,并增加了专有的结构数据及访问这些数据的接口。各个拓扑对象之间的关系以及拓扑与几何之间的关系如图2所示。拓扑模型的遍历就是一个从上到下的循环查找的过程。
3. 实体属性。实体属性用来描述实体的非形状信息。实体可以有零个或者多个属性。ACIS中提供了ATTRIB类来描述属性,它提供了所有属性通用的数据和功能,包括用户自定义属性和系统属性。开发者可以从ATTRIB类派生自己的属性类,并以此为实体增加应用程序专用的数据。
图2 ACIS中模型的数据结构
ACIS是建立在软件组件技术基础上的开放式体系结构,通过采用软件组件技术,用户可以根据实际开发的系统需要对组件进行自由选择、搭配和组合,用户也可以采用自己开发的组件取代ACIS的部分组件。ACIS的C++库由35个DLL组成,这就为开发者开发3D应用提供了极大的柔性和功能基础。ACIS的组件包括核心组件和可选组件,可选组件可以集成到核心组件中。核心组件提供基本的造型功能,所有组件从根本上依赖于核心组件。其中,核心组件KERNEL提供了对基本实体和属性的支持,定义了拓扑和几何实体类、构造几何类、数学处理类、文件的保存及其恢复,支持历史和回溯;核心组件ACIS 3D Toolkit提供了在一致的、公共的数据结构之上的线框、曲面、实体的造型功能框架,具备三维造型的基本功能,如零件/模型管理、图形交互、基本显示、OpenGL显示等;组件BASE具有其它ACIS组件要用的基本通用功能。
ACIS的每个组件都包括ACIS类、API函数和DI函数。ACIS类描述实体模型的几何、拓扑和物理属性信息,用来定义实体模型的数据结构。在应用中,可直接通过类的公共数据成员和保护数据成员以及成员函数与ACIS相互作用。开发人员也可以根据自己系统的需要从ACIS类派生出自己的应用类,类接口在各版本中可能有变化。API函数作为ACIS和用户程序的接口,在用户程序开发中十分重要,几乎封装了所有实体模型数据的重要操作,包括创建几何模型、修改模型属性和提取模型信息。应用通过调用API函数来创建、修改或恢复数据,API函数将造型功能与应用支持特性集成起来,应用支持特性如变量错误检查和回溯。当在API例程中发生错误时,ACIS可立即自动回溯到调用此API例程前的状态,从而保证模型不会崩溃。无论ACIS底层的数据结构或函数如何修改,这些API函数在每一版本中均保持不变。DI函数提供了不依赖于API而对ACIS造型功能可直接访问的接口,与API不同的是,这些函数在各版本中可能有变化。因此,开发时尽量不采用DI函数,而是使用ACIS类和API函数。
二、HOOPS相关知识
HOOPS是建立在OpenGL、Direct3D等图形编程接口之上的更高级别的应用程序框架。HOOPS为软件开发人员提供了强大的图形功能,包括高质量的模型显示、便捷的人机交互、OpenGL和Direct3D在内的多种渲染管道的支持、高级渲染、3D图形的矢量化输出、动画、动态干涉检查以及图形数据流化处理等。
HOOPS组件按功能可分为HOOPS/3dAF、HOOPS/Stream以及HOOPS/NET三个子组件。HOOPS/3dAF组件是一个3D图形应用程序框架,是3D产品组的核心组件,采用了保留模式的图形数据库和多种渲染管道来管理和绘制图形对象。HOOPS/3dAF提供了一个基于一系列模块应用组件的灵活的架构基础,提供了非常全面的应用程序开发接口供用户选用或根据用户特定需求进行定制,这能促使快速开发和维持高性能的设计、可视和工程包。HOOPS/Stream是平台和GUI均独立的C++类的集合,它能使应用程序通过互联网和各种带宽的网络有效地流出高压缩的文件,包括巨大的2D、3D和自定义数据。这个功能使得它成为开发工程软件、CAD /CAM /CAE、分析、数字模仿、仿真和科学可视化应用的理想组件。它也允许开发者创建仅有的真正开放的可视化标准(HSF),这对于工程和网络用途都是最优的。HOOPS/NET组件则可以用于网络协同。这三个子组件既可以单独授权,也可以结合在一起使用。
在HOOPS中,场景是通过“片段”树的形式来描绘的。图3为一典型的“片段”树结构,位于最顶层的是根“片段”,树中的每个结点代表一个“片段”。构造一个模型时,首先要产生一个根“片段”,再根据具体要求从根“片段”产生一级子“片段”,二级子“片段”等。图3中的根“片段”有4个一级子“片段”,即Driver、Model、IncludeLibrary和StyleLibrary。Driver“片段”是HOOPS/3dGS自动创建的设备驱动“片段”,用来实现图形的显示与打印,针对不同的输出设备和显示平台,系统自动产生Type“片段”作为Driver的子“片段”。这些子“片段”实质上是一些抽象的C++类,不能直接调用,可通过生成类的对象实例来完成任务。若要在此窗口中显示模型,则需要把模型的“片段”插入窗口“片段”中。Model“片段”可看作是总装配体,包含part1“片段”、part2“片段”等零件。其中part1“片段”包含body1“片段”和body2“片段”两个零件,body2包含shell“片段”和line“片段”等实体“片段”。IncludeLibrary“片段”可以看作是零件库,在此“片段”下创建子“片段”构建标准零件库。图3中,part2“片段”是通过从此零件库复制子“片段”而得到。StyleLibrary“片段”可看作是属性库,某个“片段”的属性可通过复制其内部的属性子“片段”获得。
图3 HOOPS“片段”结构
三、BRIDGE相关知识
3D应用程序通过HOOPS/GUI和ACIS、HOOPS组件建立连接,从而实现利用ACIS内核进行造型,并利用HOOPS组件进行可视化和人机交互。ACIS和HOOPS之间通过HOOPS/ACIS桥进行通信,从而实现文档和视图分开。ACIS与HOOPS采用不同的数据结构来描述模型,需要经过转换才能将ACIS实体加入到HOOPS数据结构中。SpaHBridge动态库是连接ACIS与HOOPS的桥梁,用来完成实体转换和ID映射。在SpaHBridge中,HA_Render_Entities()函数可以读入ACIS实体列表,根据列表调用IEntityConverter类把ACIS的实体转换为HOOPS的实体“片段”并插入到HOOPS的“片段”树结构中加以渲染。
为了实现在HOOPS显示窗口中点选几何元素,实现对相应的ACIS实体进行操作,需要在HOOPS几何元素与ACIS实体元素之间建立映射关系。HA_Compute_Geometry_Keys()将ACIS实体指针作为参数来获取对应的实体“片段”的键值。相反,HA_Compute_Entity_Pointer ()可以获得与HOOPS实体“片段”对应的ACIS实体的指针。HOOPS/MVO的操作类通过键值访问“片段”,再通过调用HA_Compute_Entity_Pointer ()函数获得指针对ACIS实体进行操作.
四、开发过程总结
利用ACIS和HOOPS来开发三维图形软件,主要有以下几点:
1. 软件采用vc2005开发,主要内容是完成交互系统、造型系统和渲染系统的设计与实现。
2. 明确应用程序的开发框架,如图4所示。
图4 3D应用程序的开发框架
3. 通过HOOPS/MFC,建立MFC与HOOPS的接口,接收键盘/鼠标事件,并传递到HOOPS/MVO中。在HOOPS/MVO中,实现人机交互的控制。包括接受用户输入,对模型的渲染和显示控制,模型拾取操作等。
4. 通过HOOPS/ACIS桥,调用ACIS的API函数创建或修改3D几何对象,并存储在SAT文件中。对象的各种属性(几何属性和物理属性)存储在各自的属性表中。不论是简单几何体还是复杂几何体(通过布尔运算、拉伸、旋转等创建的物体)都通过ACIS来创建和修改。
5. 用ACIS来创建和管理几何模型,通过HOOPS/ACIS桥同步将其存放在HOOPS数据库的segment段中,最后通过各种渲染引擎渲染成几何实体。
6. 几何模型数据存放格式为hsf或hmf。
7. 开发时的一些基本程序代码。
启动:
api_start_modeller(0);
HA_Init(0);
unlock_spatial_products_1494();
……
造型:
HC_Open_Segment_By_Key(m_pHView->GetViewKey());
BODY* sphere_body;
api_make_sphere(radius, sphere_body);
api_transform_entity(sphere_body, delta_transf);
……
转换:
HA_Set_Rendering_Option();
HA_Render_Entity((ENTITY*) sphere_body);
HC_Close_Segment();
……
终止:
HA_Close();
api_stop_modeller();
……