第 18 卷 第 5 期 武 汉 科 技 学 院 学 报 Vol.18 No.5
2005 年 05 月 JOURNAL OF WUHAN UNIVERSITY OF SCIENCE AND ENGINEERING May. 2005
基于 VC 和 OpenGL 的三维图形的开发
陈家凤 1,2,陈 越 2
(1 中南民族大学 电子信息
工程
路基工程安全技术交底工程项目施工成本控制工程量增项单年度零星工程技术标正投影法基本原理
学院,湖北 武汉 430074;2 华中科技大学 光电子工程系,湖北 武汉 430074)
摘要:介绍了利用 VC++6.0和 OpenGL进行三维图形开发的基本步骤、方法。并以红外成像系统所产生的光
斑图像为原始数据,详细介绍了如何利用 OpenGL强大的图形、图像及动画处理功能,开发出成像系统焦平
面上的光斑图像的三维能量分布图,并绘制出任意方向的截面图。开发过程中利用图像采集卡采集的每个点
的行、列和光强(灰度)作为三维图形的 x,y,z坐标,采用绘制网格图的形式绘制三维图形。实验结果
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
明:
利用 VC++6.0和 OpenGL作为开发工具来进行三维图形的开发非常方便,有效。
关键词:光斑;VC++6.0;OpenGL;三维图形
中图分类号:TP302.4 文献标识码:A 文章编号:1009-5160(2005)-0049-03
Visual C++ 6.0 是 Visual Studio 中功能最为强大、代码效率最高的开发工具。Visual C++ 6.0 为程序开发者提供的
ClassWizard 与 AppWizard 可使编程工作变得轻松愉快。OpenGL[1]是处理专用图形硬件的软件接口,可以独立于具体的硬件
系统和操作系统,是支持可视化实现的语言。OpenGL 由几百个指令或函数组成。对于 OpenGL 的实现者而言,OpenGL 是影
响图形硬件操作的指令集合。OpenGL 的库函数被封装在 Opengl32.dll 动态连接库中。OpenGL 最主要的工作就是将二维及三
维物体描绘至帧缓存。具体地说:OpenGL 的功能如下:绘制三维物体、观看物体、指定颜色模式、光照、增强图像效果、
管理位图和图像、纹理映射、制作动画和实现交互技术。本文利用 OpenGL 强大的图形处理功能绘制焦平面上的成像光斑的
三维能量分布图及任意方向的截面图。
1 建立 VC 与 OpenGL 的应用接口及 OpenGL 极小化
在利用 OpenGL 开发工具编制应用程序之前,首先应进行 OpenGL 的头文件与函数库文件的包含[2],即在 Workspace
Windows 中单击 File 文件标签,打开 Source Files,双击 StepinGLView.h 以打开此文件。在文件首部添加头文件:
# include “gl\gl.h”
# include “gl\glu.h”
然后打开菜单 Project\Settings,在弹出的对话框中选择 Link 标签,在 Object\Libaray Modules 栏中增加 OpenGL32.lib 及
glu32.lib 两个文件。接下来再极小化 OpenGL:
第一步:设置像素
格式
pdf格式笔记格式下载页码格式下载公文格式下载简报格式下载
和管理着色描述表
(1)设置像素格式。无论进入 OpenGL 的是何种数据,OpenGL 最终都将进行像素操作,即把像素写到帧存上去,因此
必须设置像素的属性。每一个 OpenGL 显示设备都支持特定数目的像素格式。一个指定的像素格式必须通过
PIXELFORMATDESCRIPTOR 结构得到描述。像素格式的设置是通过成员函数 bSetupPixelFormat()来实现的。
(2)创建着色描述表。任何一个 Windows 程序都必须处理设备描述表,它告诉 Windows 怎样在一个窗口中显示图形信
息。同样,OpenGL 应用程序也必须应用 DC(称为着色描述表(RC))。着色描述表保存了与系统发生联系的重要信息。一
个应用程序必须有一个着色描述表。对着色描述表的创建可通过函数 Init()来实现。
(3)删除着色描述表。最后,当关闭应用程序时,调用视窗类消息函数 OnDestroy()来删除着色描述表及绑定上该着色
描述表的设备描述表。
收稿日期:2005-03-03
作者简介:陈家凤(1968-),女,讲师,研究方向:图形绘制
武 汉 科 技 学 院 学 报 2005 年
50
(4)设定 OpenGL 风格。OpenGL 有自己的像素格式,只有 OpenGL 的客户区才能接受 OpenGL 绘制,因此,一般应有
这两个风格设置。通过成员函数 PreCreateWindow()来实现。
BOOL CGraphicsView::PreCreateWindow(CREATESTRUCT& cs)
{ // TODO: Add your specialized code here and/or call the base class
cs.style|=WS_CLIPCHILDREN|WS_CLIPSIBLINGS;
return CScrollView::PreCreateWindow(cs);
}
第二步:建立 OpenGL 视点
这部分的作用主要是获得客户区的大小、清除深度缓存、启动深度测试及启动 OpenGL 模型变换;建立视点、启动透视
变换及建立透视体。
2 三维图形的绘制及着色
这里以红外面阵 CCD为接收器,以无穷远点光源通过被测系统后,
利用三维能量分布图分析其焦面上成像光斑的能量分布情况。三维能
量分布图是利用 OpenGL 开发工具进行三维图形的开发[3] [4]。主要过程
是利用图像采集卡采集的每个点的行、列和光强(灰度)作为三维图
形的 x,y,z 坐标,采用绘制网格图的形式绘制三维图形。
绘制网格图的过程是采用绘制四边形片来实现的,它是一系列四
边形片连接起来的图形。具体做法是在 glBegin(GL_QUAD_STRIP) /
glEnd()函数对中,前四个顶点决定了第一个四边形,然后每增加两个
顶点便增加一个四边形。当然,四边形片的顶点的顺序也是十分重要
的。表 1 中列出了四边形片中每个四边形的顶点。而实际的顶点标识
顺序如图 1 所示。
在绘制三维图形的过程中采用了调用显示列表的方法。在本软件
中,由于要从不同的角度观察其能量分布情况即要求三维图能转动,
而且还要求绘制其任意方向的截面图,所以,数据量比较大。显示列
表是经过编译的,因而执行效率比较高。而且,显示列表可以在任何地方被调用,并按顺序立即执行。同时为了增强图形效
果,采用对不同的灰度等级进行着色的办法来实现对三维图形的着色。
3 三维图形的消隐
计算机绘制物体时,必须把三维信息经过某种变换,在二维显示表面上绘制出来。由于投影变换失去深度信息,往往导
致图形的二义性。要消除二义性,就必须在绘制时消除实际不可见的线和面,这一过程称为消隐。在本软件中,我们采用了
一般消隐法进行消隐。这种方法是首先设置消隐使能,初始化深度缓存,设置消隐比较,然后直接进行绘图即可。具体方法
如下: glEnable(GL_DEPTH_TEST); //设置消隐使能
glClearDepth(1.0); //设置初始化深度缓存
glClear(GL_DEPTH_BUFFER_BIT); //清除深度缓存
glDepthFunc(GL_LESS); //确定测试条件
glDisable(GL_DEPTH_TEST); //关闭深度测试
完成上述设置后,即可开始绘图,消隐能正常显示。
4 三维图形的动画制作
OpenGL 是用双缓存技术来实现动画的。在双缓存模式下,位平面被分成前台位平面和后台位平面。只有前台位平面被
显示,因为绘制函数所绘制的场景首先被写向后台位平面。在画任何物体之前,必须把帧存设置成正确的组态。当完整的画
面在后台视频缓存中画出以后,就调用 SwapBuffers()函数,使其成为可见视频缓存。具体实施如下:
首先必须在像素格式设置 bSetupPixelFormat()函数中的结构体内设置:
表 1 四边形片中的顶点顺序
四边形 四边形顶点
1 顶点 1,顶点 2,顶点 3,顶点 4
2 顶点 3,顶点 4,顶点 5,顶点 6
3 顶点 5,顶点 6,顶点 7,顶点 8
4 顶点 7,顶点 8,顶点 9,顶点 10
5 顶点 9,顶点 10,顶点 11,顶点 12
图 1 定义四边形片
1 3 9
5 7
2 4 6
8
10
第 5 期 陈家凤,等:基于 VC 和 OpenGL 的三维图形的开发
51
PFD_DRAW_TO_WINDOW|
PFD_SUPPORT_OPENGL|
PFD_DOUBLEBUFFER,
PFD_TYPE_RGBA,
再定义变量并初始化:
Glfloat m_rotateX=-60.0f;
Glfloat m_rotateY=0.0f;
Glfloat m_rotateZ=60.0f;
BOOL m_play;
变量 m_rotateX,m_rotateY,m_rotateZ 分别说明三维图形绕 x, y, z 轴旋转的角度。m_play 控制动画的播放,其值通过鼠
标双击来控制。在 Windows 环境下进行三维动画
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
时,需要使用定时器。Windows 提供的 SetTimer()函数为应用程序分配
一个定时器。通过该函数的参数可以设置时间间隔,Windows 将用这个时间间隔值周期性地向程序发送 WM_TIMER 消息。
当不再使用定时器后,可用 KillTimer()函数取消定时器。然后在三维图形绘制函数中写入旋转函数。代码如下:
glRotatef(m_rotateX,1.0f,0.0f,0.0f);//沿 X 轴旋转 m_rotateX 个角度;
glRotatef(m_rotateY,0.0f,1.0f,0.0f);//沿 Y 轴旋转 m_rotateY 个角度;
glRotatef(m_rotateZ,0.0f,0.0f,1.0f);//沿 Z 轴旋转 m_rotateZ 个角度;
最后在三维图形绘制函数 DrawScene()中加上语句:
SwapBuffers(wglGetCurrentDC());来交换前后台缓存。
5 应用实例
利用红外成像光斑测试仪所产生的光斑图像,给出了利用 VC++6.0 和 OpenGL 进行三维图形开发的一个应用实例。该测
试仪以 1.064um 的激光光源模拟无穷远的点光源 , 利用红外面阵 CCD 自动寻找测量目标在不同视场角下的最佳像面位置,
并对光学组件的成像光斑进行检测。采用重心法对所采集的光斑信号进行数据处理,分析光源通过被检测系统后在其焦平面
上的成像光斑的质量。即分析焦平面上光斑能量分布情况:以三维立体图及截面图等显示不同测量条件下光斑的形状及能量
分布(见图 2)。
6 结束语
从利用 OpenGL 所绘制的光斑图像的三维能量分布图中可以清楚地分辨出焦点处的能量最集中,图像质量及对称性最
好,并能很方便地进行成像光斑的质量检测。测试结果表明:利用 VC++6.0 和 OpenGL 作为开发工具来进行三维图形的开发
非常方便快捷,是一种切实有效的途径。
参考文献:
[1] 田红鹏,马苗. OpenGL 及其基于 VC++6.0 的开发[J]. 西安科技学院学报, 2001,(12):365-368.
[2] 向世明.·OpenGL 编程与实例[M].北京:电子工业出版社,1999,22-82.
[3] 刘晓峰,诸静. 基于 OpenGL 的等值面绘制软件的开发[J].计算机应用研究,2002,(4):93-99.
[4] 汪日伟, 韩其睿, 吴晓青. 如何 MFC 中利用 OpenGL 实现三维图形的绘制[J]. 天津工业大学学报,2004,(6):65-68.
图 2 光斑图像、三维能量分布图及截面图