基于OpenGL的邦宝模型积木分析系统设计与实现

时间:2020-10-05 11:55:29 研究生论文 我要投稿

基于OpenGL的邦宝模型积木分析系统设计与实现

  摘 要:由于传统单凭经验使用插座式积木搭建大型场景模型时会出现费时费力,无法提前统计成本等难题,所以急需开发出一个积木智能搭建系统。邦宝模型积木分析系统正是应企业需求开发,涉及到智能选择不同形状的积木来完成每一层的铺设、上下层交叉铺设、模型不同位置不同染色、减少零碎颗粒等要求,针对这种情况,提出了基于OpenGL技术,设计出相应的算法。本文从工程应用的角度出发,简要介绍了3DS文件格式,系统用到的开发平台及OpenGL技术,整个系统的结构总框架及功能,基于扫描法的栅格化算法、单层积木铺设算法及上下层粘连性检验算法。在此基础上实现了从3D模型文件导入、模型调整、切片分层、颗粒化到输出积木搭建方案的全自动化。

  关键词:积木;OpenGL;3D模型

  引言

  随着当今时代计算机技术的突飞猛进,三维图形技术在建筑虚拟、场景漫游、虚拟教育、3D游戏等各方面的应用越来越广泛。同时各种3D模拟积木软件也得到迅猛的发展,目前国内外应用较多的软件有Lego Digital Designer、MLCad、LDView、LPub等,虽然这些都是非常优秀的3D模拟积木软件,但它们并没有一个软件能彻底解决从三维模型导入、模型调整、切片分层、颗粒化到输出积木搭建方案的全自动化。

  OpenGL是一个功能强大的三维图形开发接口,由于它方便而强大的三维图形的绘制功能,并具有可靠性高、可扩展性、可伸缩性、容易使用、灵活性和可移植性等优点,因此应用OpenGL开发技术能够极大地提高开发效率。尽管很多文献[1-4]介绍了利用OpenGL技术对3DS模型数据进行读取、显示和控制的方法,但大多数只涉及到基本的静态3DS模型数据的使用,并没有对动态数据进行处理。本文基于OpenGL技术对邦宝模型积木分析系统进行了研究,通过这个系统,我们可以读取出3DS模型文件并对其进行显示控制,然后通过切片、颗粒化等一系列操作计算出在使用邦宝基本部件搭建一个模型时所需要的部件种类、个数及每层的积木搭建排列,进一步计算出整个模型所用积木的总重量及总价格。

  一、3DS文件格式简介

  3DS是Autodesk公司存储3D模型数据的一种文件格式。

  3DS文件结构由许多块组成,每个块由信息类别和下一个块的相对位置两部分组成,其中块的信息类别用ID来标识。由于每个块指出了下一个块的相对于该块起始位置的偏移字节数,这样即使你不明白这个块的含义,也可以很容易地忽略它。与许多文件格式一样,3DS二进制文件中的数据也是按低位在前、高位在后的方式组织的。例如,两个十六进制字节0x4A5C组成的整型数,表明5C是高位字节,4A是低位字节[5]。

  3DS文件中块的前两项信息分别是块的ID和块的长度,其中块的ID是一个整型数,而块的长度是一个块相对于该块的字节偏移量,是一个长整型数。3DS文件中每个块是一个层次结构,不同类型的块具有不同的层次结构。每一个3DS文件的开头都是由一个根块构成,它包含了整个文件,其ID是0x4D4D。根块内的块称为主块,主块有3D编辑程序块和关键帧块两种类型。主块后面是该主块所包括的子块,而3D编辑程序块是物体的形体数据定义的开始。3D编辑程序块的子块包括材质列表块、物体块等,而物体块又包含了网格块、亮度信息块、相机参数块等。其中网格块包括位置信息块、顶点列表块、面信息块等;关键帧块定义关键帧的信息。3DS文件这种复杂的块层次结构的优势在于即使我们并不知道每一个块的具体含义,在程序中读取3DS文件类型的模型时,完全可以忽略掉那些不感兴趣或不需要的块信息,仅读取所需要的块。

  二、开发平台和技术

  2.1 使用C#编程语言

  C#是一种完全建立在Microsoft.NET框架平台上的高级编程语言,它几乎集中了所有关于软件开发和软件工程研究的最新成果,如面向对象、类型安全等。C#充分利用了.NET框架的优点,是开发.NET框架应用程序最好的语言之一。与VC++相比,C#的程序调试更加容易,语法更加简洁,且可以更加快速地开发应用程序。把C#和OpenGL结合起来开发3D图形程序和软件,将显著提高开发效率[6]。

  2.2 使用OpenGL技术

  OpenGL的英文全称是“Open Graphics Library”,即“开放性图形库”,它是计算机工业标准3D应用程序接口,是一个功能强大,调用方便的底层3D图形库。作为图形硬件的软件接口,OpenGL由几百个指令或函数组成,这些指令允许用户说明二维几何对象或三维几何对象,允许用户对对象实施操作以便把这些对象着色到帧存上。OpenGL作为一个性能优越的图形应用程序设计界面(API),适用于广泛的计算机环境。OpenGL是一套底层三维图形API,之所以称之为底层API,是因为它没有提供几何实体图元,不能直接用以描述场景。但通过一些转换程序,可以很方便的将AutoCAD、3DS等图形设计软件制作的3DS模型文件转换成OpenGL的顶点数据。由于OpenGL提供了清晰明了的图形函数,所以不要求开发者把三维物体模型的数据写成固定的数据格式,开发者不但可以直接使用自己的数据,而且可以利用其它不同格式的数据源,这种灵活性极大地节省了开发时间,提高了开发效率。因此我们选择使用OpenGL技术进行开发。

  2.3 在C#中使用Tao框架实现OpenGL建模技术

  由于OpenGL的广泛应用,它已经成为了一个工业标准。

  目前虽然有很多软件开发商提供的程序设计语言都提供了对开发基于OpenGL应用软件的支持,如Visual C++,C++builder等。但是并没有提供在C#中开发OpenGL的标准和规范的方法,而且,在.NET框架中也没有提供0penGL API的接口。目前在C#中可以通过CsGL等第三方软件进行OpenGL建模的技术,也可以基于Tao技术,因为Tao Framework提供了许多基于.NET和Mono的库,它是由美国华盛顿大学分布式对象计算组织开发的开放源码的CORBA(通用对象请求代理体系结构)产品,它实现了C0RBA2.6规范中的说明。因此,我们利用Tao框架实现在C#中进行OpenGL建模的方法[7]。

  2.4 使用SharpGL扩展库

  SharpGL是C#对OpenGL库的封装,是一个方便我们在Windows窗体中和WPF中使用OpenGL的扩展库,它能够设置一个强大的场景图和Visual Studio模板。SharpGL扩展库包装了所有当前的OpenGL函数,所有主要的扩展和一套丰富的先进功能的对象,并且能够将代码移植到其它的平台中,所以我们使用它很容易开发出3D图形程序。它的命名空间包括: