摘要:本文介绍了OpenGL在三维物体建模中的应用,并在VC++下通过该技术实现了对自由型曲线曲面的模型搭建。
关键词:OpenGL;自由型曲线曲面;NURBS;Visual C++
引言 随着计算机技术的飞速发展,计算机的性价比越来越高,为计算机图形学的发展奠定了坚实的基础。科学计算可视化、计算机动画和虚拟现实等技术在工程应用中得到了广泛的使用,这些技术的实现离不开对真实物体的三维建模。在实体建模时为减少运算量和存储空间多采用少量的控制点和各种光滑的样条和样条曲面如B样条、Nurbs曲面和贝塞尔(Bezier)曲面等来对其作精确的描述。自由型曲线曲面是一种非常重要的工业产品几何定义,在计算机辅助设计类软件中应用较为普遍。自1991年ISO(International Standardization Organization,国际标准化组织)颁布了STEP标准后由于在标准中明确规定了自由型曲线曲面在工程中唯一地用NURBS(Non_Uniform Rational B-Spline,非均匀有理B样条)表示而且在OpenGL(Open Graphics Library,开放式图形库)中对NURBS提供有建立在求值器基础之上的高层编程接口,因此在三维实体建模中多通过使用OpenGL求值器来完成对各种复杂自由型曲线曲面的构造。本文将在VC下对OpenGL提供的这个编程接口的使用进行介绍,并通过对该接口的编程实现对自由型曲线曲面的绘制。
OpenGL基本程序框架 OpenGL三维图形标准是由AT&T、IBM、DEC、SUN、HP、Microsoft和SGI等多家公司在GL图形库标准的基础上联合推出的开放式标准,它的出现彻底改变过去只能依赖于价格昂贵的图形工作站及复杂的三维图形软件从事三维图形计算机应用的历史,使广大程序员能够在PC机上用C语言开发出复杂的三维图形。由于OpenGL具有跨平台性、简便、高效、功能完善,目前已经成为三维图形制作中事实上的工业标准。它不仅提供了绘制点、线、多边形等基本形体的函数,还提供了绘制复杂三维曲线曲面和三维形体的函数。由于OpenGL在进行几何建模时是以顶点为图元,由点构成线,再由线及其拓扑结构组成多边形曲面,因此应用OpenGL提供的建模函数可构造出几乎所有的三维模型。
OpenGL的作用机制是客户(Client)服务器(Server)机制,客户(用OpenGL绘制图形的应用程序)向服务器(OpenGL内核)发送OpenGL指令,由服务器负责解释执行这些命令。OpenGL图形库被封装在动态连接库opengl32.dll内,在使用时从客户应用程序发出的对OpenGL接口函数的调用首先被opengl32.dll处理,然后传送给服务器并由Winsrv.dll做进一步处理后传给Win32 DDI(Device Drivers Interface,设备驱动接口),最后把处理过的图形命令送给视频显示驱动程序完成最终的显示。
由于OpenGL的辅助库函数对于自由型曲线曲面的绘制提供有NURBS编程接口,因此使用起来比较简单。使用OpenGL之前,必须通过初始化代码对其进行初始化并定义像素的存储格式等信息:
PIXELFORMATDESCRIPTOR pixelDesc; pixelDesc.nSize = sizeof(PIXELFORMATDESCRIPTOR);//pfd的大小 pixelDesc.nVersion = 1; //版本号 pixelDesc.dwFlags = PFD_DRAW_TO_WINDOW | //支持窗口 PFD_SUPPORT_OPENGL| //支持OpenGL PFD_DOUBLEBUFFER; //支持双缓存 pixelDesc.iPixelType = PFD_TYPE_RGBA; //RGBA类型 pixelDesc.cColorBits = 32; //32位色深度 pixelDesc.cRedBits = 8; //各颜色位 pixelDesc.cRedShift = 16; pixelDesc.cGreenBits = 8; pixelDesc.cGreenShift = 8; pixelDesc.cBlueBits = 8; pixelDesc.cBlueShift = 0; pixelDesc.cAlphaBits = 0; //无alpha缓存 pixelDesc.cAlphaShift = 0; //忽略转换位 pixelDesc.cAccumBits = 64; //各累计位 pixelDesc.cAccumRedBits = 16; pixelDesc.cAccumGreenBits = 16; pixelDesc.cAccumBlueBits = 16; pixelDesc.cAccumAlphaBits = 0; pixelDesc.cDepthBits = 32; //32位深度缓存 pixelDesc.cStencilBits = 0; //无模版缓存 pixelDesc.cAuxBuffers = 0; //无辅助缓存 pixelDesc.iLayerType = PFD_MAIN_PLANE; //主层 pixelDesc.bReserved = 0; //保留 pixelDesc.dwLayerMask = 0; pixelDesc.dwVisibleMask = 0; pixelDesc.dwDamageMask = 0; |
这是初始化工作的主要内容,对描述像素存储格式的PIXELFORMATDESCRIPTOR结构变量进行了填充,剩下的工作主要是通过调用ChoosePixelFormat()和SetPixelFormat()函数以返回并设置最佳匹配的像素格式。最后在绘制自由型曲线曲面之前用wglCreateContext()创建一个渲染上下文RC并将其作为参数通过wglMakeCurrent()来建立一个当前的绘图描述表,并在绘制完毕后将其释放:
//设置一个线程的当前绘图描述表 wglMakeCurrent(hDC,m_hGLContext); //对自由型曲线曲面的绘制 DoNURBS(); //释放绘图描述表 wglMakeCurrent(hDC,NULL); //释放RC(一般在WM_DESTORY消息响应函数OnDestory()中进行) wglDeleteContext(m_hGLContext); |
至此,一个基于OpenGL的基本程序框架构造完毕,具体对自由型曲线曲面的构造工作在DoNURBS()中完成。