《机电技术》2009 年第 4 期 计算机技术应用
8
基于 MFC 与 OpenGL 的光学非球面仿真*
张世汉 郭隐彪 王 哲
(厦门大学机电工程系,福建 厦门 361005)
摘 要:本文研究了基于 MFC 和 OpenGL 的光学非球面仿真平台的设计方法,给出了 MFC 下对话框控件中绘制二维
图形和 OpenGL 绘制三维图形的一般方法和步骤,实现了对轴对称非球面、非轴对称非球面的仿真以及非球面测量数据
的读取与显示。
关键词:光学非球面 MFC OpenGL
中图分类号:TH126.2 TP391.9 文献标识码:A 文章编号:1672-4801(2009)04-008-04
引言
由于非球面在简化光电信息采集系统的结构
和减小系统的尺寸和重量等方面有显著的作用,
因此非球面系统在军用和民用光电仪器中得到越
来越广泛的应用[1]。在光电系统中常用的非球面
主要有:轴对称非球面、非轴对称非球面、复曲
面、柱面等。轴对称非球面光学元件可以获得球
面光学元件无可比拟的良好的成像质量,可提高
光电系统的鉴别能力,在军用和民用光电产品中
应用广泛,是光电系统中的重要零件;非轴对称
非球面光学元件可以克服光学系统中的各种象
差,广泛用在导弹跟踪扫描、雕刻机、激光打印
机等精密设备中。本文针对这两种非球面设计仿
真软件,为直观反映非球面的形貌、检验测量数
据正确性提供一个有效的工具。
MFC是Microsoft Foundation Classes的简
称,它是VC++中直接由Microsoft提供的类库,封
装了大部分重要的数据结构以及API函数调用。配
合以VC++提供的AppWizard可以创建应用程序框
架,使用ClassWizard建立应用程序类、数据处理、
消息处理函数或定义控件的属性、事件、方法。
GDI是Graphics Device Interface的简称,含义
是图形设备接口,它的主要任务是负责系统与绘
图程序之间的信息交换,处理所有Windows程序的
图形输出。
OpenGL是一个开放的三维图形软件包,它独
立于窗口系统和操作系统。以OpenGL为基础开发
的应用程序可以十分方便地在各种平台间移植。
OpenGL可以与Visual C++紧密接口,实现复杂曲
线曲面建模和三维图形变换。
本文提出基于MFC和OpenGL的光学非球面仿
真系统,该系统利用MFC中对话框控件配合GDI绘
图函数实现二维图形的绘制,利用OpenGL实现了
三维曲面的仿真以及测量数据的读取和显示。
1 非球面方程及参数
光学系统中常用具有近轴区的轴对称非球面
表面,在该表面中心点是连续的,该点的切线垂
直于它的轴线。式(1)表示轴对称回转非球面的普
遍公式[2]:
23
32 2( ) L
1 1 (1 )n
ncxz x a x a x
k c x= + + +
+ − + (1)
式中,x 为离非球面轴的径向距离;z 为相应
的垂直距离;c 为顶点曲率 c=1/R0,R0 为顶点曲
率半径;k 为二次常数;an 为多项式系数。设 e为偏心率,an=0,k=-e2,变换式(1)可得到式(2)。
式(2)为二次曲线方程,根据 e 的不同取值可生成
不同的二次曲线。
2 2 202 (1 )x R z e z= − − (2)
二次曲线也可从圆锥体上用平面截取,因此
又称为圆锥曲线。如图 1,α为圆锥半顶角;L 为
圆锥顶点到截点的距离;φ 为截面与圆锥轴线的
夹角。R0、e 与 L、α、φ 的关系:
图 1 圆锥截取二次曲线
*基金资助:福建省科技重大专项/专题资助(2006HZ0002-4);厦门市科技计划项目资助(3502Z20083010)。
计算机技术应用 《机电技术》2009 年第 4 期
9
0 sin tan sin (cot cot )coscos seccos
R L
e
ϕ α α α ϕϕϕ αα
= +⎧⎪⎨
= =⎪⎩
(3)
由式(3)可知,只要知道圆锥截取参数 L、α、φ 就可以计算出 R0、e,再利用式(2)就可以得到
给定的二次曲线方程。 非轴对称非球面镜则具有两个对称面,其通
用方程如下: 2
2 2
2 2( , )
1 1 (1 )s
x x
s
C zy x z R R x
k C z= − + + +
+ − + (4)
式中:Rs=-Rz+Ax2+Bx4
+Cx6+Dx8
+Ex10+Fx12
;
Cs=1/Rs;Rx为非球面主轴基础半径;Rz 为非球面
副轴基础半径;Rs 为非球面副轴半径;A,B,C,D,E,F为非球面副轴系数;k 为非球面系数。
综上,轴对称非球面由于具有回转特性,可
用其子午截面图描述。因此采用 VC++的绘图函数
进行图形绘制,只需对式(1)(2)(3)所描述的二次
曲线进行采样连接,就可绘制出子午截面图像。
而非轴对称非球面由于不具有回转特性,则需采
用 OpenGL 描绘其三维图形。
2 图形显示编程框架
2.1 MFC下运行OpenGL
VC++与 OpenGL 图形显示程序框架的建立步
骤如下:
(1)利用 MFC AppWizard[exe]新建一个单文
档应用程序,命名为 Aspheric,将其基类改为
CFormView。在 CMainFrame 中声明一个提供创建
分 区 窗 口 功 能 的 CSplitterWnd 类 对 象
m_wndSplitter , 编 写 CMainFrame 中 的
OnCreateClient 事件处理程序,先创建为一行两
列的面板,再为它们指定各自的视图区,分别作
为数据输入区和图形显示区[3]。
(2)新建用于数据输入的对话框,为其创建一
个新的类 CInput,基类设为 CFormView。根据式
(4)的未知参数,插入和编辑所需的静态文本控件
和编辑框控件,然后通过 ClassWizard 添加编辑
框控件对应的成员变量。
(3)建立用于显示三维图形 CRenderView 类,
加入 OpenGL 链接库,对 OpenGL 进行必要的初始
化设置,如:修改窗口风格、设置像素格式与创建
渲染场境等;同时添加在释放窗口之前清除渲染
场境的函数;添加 WM_SIZE 消息的映射函数
OnSize(),加入处理视图尺寸变化的代码[4]。完
成以上工作后,就可以对函数 OnPaint()进行编
写,添加 OpenGL 绘图代码,处理屏幕显示。
(4)打开“添加窗口消息句柄”,选择鼠标
左、右键、滚轮对应的响应事件,编写图形绘制
区的鼠标事件处理程序,实现鼠标对图像的拖曳、
旋转、缩放功能。
2.2 VC++对话框绘图程序框架
VC++对话框绘图程序框架的建立步骤如下:
(1)在 Aspheric 工程中新建一个对话框类
Cdrawzdc。根据式(1)(2)(3),添加三个组框控件,
每个组框控件对应一组参数输入,添加相应的静
态文本控件和编辑框控件用于标识和数据输入。
修改各编辑框控件 ID,并在 ClassWizard 中添加
其对应的成员变量。在每个组框控件前放置一个
单选按钮控件,同时选中它们并将属性中“组”
选项勾起,利用 ClassWizard 添加单选按钮控件
成员变量 m_lx,并在 OnInitDialog()函数中初始
化单选按钮控件选中情况。添加一个图像控件,
将其拉伸至适当大小,ID 改为 IDC_Pic,勾起“样
式”栏中的“通知”选项,使控件可以接受外部
消息,该图像控件用于二维图形的显示。
(2)修改 OnPaint()函数,利用 GetDlgItem()
获取 IDC_Pic 的控件指针,进而用 GetDC()获取
控件 DC,用 GetClientRect()获取图形控件矩形
区 域 作 为 绘 图 区 。 然 后 设 置 绘 图 模 式 为
MM_ISOTROPIC,设置好视口、窗口尺寸及视口原
点、窗口原点。
(3)为三个单选按钮添加对应的成员函数,利
用 EnableWindow()函数实现点击单选按钮激活
对应组框内控件的功能,同时赋予变量 m_lx 对应
值。为对话框添加一个按钮控件,为其添加一个
成员函数 OnDrawZDC(),该函数自动判断 m_lx 的
值从而调用不同的函数实现对应组框内数据的读
取、计算和图形显示。
3 非球面仿真程序设计
3.1 轴对称非球面仿真
(1)建立直角坐标系
在 Cdrawzdc 类的 OnPaint()函数中添加代
码,获取控件 IDC_Pic 的矩形绘图区域,设置绘
图模式,视口、窗口属性等。新建实线画刷,利
用MoveTo()及 LineTo()函数绘制网格背景及X-Y
坐标轴,利用 TextOut()函数标注坐标刻度、原
点。
《机电技术》2009 年第 4 期 计算机技术应用
10
(2)曲线点采样
曲线采样点坐标(xi, yi)可用二维结构体数
组存储,定义名为 Point 的结构体,内含两个浮
点型变量 x,y。声明 Point 的两个数组变量 p1[M]
和 p2[M],分别用于存储 0>x 和 0<x 时的采样
点坐标。以式(1)为例,当 0>x 时,令 p1[i].x=i,
由式(1)分别循环计算第 i 个采样点对应的
p1[i].y 的值,即获得所需采样点坐标(p1[i].x,
p1[i].y)。当 0<x 时,可采用同样的方法得到
第 j 个采样点坐标(p2[j].x,p2[j].y)。
(3)曲线绘制
曲线的绘制比较简单,利用 MoveTo()和
LineTo()函数将获得的采样点坐标依次连接起来
即得到所需的曲线。如图 2 所示,在面板左边输
入高次非球面参数值,点击“绘图”按钮,即可
在右边的图形控件得到曲线图像。式(2)和(3)的
曲线点的采样及图像绘制原理类似,不再赘述。
图 2 轴对称非球面仿真
图 3 非轴对称非球面仿真
3.2 非轴对称非球面造型
(1)曲面点采样
三维曲面采样点坐标(xi, yi, zi)可用三维结
构体数组存储,定义名为 Points 的结构体,内含
三个浮点型变量 x, y, z。以第一卦限为例,声
明 Points 的一个数组变量 pt[M][N],用于存储
采样点坐标。由公式(4) 利用双重 for 循环,计
算 当 pt[i][j].x=i, pt[i][j].y=j 时
pt[i][j].z 的值,得到采样点坐标(pt[i][j].x,
pt[i][j].y, pt[i][j].z)。同样,曲面在其他卦
限的采样点可以通过重复上面的方法得到。
(2)绘制三维网格
绘图的时候,用线段连接相邻两点,形成网
格模式,这种方式图像直观,立体感强。OpenGL
中有关图形绘制的程序均置于 glBegin()及
glEnd()函数对中,在该函数对中可以设定线形、
线宽、颜色等参数。glVertex3f()函数用来连接
两个三维点,设变量 step 为网格 小边距,利用
双重 for 循环将点:(pt[i][j].x, pt[i][j].y,
pt[i][j].z),(pt[i+step][j].x,pt[i+step][j]
.y,pt[i+step][j].z),pt[i+step][j+step].x,
pt[i+step][j+step].y,pt[i+step][j+step].z)
,(pt[i][j+step].x,pt[i][j+step].y,pt[i][j+
step].z)依次用线段两两连接,从而得到第一卦
限的网格曲面。同理,读取其它卦限的采样点坐
标值,采用同样的方法,可以画出整个三维曲面
的网格视图。
(3)建立空间直角坐标系
空间直角坐标系的绘制比较简单,坐标轴采
用直线绘制,箭头用小三角形表示。非轴对称非
球面的仿真如图 3 所示。
3.3 非球面测量数据显示
高精度非球面测量仪测得的坐标数据可保存
为文本格式,每行对应一个测量点坐标(xi, yi,
zi),xi,、yi、zi间用空格隔开。为了读取测量点
坐标文件,需要利用文件选择对话框。构造
CfileDialog 类的一个对象 fileDlg,设定其为打
开对话框,默认的文件扩展名为 txt,指明可供
选择的文件类型和相应的扩展名;建立一个存
储数据的指针数组*pBuffer,将读取的坐标数
据存入该缓冲区,并用 SetWindowText()函数
显示在数据输入区的对应文本框控件中;构造
CstdioFile 类的一个对象 file1,用 ReadString()函数
逐行读取坐标数据,获得数据的行数 LineNum,
以确定储存数据的动态数组的大小;定义存放
坐标数据的动态数组 pOriginX、pOriginY、
计算机技术应用 《机电技术》2009 年第 4 期
11
pOriginZ,并对数组清零;利用 ReadString()
和 sscanf()函数按行将坐标数据依照空格进
行分割并循环存储至动态数组中。 后在
OpenGL 中将测量点集用点阵的方式显示出来。图
4 是利用高精度非球面测量仪测得的条形光滑非
球面的测量数据仿真图,可通过放大、平移、旋
转观察所测非球面面形。
图 4 条形光滑非球面
3.4 软件界面设计
本文利用MFC和OpenGL建立的非球面仿真平
台界面如图 5 所示。界面左边为数据输入区,从
上至下依次为轴对称非球面参数、非轴对称非球
面参数及外部坐标数据输入。右边为三维图形显
示区,它和弹出的对话框绘图区一起,实现了对
非球面的仿真和外部坐标数据的读取和显示。
4 总结
本文对基于MFC和OpenGL的非球面仿真平台进
行了研究和探讨,总结归纳出了实现的一般方法
图 5 非球面仿真平台界面
和步骤,详细研究了 MFC 和 OpenGL 在曲线、曲
面绘制方面的功能。目前本平台可以实现对各种
方程描述的光学非球面的仿真,以及高精度非球
面测量仪测量数据的三维显示。鉴于 VC++良好
的接口特性以及 OpenGL 强大的图形显示功能,
该平台可以方便的整合到非球面加工软件系统之
中,发挥更大的作用。
参考文献:
[1] 辛企明.光学塑料非球面制造技术[M].北京:国防工业出版社,2005.
[2] 潘君骅.光学非球面的设计、加工与检验[M].苏州:苏州大学出版社,2004.
[3] 费广正,乔林.Visual C++ 6.0 高级编程技术.OpenGL 篇[M].北京:中国铁道出版社,2000.
[4] 王清辉,王彪.Visual C++ CAD 应用程序开发技术[M].北京:机械工业出版社,2003.
[5] 程飞.VC++与高等数学整合一例[J].安徽教育学院学报.2005,23(6):59-63.
[6] 孙鑫,余安萍. VC++深入详解[M].北京:电子工业出版社,2006.
作者简介:张世汉(1986 年-),男,硕士研究生,主要研究方向:超精密加工与检测技术。
通讯作者:郭隐彪(1962 年-),男,工学博士,教授,研究方向:精密超精密加工,光机电一体化,数控技术。