本帖最后由 林黛玉 于 2013-6-29 11:13 编辑
作为一个面向船人的论坛,这个板块的帖子大多是关于如何使用船舶软件。不过我想或许会有人好奇这些软件是怎么开发出来的,甚至有志于做这一行,因此我斗胆开了这个帖子和大家一起讨论。不感兴趣的朋友可以不用往下看了,呵呵!
CAD软件不管是二维的还是三维的,首先要解决的是图形元素在计算机中的表达和显示问题。最简单的比如一个点,二维的可以表示为x和y,三维的自然就是x/y/z了。要显示它,可以用现成的库,比如微软的GDI/GDI+/DirectX,跨平台的OpenGL。有人可能会问如何存储和如何在屏幕中操作这个已经显示的点呢?这就是数据库技术和windows消息机制原理。有了几何图形,船舶的板啊,加强筋啊之类的自然也可以表示,这就是所谓的专业模块。除此之外,还要做大量的操作界面,如菜单、对话框等。综上所述,我认为船舶设计软件主要有五大模块组成:
1)几何造型
2)图形平台
3)数据存储
4)船舶专业功能(船体、舾装、出图等等)
5)用户界面
这五个模块中前三个是基础,它们一起支持着最重要的船舶专业功能,第五个往往被开发人员轻视,但是用户尤其是领导是非常关心的 接下去我会就每一部分以及它们之间的关系稍微展开一下,如果有人感兴趣,就会一直写下去,否则可能就太监了,哈哈!
==========================
(以下由版主林黛玉整理)
==========================
1)几何造型
几何造型是CAD的核心和基础,近几十年来,国内外都有很多公司和机构在这方面做了大量的理论研究和工程实践。大名鼎鼎的数学家苏步青就是这方面的专家。不过做得好的还是在国外,不管是开拓性的贝赛尔曲线以及后来发展出来的NURBS,还是现代三维CAD(Catia,ProE,UG等等)的核心库。国内的清华英泰和中望也有自己的内核,不过估计还是有很大差距。现在世界上流行的几何造型库是Parasolid和ACIS。在船舶设计软件中,Tribon M2以后据说用ACIS了,Foran好像是用开源的OCC,CADDS5虽然和ProE是一家公司,但是作为被抛弃的产品,它还是用原来自己的库。衷心希望国内相关的公司能重视起这一块,只有基础扎实了才能走得更快更远,否则永远只是靠低价贱卖!
啰嗦了那么多,那么几何造型到底做些什么呢?怎么做的?顾名思义,就是针对几何元素在计算机中进行造型,就像第一篇里面写的那个点。当然,点是比较简单的例子,CAD中什么复杂的元素都有。总的来说,主要可以分为两大类:规则的和不规则的。规则的如二维的直线、圆,三维的圆柱、正方体等等,不规则的就多了,简单地说,除了规则的都是不规则的!规则的元素的表达比较容易理解,大家可以回顾一下高数里面涉及到几何的部分。那么不规则的怎么表达呢?这就是几何造型系统要研究的主要内容之一。
现代几何造型系统主要包括NURBS曲线曲面和Brep体的表达和针对它们的计算。关于NURBS,其作者写了一本《The nurbs book》,国内也有引进,翻译的还不错。可以说有了这三个基础,基本上世界上任何实物都可以表达出来。在船舶结构中,如一块长方形的平板,就是一个包含六个NURBS曲面的Brep体。但或许有人会说,用一个NURBS面加一个厚度不就可以表达了吗?或许还会有人说,一个面的四个顶点加一个厚度也可以表达啊!这涉及到两个问题,1)存储和显示可以分开,所谓的定义数据和模型数据。定义数据肯定可以转化成模型数据,但是为了加快显示速度,很多系统会保存算好的模型数据;2)定义数据统一化与否,NURBS不但可以表达不规则图形,也可以表达规则图形。不过它表达规则图形有点杀鸡用牛刀的感觉了,呵呵!
几何造型除了表达实体,还有大量的计算,简单地比如求曲线长度,判断曲线是否封闭,难的如曲线曲面求交、曲线的合并、曲线到曲面投影等等。不过一般来说,针对船舶专业模块,需要在通用的接口上做适用的专业几何运算库。
先说这么多,不知道有没有人看
2)图形平台
这部分和几何造型系统一样,也是计算机图形学研究的范畴,我也是略懂皮毛。以下还是把自己做过的、看过的、想过的随便聊聊,写得不好的地方请大家指导。
所谓的图形平台,我的理解是把几何数据显示到计算机屏幕上。
如果画简单的少量的图形,那么基本上直接用现有的库就可以了,比如最流行的OpenGL,Windows平台下的GDI等。当然这并不是说这些库很简单,其实做好这种库非常难,因为它做的事情很大一部分是和硬件、操作系统底层打交道,还有很多图形学算法,最典型的抗锯齿算法、消隐算法等。大家有兴趣的话,可以看一下OpenGL红蓝宝书和一些图形学专业书籍。
对于复杂的模型,如果直接用这些库而不做任何处理,那么效率是及其底下的。比如说,要显示一条整船,如果每个结构以及它的细节都显示,那么软件肯定会崩溃的。但是可以做很多优化,从外面看,内部不用显示;从远处看,细节不用显示;窗口外部的不用显示等等。这些任务就需要交给专门的库来完成了,在CAD领域有大名鼎鼎的hoops,开源的OSG等,在动画游戏领域也有一些,虽然和三维CAD的显示有很多相同之处,但是区别还是挺大的。我的理解是CAD的显示需要更高的精度,而动画游戏领域更加关注美观和速度。打个比方说,同样一条船,如果是在三维CAD里面,外壳显示的应该是NURBS曲面,但是在动画软件里面,可能由很多三角片面组成,因为那样更加容易渲染。
针对CAD图形元素的显示,先说二维。简单的场景不需要任何优化,但当显示的二维图形超过一定数量时,不管是刷新的速度还是捕捉的速度都会变得非常慢,不过二维的问题或许主要就是这两个,尤其是刷新速度。之前也说过二维CAD的龙头老大AutoCAD做了一套自己的显示引擎,它的刷新速度非常快,我用OpenGL显示列表显示同样数量的几何对象都没有它快,关键又没增加多少内存使用。国内的中望CAD近几年比较火,但是刷新速度还是和它有明显差距。
三维的显示就比二维要复杂的多了。不过幸运的是有强大的Hoops等库。至于它的原理,网上有一些介绍,有兴趣的朋友可以找找。 3)CAD数据库
这里所说的数据库是指存储CAD数据的容器及相应的读取接口,并不是指现在流行的商业数据库,如Oracle, SQL/Server等,为了叙述方便,借用一下这个名字。
在CAD软件的萌芽阶段,由于数据量比较少,所以一般都集成到CAD软件中。比如用MFC开发的软件,或许直接用自带的CDocument类把CAD数据存储在内存中,用序列化接口读写硬盘文件。然后自己来做一些性能优化的工作:比如为了加快查找速度,对每个数据加一个索引,利用B、B+树组织数据存储方式;把频繁使用的数据放到缓存中等。这个阶段估计和其他用到数据库的软件差别不大。
随着数据量的增大,操作的多样化,很多软件都会出现数据管理困难或性能出现瓶颈,这个时候数据库的重要性就开始体现出来了。发展到现在,很多软件干脆以数据库为核心,其他应用功能都围着它转。比如各种管理系统,在设计的初期就会把数据库的设计做为头等大事。包括最近几年很火的大数据、云存储之类,其实都是为了更好的组织、管理和使用数据。
CAD数据库和其他软件的数据库有很多相同之处,但是也有其自身的特点,这主要是由于它的数据比较有特点。举个最简单的例子,存储一个公司的所有员工信息,先确定好字段就可以往里面填数据了,比如/姓名/年龄/性别/....然后可以填/张三/22/男/....。但是CAD数据库可不能这样,因为数据结构可能差别很大,比如一条直线就两个点,但是一个圆需要一个点和一个半径,样条曲线更复杂。。。有些地方可能还需要存一些图片,还要存各种关系:板架下有多少块板、筋,管子和阀的连接关系等等。如何高效合理地存储这些数据是很多国际著名CAD公司曾经头痛的事情,不过现在都纷纷有了自己的解决方案。其中比较出名而且容易理解的是利用XML,它对于船舶数据有一个非常大的特点在于它的树状结构,这和船舶模型非常吻合,比如船舶下面有很多分段,分段下面有很多板架。。。
对比结构化数据库,XML类似数据库中的一个表形式。因此,要充分利用XML的特征,必须让很多XML文件有机组织起来,成为一套完整的CAD数据库解决方案。据我所知,很多国外的三维CAD软件已经早就完成了这种转变,而且效果非常不错。
针对CAD数据库,所涉及到的远远不止以上所说的这些。不仅要考虑在通用数据库中也是非常核心的安全性(备份、还原、回退等等)、数据并发访问、高性能(查找、写入、传输等等)等,还要重点关注具体船舶软件中的数据结构和关系。设计好架构以后,还需要提供一套比较完整而简洁的访问接口。
|