利用ACIS、HOOPS开发三维软件
出处:http://blog.csdn.net/learningloong/article/details/37876999
一、 ACIS相关知识
ACIS是基于英国剑桥大学博士论文提出的边界表示法生成三维实体的理论体系而开发的三维几何造型引擎,它采用面向对象的数据结构,集线框、曲面和实体造型于一体,并允许这三种表示共存于统一的数据结构中,为各种三维造型应用系统的开发提供了几何造型平台。许多著名的CAD/CAM系统都是以ACIS作为几何内核,如Auto CAD、Turbo CAD、CADKEY等。
几何、拓扑和属性是ACIS模型的三个基本类,三者统一由最基础的抽象类ENTITY派生。虽然ENTITY本身不代表任何对象,但在ENTITY中定义了它的所有子类应具有的数据和方法,如存储、恢复、回溯等。ACIS模型数据的ENTITY及派生类层次关系如图1所示。
图1 ACIS数据的C++类层次结构图
几何体。几何体是指模型的物理描述,如点(point)、曲线(curve)、曲面(surface)和直线(straight)等。这些元素之间不存在空间或拓扑关系。几何体的实现方式有两种:一是构造几何体,是含有几何体的数学定义的C++类,它主要用于数学计算,不被直接作为用户模型的一部分保存在模型中,但可以被包含在模型几何体中形成永久的实体对象,名称用小写字母表示,如cone、ellipse、sphere等;二是模型几何体,是为构造几何体增加模型操作功能的C++类,它和模型一起被保存在SAT文件中。模型操作功能包括模型数据的保存和恢复、模型操作历史记录及其回溯、变换以及为模型附加系统定义属性和用户定义属性的功能。模型几何体派生于ENTITY类,名称用大写字母表示,如APOINT、CONE、ELLIPSE等。
拓扑。拓扑是指组成模型的各个对象之间的空间关系,也就是几何实体之间是如何连接的。ACIS的拓扑包括BODY(体)、LUMP(块)、SHELL(壳)、SUBSHELL(子壳)、FACE(面)、LOOP(环)、WIRE(线框)、COEDGE(有向边)、EDGE(边)和VERTEX(顶点)。它们继承了ENTITY的所有性质,并增加了专有的结构数据及访问这些数据的接口。各个拓扑对象之间的关系以及拓扑与几何之间的关系如图2所示。拓扑模型的遍历就是一个从上到下的循环查找的过程。
实体属性。实体属性用来描述实体的非形状信息。实体可以有零个或者多个属性。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来开发三维图形软件,主要有以下几点:
软件采用vc2005开发,主要内容是完成交互系统、造型系统和渲染系统的设计与实现。
明确应用程序的开发框架,如图4所示。
图4 3D应用程序的开发框架
通过HOOPS/MFC,建立MFC与HOOPS的接口,接收键盘/鼠标事件,并传递到HOOPS/MVO中。在HOOPS/MVO中,实现人机交互的控制。包括接受用户输入,对模型的渲染和显示控制,模型拾取操作等。
通过HOOPS/ACIS桥,调用ACIS的API函数创建或修改3D几何对象,并存储在SAT文件中。对象的各种属性(几何属性和物理属性)存储在各自的属性表中。不论是简单几何体还是复杂几何体(通过布尔运算、拉伸、旋转等创建的物体)都通过ACIS来创建和修改。
用ACIS来创建和管理几何模型,通过HOOPS/ACIS桥同步将其存放在HOOPS数据库的segment段中,最后通过各种渲染引擎渲染成几何实体。
几何模型数据存放格式为hsf或hmf。
开发时的一些基本程序代码。
启动:
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();
……
利用ACIS、HOOPS开发三维软件相关推荐
- 利用ACIS + Hoops + InterOp实现CAD软件
据我粗略了解,使用Hoops开发时一般会集成一个几何造型内核,主要使用ACIS.它们两者之间的关系就像GUI和操作系统内核的关系一样,一个负责图形图像的显示和用户的交互操作,另一个专注于核心算法的处理 ...
- 关于win7利用vs2010 MFC平台开发的软件在win10系统的电脑下无法运行的问题。
第一次独立开发一个软件,遇到了较多的问题特此记录一下.开发环境:win7 32位系统 vs2010,在有些win10系统下软件无法在正常运行.(注:在有些win10系统下也可运行,个人觉得可能不同的w ...
- 怎样利用Python开发天气预报软件,这份教程查收一下
今天要分享的是怎样利用Python开发天气预报软件,那话不多说,马上开始-- 1.首先建一个文件weather.py 2.创建窗口与显示窗口 3.为窗口设置标题与大小,保存运行如下图: 4.接下来创建 ...
- 化工设计常用的三维软件有哪些?SmartPlant 3D、PDMS、SolidWorks......
(本文转自微信公众号:化学工程设计,版权归该公众号所有) 导读:随着科技的迅速发展.计算机的快速发展,化工工程公司在化工设计中也在追求更高效更快速更简便的设计目标,如今越来越多的化工设计借助计算机三维 ...
- C4d lite r 16语言包,[其他软件] C4D S22 三维软件Maxon Cinema 4D S22.016 C4D R22 含中文语言包 破译版(Win)...
C4D S22 三维软件Maxon Cinema 4D S22.016 C4D R22 含中文语言包 破译版 2020年4月20日 – 专业3D建模,动画和渲染软件解决方案的开发商Maxon今天宣布了 ...
- 3d打印机、三维扫描仪和三维软件设计相互相辅的作用
(根据武汉迪万科技有限公司参考) 三维软件,是一种机械结构辅助设计软件,能够绘制出模具,机械构件等的三维结构的图纸. 目前使用三维软件有很多,不同行业有不同的软件,各种三维软件各有所长可根据工作需要选 ...
- pythoncad二次开发视频_revit二次开发|bim软件二次开发|revit二次开发教程|Revit二次开发技术文档...
二次开发 revit二次开发|bim软件二次开发|revit二次开发教程|Revit二次开发技术文档2019-07-08赞( 0 ) 记录一下CAD二次开发的一些简单实例. 1.helloworld ...
- 如何利用涂鸦免开发产品方案实现创意速搭
如何利用涂鸦免开发产品方案实现创意速搭 如何利用涂鸦智能免开发方案搭建生活中的创意.在生活中,我们在不经意间就可能会有一些创意,它或许是一个开关,或许是一个检测装置,又或许是一个远程数据采集的装置.但 ...
- 数领科技|三维软件有哪些?应该如何选择?
目前,存在着大量的三维机械设计软件,这些软件虽然品类繁多,但却各有侧重.选择什么样的软件,令很多小伙伴和公司企业犯了难.其实,只需要先了解各个软件本身的特点,然后企业或个人应当根据自身设计领域的不同, ...
- 2014年最热门的国人开发开源软件TOP100
2014年最热门的国人开发开源软件TOP100 不知道从什么时候开始,很多一说起国产好像就非常愤慨,其实大可不必.做开源中国六年有余,这六年时间国内的开源蓬勃发展,从一开始的使用到贡献,到推出自己很多 ...
最新文章
- 基于K8S构建企业级Jenkins CI/CD平台实战(二) 之 kubernetes-plugin 插件使用
- Codeforces Round #333 (Div. 2) C. The Two Routes flyod
- 怎样进入服务器修改东西,进入服务器修改数据库
- scrapy设置代理的方法
- PHP如何连接MySQL数据库
- 调用系统函数向进程发信号core
- React开发(268):debounce is not a function报错
- 【python毕业设计】Django框架实现学生信息管理系统
- 如何下载linux历史版本下载,CentOS历史版本下载方法
- flowable连线名称不显示bug修复说明
- 半监督学习的概述与思考,及其在联邦场景下的应用(续)
- Python和imutils获取图片的鸟瞰图
- 解决Mac文件乱码问题
- WPF之基于路径的动画
- SSM框架01--springmvc
- zookeeper的zxid
- 如何正确卸载天锐绿盾客户端
- linux c++ opencv4安装指南
- 街头篮球服务器维护,《街头篮球》4月23日新版活动抢先看
- Linux设置和取消定时关机,修改 linux 默认启动级别 设置系统时间 定时关机