工具软件   办公软件   操作系统   网络安全   设计在线   程序开发   教程宝典   软件下载   软件论坛
您的位置:软件 > 开发者网络 > 开发工具 > 开发专栏 > VC > 正文
VC下利用OpenGL构造自由型曲线曲面
[文章信息]
作者:中国电波传播研究所郎锐
时间:2005-02-18
出处:天极网
责任编辑:方舟
[文章导读]
本文介绍了OpenGL在三维物体建模中的应用,并在VC++下通过该技术实现了对自由型曲线曲面的模型搭建
advertisement
热点推荐
· 黑客破解口令常用的三种方法
· 局域网管理软件DameWare NT Utilities
· 解析KJava在移动设备开发中的应用
· Excel图表类型的修改技巧
· Windows文件夹图标随意变
[正文]

1 2  下一页

  摘要:本文介绍了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()中完成。


1 2  下一页

天极社区邀请您:写博客日记  上传相片   论坛聊天  订阅电子杂志  推荐网摘   免费图铃工具
笔名:   请您注意:

 遵守国家有关法律、法规,尊重网上道德,承担一切因您的行为而直接或间接引起的法律责任。

 天极网拥有管理笔名和留言的一切权利。
评论:
 
发表评论推荐给朋友我想参加相关培训打印我对此感兴趣订阅电子杂志
相关内容焦点新闻
  • MFC程序员的WTL指南之高级界面类
  • Visual C++ MFC 中常用宏的含义
  • Visual C++初学者入门的一条捷径
  • Visual C++开发中常见问题的答案
  • MFC程序员的WTL指南之对话框与控件
  • Oracle(中国)和自己较劲:内部治理是关键
  • 从联想并购IBM PC看蛇吞象的五大风险
  • 理论:用沏茶模型鉴定ERP软件的核心功能
  • 张宝全现身回应诉讼:HDV根本不敢告我!
  • 家电商打乱现有梯队 国产手机垄断巨头将出现
  • 04年人均发短信167条 三问短信明日之路
  • 我国牌照“松绑”激发手机厂商扩张冲动
  • 业内认为联电事件是个案 不影响产业转移步伐
  • Advertisement

    天极无线


    奇妙科幻|美好风光|清风车影|漫画卡通|星座生肖|明星写真|动物世界
    老鼠爱大米
    挥着翅膀的女孩
    女人味
    栀子花开
    白月光
    刚刚好
    江南
    快乐崇拜
    亲爱的你怎么不在我身边
    小薇
    2002年的第一场雪
    有多少爱可以重来
    我的地盘
    七里香
    情人
     
    老鼠爱大米 老板电话
    冲动的惩罚 七里香
    我不是黄蓉 女生撒娇
    盛夏的果实 坚持到底
    孤单北半球 眉飞色舞
    挪威的森林 可爱女人
    最浪漫的事 老板电话

    CSEEK搜索