Open Inventor 在STK 模型转换中的应用
韩潮,曲艺
摘要:为解决航天仿真系统中的航天器建模问题,对STK模型文件进行了结构分析,探讨了STK建模语言和VRML 建模语言在总体规则、语法语义等各方面的异同,构建了读取STK模型文件、调整其数据结构、利用Open Inventor 重构模型、最终输出标准的VRML 模型文件的框架,集中讨论了引用图元、模型动作、模型纹理、模型变换的转换方法,并据此开发了一套模型转换程序。实践证明,该方法能够实现STK 模型图元、参数、变换和动作的转换,与以往方法相比,能够大大降低运算复杂度和存储消耗。
关键词:卫星工具包建模语言;虚拟现实建模语言;模型转换
1 引言
近年来,虚拟现实技术迅速兴起,并与系统仿真技术相结合,在社会生产生活中发挥着越来越大的作用。航空航天是虚拟现实技术最主要的应用领域之一,20 世纪90 年代以
来,许多国家都在开发基于虚拟现实技术的航天仿真系统。其中,航天器建模由于工作量大、易于出错而逐渐引起人们的关注。文[1]提出了将STK 模型转换成VRML 模型,进而把VRML 模型作为仿真系统模型的思想,并进行了部分转换,但是它没有涉及模型的纹理和动态特征,对变换细节考虑得不够详细,对引用图元的处理也比较粗糙,导致目标文件庞大。本文对STK 模型文件进行了分析,比较了STK 建模语言与VRML 的异同,系统阐述了利用Open Inventor 实现从STK 模型到VRML 模型的转换方法,并针对文[1]存在的问题做了详细论述。
STK 建模语言是美国AGI 公司(Anaiyticai GraphicsInc. )推出的航天分析软件卫星工具包(Sateiiite Tooikit,简称STK)中的三维建模语言,STK 内部附带大量的以该格式
描述的航天器模型,几乎涵盖了目前为止所有典型的航天器类型,是非常丰富的模型资源库,但是由于该数据格式是STK 专用的数据格式,大大限制了它的使用范围。
VRML 是虚拟现实行业的标准文件格式,已经得到广泛支持,以它为媒介,能够迅速拓宽应用领域,又由于它与网络紧密结合,便于将航天任务模拟从单机环境转移到网络环境。
Open Inventor 是科学和工程领域三维可视化和可视仿真软件的标准图形库,它以OpenGL 为基础,集中精力处理三维对象信息。Open Inventor 直接支持VRML2. 0 概念,在规范中有与VRML 定义严格匹配的节点类,具备准确导入、导出VRML2. 0 文件的能力[2]。
2 STK 模型文件剖析
STK 模型文件由若干个逻辑上独立的组件组成,组件作为STK 模型文件的数据单元,可以包含描述几何构型的图元(以下称几何图元)、指向其他组件的图元( 以下称引用图
元)、描述构型外观属性的参数、定义模型静态分布的变换和模型动态特征的动作等。就体系结构而言,组件位于其包含的图元和引用组件的上层。模型中组件的定义具有无序
性[3]。
图1表示了一个简单的STK 模型[3]。
其中,Vehicle 是根组件,SolarPanel 和Body 是组件,Referl、Refer2 和Refer3 是引用图元,Cylinder和Polygon 是几何图元。
3 STK 建模语言与VRML 的比较
STK 建模语言和VRML 都属于三维建模语言,都有独立的描述单元,前者以组件为描述单元,后者以分组节点为描述单元,前者利用几何图元描述几何构型,后者用造型节点描述几何构型,此外,在外观描述、空间方位描述等方面,二者均有异曲同工之妙。但是,二者还存在着显著差异:
STK 的组件不可以嵌套定义,而VRML 的分组节点可以嵌套定义,因此,虽然在本质上STK 和VRML 都用树状结构来描述空间造型,但在形式上,STK 采用链式结构存储组件信息,再利用组件内部的引用图元张成树状结构,而VRML 直接采用树状结构。STK 的几何图元比VRML 的几何节点更加抽象。以Cylinder 图元为例,对于不同的参数设置,它能够产生圆柱、圆锥、圆台等不同的几何构型,而VRML 的Cylinder 节点则只能产生圆柱。而且,双方根据各自的应用领域,制定了利于己用的基本构型描述方式,例如,STK 为了满足绘制天线的需要而设置了Helix( 螺旋线) 图元,VRML 则设置了IndexedLineSe(t 线段集合)节点。在参数继承方面,VRML2. 0 节点除了变换以外不继承任何属性,而STK 的部分参数值( 主要包括材质和绘制风格参数)则会被组件的子图元或者下级组件继承,可以说,VRML 节点的封装性要好于STK 图元,但是STK 的描述则显
得更加灵活。
二者采用的纹理文件格式不同,STK 采用PPM(Portable Pixel Map)格式的纹理文件,VRML 则支持TIFF、PNG、BMP、JPEG、GIF 等格式的纹理文件。另外,二者采用的纹理映射方式不同,STK 还专门定义了纹理动作。
STK 文件中,变换命令按照写出的顺序执行,而在VRML 中,变换命令的执行有固定的顺序,即按照先缩放、再旋转、最后平移的顺序执行。不仅如此,在STK 中,对于同一
图元,变换命令出现在其前面和出现在其后面的效果是一样的,而在VRML 中,变换命令出现在节点之前与出现在节点之后则会产生不同的效果。STK 的缩放变换相当灵活,缩放系数可以是正数、负数,还可以是0,但是VRML 的限制则较多,它默认缩放系数为正数或0,对于负缩放系数,会产生不确定的结果。
4 模型转换总体方案
可以把模型转换工作划分为三个阶段:读取STK 模型文件阶段、调整数据结构阶段和利用Open Inventor 重构模型并最终输出VRML 文件阶段,具体流程见图2。
根据文[3],可以归纳出STK 模型文件的形式化文法,并以此为依据,构造出STK 模型文件的词法分析器和语法分析器。在数据读入阶段,语法分析器起中枢作用,它调用词法分析器,识别读入符号的语法成分,按照数据规则读取数据并以组件为单位进行有序存储。
由于源文件采用链式结构,目标文件采用树状结构,因此,有必要在进行翻译之前调整数据结构,该阶段又可以进一步分成三个子任务:寻找根组件、将组件定义的参数传递
给下属图元和处理引用图元,核心是处理引用图元。重构工作从信息树的根节点开始,按照表1转换原则[l],为每个节点生成对应的VRML 节点类实例,并根据原有的各项数据计算出对应的节点域所需的数值,最终形成完整的Open Inventor 模型。
形成Open InVentor 模型以后,无需手动将其解析成VRML 模型,直接利用Open InVentor 的SoWriteaction 函数,即可输出VRML2. 0 文件。
第三阶段转换的对象包括图元、参数、变换和动作,其中图元和部分参数的转换在文[l]中已有阐述,本文不再赘述。
4. 1 处理引用图元
对引用图元的处理是改变模型文件结构的关键。它不单纯是把指针指向被引用的组件,还涉及到去除冗余信息,进行参数继承等问题。
STK 采用链式结构,可以把组件写在任何位置,需要时用引用图元调用即可,而VRML 直接使用树状结构,转换时需要确定在何处定义该组件,在何处使用该组件。文[l]采
用的方法是只要引用某组件,就把该组件定义一次,如果某组件被多次引用,就会带来冗余信息。本文采用的原则是,从根节点向下遍历,在组件初次被引用时定义该组件,并记录下组件的翻译结果,以后如果该组件再次被引用,就直接使用以前翻译的结果。由于STK 允许参数继承,所以,“ 初次被引用”不能仅凭组件名称判定,还要考虑它被引用时,传递给它的参数设置是否与以前完全相同。图3 体现了本文处理引用图元的流程。
表2 中列举的数据反映了使用本方法处理引用图元与以往方法的效果对比。
表2 中后两列数据的比值与STK 源文件的结构有直接关系,如果源文件中大量使用引用图元,则压缩比较大,反之压缩比较小。
4. 2 动作的转换
STK 中,动作为组件或者图元的位置或方向定义了一个取值范围,依照用户命令或者动作文件的规定产生一系列变换,形成动作效果。
在VRML 中,动态效果是某些对象随着时间变化而变动位置、方向和大小等。控制一个动态的虚拟对象需要两个要素:一是时间如开始、结束、循环等,二是描述动态对象改变
的方式,如平移、旋转、缩放等,在二者之间进行沟通的是路由(route),它将某节点的输出传至其他节点的输入。实际转换时,可以为每个动作数据区创建一个时间节点,即该动作数据区内的所有指令都使用统一的时钟标准,然后对应动作指令建立插值节点,把动作的最小幅度值作为插值节点的第一个关键值,把动作的最大幅度值作为插值节
点的最后一个关键值,并且设置计时器节点和插值节点之间的路由,最后,在活动部件的变换域与插值节点之间建立路由。
4. 3 纹理的转换
VRML 不支持PPM 格式的纹理文件,所以需要事先使用图像处理软件把它转换成VRML 支持的格式,再加以利用。STK 支持在RGB 文件定义纹理的同时用灰度文件定义
纹理的透明度,形成某些特殊的视觉效果,如火箭的尾焰等。而VRML 则要求将所有的纹理信息一次性写入纹理文件,再通过对纹理文件的解释形成视觉效果。对于这种情况,可以分别读取两个图像文件的数据,再把两者的信息综合起来,形成带有透明度信息的PNG 格式的纹理文件。STK 与VRML 采用截然不同的方式进行纹理映射,必须进行调整方能达到一致,具体的调整方法可以参见文[3 -4]。
4. 4 变换的转换
由于STK 与VRML 对变换命令执行的顺序不同,所以不能直接进行对照转换,不妨借助变换矩阵完成转换。在形成场景图时,首先按照命令在源文件中定义的顺序取出变换命
令及其数据,把它们逐一转换成变换矩阵,再将所有的变换矩阵相乘得到复合变换矩阵,作用于下属节点。输出文件时,可以利用Open Inventor 对VRML 标准的支持能力,直接把变换矩阵分解为变换命令,不必人工解析。
5 实验结果分析
上述方法已经在笔者自行开发的模型转换程序中得以实现,并使用STK4. 2. 1 版本内附带的数百个模型进行了测试,均可达到预期目标。测试环境为Visuai C + + 6. 0,TGS
Open Inventor 4. 0。下面是表2 中列举的gaiiieo 和map 两个模型的转换结果,图4 和图6 是转换以后的VRML 模型在TGS Open Inventor 的观察窗口中观察的效果,图5 和图7 是STK模型在STK 的Modeier 窗口中观察的效果(限于篇幅,无法给出文件的文本描述)。
6 结论
本文首先剖析了STK 模型文件的结构,进而比较了STK与VRML 文件的异同,阐述了利用Open Inventor 将STK 模型转换为VRML 模型的方法。该方法层次清晰,可读性好,存储开销较小,能够实现模型的全信息转换,为航天仿真系统航天器建模提供了一条便捷可靠的途径。
更多STK学习资料免费下载:
http://download.csdn.net/user/appe1943
转载自原文链接, 如需删除请联系管理员。
原文链接:Open Inventor 在STK 模型转换中的应用,转载请注明来源!