+ All Categories
Home > Documents > 基于MFC与OpenGL的光学非球面仿真 · MFC是Microsoft Foundation Classes的简...

基于MFC与OpenGL的光学非球面仿真 · MFC是Microsoft Foundation Classes的简...

Date post: 16-Apr-2020
Category:
Upload: others
View: 3 times
Download: 0 times
Share this document with a friend
4
《机电技术》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] 2 3 3 2 2 ( ) L 1 1 (1 ) n n cx zx a x a x kcx = + + + + + (1) 式中, x 为离非球面轴的径向距离; z 为相应 的垂直距离;c 为顶点曲率 c=1/R 0 R 0 为顶点曲 率半径;k 为二次常数;a n 为多项式系数。设 e 为偏心率, a n =0k=-e 2 ,变换式(1)可得到式(2)。 式(2)为二次曲线方程,根据 e 的不同取值可生成 不同的二次曲线。 2 2 2 0 2 (1 ) x Rz e z = (2) 二次曲线也可从圆锥体上用平面截取,因此 又称为圆锥曲线。如图 1, α 为圆锥半顶角;L 圆锥顶点到截点的距离; φ 为截面与圆锥轴线的 夹角。R 0 e Lαφ 的关系: 图 1 圆锥截取二次曲线 *基金资助:福建省科技重大专项/专题资助(2006HZ0002-4);厦门市科技计划项目资助(3502Z20083010)。
Transcript
Page 1: 基于MFC与OpenGL的光学非球面仿真 · MFC是Microsoft Foundation Classes的简 称,它是VC++中直接由Microsoft提供的类库,封 装了大部分重要的数据结构以及API函数调用。配

《机电技术》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)。

Page 2: 基于MFC与OpenGL的光学非球面仿真 · MFC是Microsoft Foundation Classes的简 称,它是VC++中直接由Microsoft提供的类库,封 装了大部分重要的数据结构以及API函数调用。配

计算机技术应用 《机电技术》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()函数标注坐标刻度、原

点。

Page 3: 基于MFC与OpenGL的光学非球面仿真 · MFC是Microsoft Foundation Classes的简 称,它是VC++中直接由Microsoft提供的类库,封 装了大部分重要的数据结构以及API函数调用。配

《机电技术》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、

Page 4: 基于MFC与OpenGL的光学非球面仿真 · MFC是Microsoft Foundation Classes的简 称,它是VC++中直接由Microsoft提供的类库,封 装了大部分重要的数据结构以及API函数调用。配

计算机技术应用 《机电技术》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 年-),男,工学博士,教授,研究方向:精密超精密加工,光机电一体化,数控技术。


Recommended