摘要:目前没有在C#中开发OpenGL的标准,在.NET Framework中也没有OpenGL API接口。为此,研究了在C#中联合SharpGL编写三维建模算法,阐述了三维建模关键步骤,并且实例化例子。相比较C++,在动态链接库SharpGL.dll支持下,在C#中进行SharpGL三维建模代码可读性强,开发变得更简洁,程序可移植性佳。
关键词:SharpGL;C#;动态链接库;三维建模
中图分类号:TP317.4
文献标识码:A
文章编号:16727800(2017)004020503
0引言
SharpGL是进行三维显示的函数库,其运行环境与平台无关,能在Windows、Linux及Mac OS等操作系统上运行,故其在硬件、窗口及操作系统方面是相互独立的,SharpGL能不依赖于任何硬件或操作系统即可运行。SharpGL本身只定义了一个标准,因此只要符合定义标准的函数库,都可以称为SharpGL标准函数库。ATT、UNIX软件实验室、IBM等著名企业都采用OpenGL标准。SharpGL标准定义的函数库分为4个部分:SharpGL核心库、SharpGL实用库、SharpGL辅助库、SharpGL工具库。SharpGL函数库是一个实时渲染函数库,能够在短时间进行实时交互绘制。DirectX与其相似,但只能在Windows操作系统上执行。 C#是微软公司早在2000年就开始推出的一种高级编程语言,这种高级编程语言运行在.NET CLR环境上,并基于.NET Framework框架创作。C#是从C与C++语言派生出的,吸收了C与C++的优点,并弥补了C与C++的缺点,从而产生功能强大、类型安全、更简单的面向对象语言。C#代码框架具有面向对象、引用类等概念,几乎囊括所有软件开发与工程研究的最新成果。相比较C与C++而言,C#具有语法简单易学、配置与调制简单、程序开发周期短等优点,广泛应用于当今工程开发。本文将C#和SharpGL联合,开发三维物体模型程序以提高效率。
1SharpGL函数库
1.1SharpGL核心库
SharpGL动态链接库――核心库包含约115个可以被调用的函数,统一将函数名的前缀命名为gl。核心库函数用于常规图形处理,应用范围较广。同一个功能函数输入不同类型的参数,从基本的115个函数中派生出来的函数表达式约有300。
1.2SharpGL实用库
SharpGL动态链接库――实用库包含约43个可调用函数,统一将函数名的前缀命名为glu。SharpGL提供了丰富的绘图函数命令,但所有图形绘制都由点、线、面元素组合而成。glu函数通过调用核心库函数,为软件开发提供了相对简单的用法,可实现较为复杂的操作[1]。
1.3SharpGL辅助库
SharpGL动态链接库――辅助库包含约31个可调用函数,统一将函数名的前缀命名为aux。辅助库函数提供面向对象的数据输入输出处理、窗口操作以及绘制一些简单的三维物体。
〗1.4SharpGL工具库
SharpGL动态链接库――工具库包含约30个可调用函数,统一将函数名的前缀命名为glut。glut是不依赖于任何操作系统平台的SharpGL函数库,用途是隐藏不同操作系统接口难题。工具库函数以glut开头,提供更为复杂的绘图功能[2]。由于glut中的面向对象窗口管理函数不依赖任何运行环境,因此SharpGL中的工具库可以在各种操作系统中执行命令[3]。
2SharpGL建模环境创建
2.1添加SharpGL引用
在Visual Studio 2012中建立C#应用程序过程很简单:在Visual Studio 2012编译器环境中选择新建项目――Visual C#--Windows窗体应用程序,输入项目名称与解决方案名称,然后保存在适当路径位置,点击确定,就成功创建了WindowsForms应用程序。此时Visual Studio 2012会根据上一步的输入,自动创建一个程序命名空间、一个窗体组建 (Form1)以及程序的主入口函数 Main(string[] args)。 到此,Visual Studio 2012只是创建了应用程序主体,即编译环境,使用SharpGL还必须添加SharpGL的动态链接库引用。在C#中,引用是通过using关键字实现的,在编写代码窗口上部输入代码: using SharpGL; 至此,SharpGL的动态链接库引用工作完成,下一步工作就可使用SharpGL函数绘制三维物体模型了。
2.2创建SharpGL设备环境
使用SharpGL相关代码开发三维物体模型时,必须先建立绘制设备环境。先拖拉一个可视化组件,用于显示三维模型绘制。在Visual Studio 2012项目名称中添加一个组件,命名为SharpGLControl,然后为创建的组件类进行对象实例化,编写如下代码:
// Get the SharpGL object. SharpGL gl = SharpGLControl.SharpGL;
为了在SharpGLControl对象组件上绘制三维物体模型,必须先进行初始化设置,这一点与其它程序语言不同。SharpGLControl加载如下:
//Clear the color and depth buffer. gl.Clear(SharpGL.GL_COLOR_BUFFER_BIT | SharpGL.GL_DEPTH_BUFFER_BIT); //Load the identity matrix. gl.LoadIdentity();
2.3建立SharpGL绘制环境 由于SharpGL直接使用绘制环境,与设备环境没有关联。因此,还需要建立一个SharpGL绘制环境,否则SharpGL函数不能调用。在SharpGLControl_SharpGLDraw中定义了绘制环境相关函数,无需重写这个函数就能直接调用。由于SharpGLControl_SharpGLDraw是由SharpGL类派生出来的,因而它具有Control类的全部属性和功能。 SharpGL具有多种函数,绘制环境如下:
// Get the SharpGL object. SharpGL gl = SharpGLControl.SharpGL; //Set the projection matrix. gl.MatrixMode(SharpGL.GL_PROJECTION); //Load the identity. gl.LoadIdentity(); //Create a perspective transformation. gl.Perspective(60.0f,(double)Width / (double)Height,0.01,100.0); //Use the 'look at' helper function to position and aim the camera. gl.LookAt(-5,5,-5,0,0,0,0,1,0); //Set the modelview matrix. gl.MatrixMode(SharpGL.GL_MODELVIEW);
通过以上步骤操作,SharpGL绘制环境创建工作就全部完成,在这个程序代码环境中即可进行三维建模。SharpGL中创建的所有三维物体模型,如三维建筑物、家具、山峰等,都是用顶点描述的,因此三维物体模型绘制操作都可针对每个特征点进行计算,然后通过内核矩阵函数进行光栅化形成二维像素。SharpGL的另一个核心模块是矩阵算法变换,就是把三维物体模型转换为二维图像。
3三维建模算法
随着计算机技术的不断进步,在图像、VR、游戏系统、医疗系统等领域构造和使用的模型越来越复杂、越来越精细。这些复杂的物体模型,不但对计算机的处理速度以及存储容量提出了更高要求,而且成为实时绘制物体模型、通信传输的瓶颈,因此物体模型简化研究成为非常重要的科研课题。物体模型简化指在保持原有模型基本不畸变的条件下,采用适当的函数算法减少该物体模型的三角面数、边数、顶点数[3]。 三维物体模型因其表面凹凸不平,呈现一种连续变化的曲面,这种曲面无法用平面地D确切表示。单元三角形是三维物体模型的基本组建单元图,为真实表现三维物体模型,每个单元三角形需要包括3个顶点和单元三角形的法向量,以此确定一个最小单位表面,不管多么复杂的三维物体模型都可以化解成多个单元三角形组合。对于同一物体,三维物体模型上的单元三角形并非独立存在,而是所有单元三角形都是相互关联的,这些关联信息主要体现在以下两方面:①邻接关系即共边与共顶点;②同一个单元三角形,法向量相等、法向量共面。通过上述单元三角形之间的联系进行分类,即可组成不同的三维曲面模型。 三维物体模型三角网算法可通过两个步骤实现:①在三维物体模型包含的所有点云数据中搜索符合单元三角形条件的点,建立单元三角形;②判断搜索到的单元三角形是否有共边关系,如果满足条件,就将单元三角形添加到三维物体模型的表面,如果没有则进行其它搜索。 SharpGL算法类定义如下:
public class Vertex public class Triangle ...... public class Mesh public void Compute(List set)
三维物体模型的噪点数据,必须去除点云数据的离群孤立点,编写相关算法,设定除噪阈值。阈值参数为噪声点阈值,小于这个值的点会删除,否则就参与计算。 其它相关定义如下: 定义1:三维物体模型中任意两个单元三角形共边,则称这两个单元三角形相邻; 定义2:三维物体模型中任意两个单元三角形共顶点,则称这两个单元三角形相接; 定义3:如果存在一组单元三角形具有相接关系,且两个单元三角形法向量相等,则这一组单元三角形在同一平面上; 定义4:如果存在一组单元三角形具有相接关系,且两个单元三角形的法向量处于某个平面上,则这组单元三角形在同一个柱面上。
4建模关键环节
4.1SharpGL渲染流程
在使用SharpGL绘制过程中,需要完成的加载任务有:设置各种缓存,如颜色、深度等,加载场景物体表面贴膜纹理,设置光照与阴影模式,建立景物显示列表、图像质量和材料性质等[4]。SharpGL渲染步骤如下: ①输入三维物体模型要渲染的点的云数据等相关信息;②设置摄像头的位置和视角,调整视觉角度,把三维物体模型安置到三维场景合适的位置;③设置投影光照位置、方向、颜色、类型等属性; ④设置三维物体模型颜色、纹理贴图等材质参数; ⑤将上述三维信息转化为二维图像。 SharpGL另一个重要模块是三维矩阵模块,据此进行三维物体模型的移动、旋转和缩放。
4.2纹理映射
对三维物体模型进行渲染,为了得到现实感效果,常用技术是模型表面贴图。通过纹理贴图,可使三维物体模型颜色不再是单一色彩,而是具有各种风格。 三维物体模型贴图原理:给每个三维物体模型顶点对应一个二维图形坐标,这样在显示三维物体模型顶点时可采用二维图像上相应像素的颜色值。三维物体模型位于三维空间,每个顶点的坐标是(x,y,z)三个分量,而二维图像位于二维空间,每个坐标是(u,v)两个分量,每个坐标称为顶点的纹理坐标[5]。三维物体模型制作时是没有纹理坐标的,需要经过专门的参数化过程来生成纹理坐标。如果一个三维物体模型没有纹理坐标就无法使用纹理贴图技术来渲染物体模型表面,因此,不是每个三维物体模型都可以显示纹理贴图,必须先生成纹理坐标才可进行贴图渲染。三维物体模型的纹理坐标对应的是二维空间像素位置,而不是像素的具体颜色,因此同一个三维物体模型只要更换贴图图像,就可显示不同的渲染效果。
SharpGL三维建模技术实现
上一篇:Web服务测试综述