侯冬曼, 陈武喝, 马佳洪
(华南理工大学 物理与光电学院, 广州 510641)
随着计算机技术的发展,多媒体技术在教学中发挥着越来越重要的作用[1-2],不再局限于作为PPT演示[3]、动画展示,虚拟实验室[4-6]应运而生。目前虚拟仿真技术多种多样,各有优势、竞相发展,常用的有flash[7-8]、Java[9]等。近几年,随着3D显示技术的进步,虚拟仿真向着3D显示的方向发展,VRML[10]、Java3D[11]、开放式图形库(Open Graphics Library,OpenGL)[12]等虚拟仿真技术得到了广泛应用。
分光计[13]是基础物理实验教学的常用仪器,它的基本结构是许多光学仪器的基础,既能够培养学生的基本实验技能,又能培养学生应用理论知识解决实际问题的能力。迈克尔逊干涉仪[14-15]设计巧妙,测量极其精密,是近代许多干涉仪的基础。光的干涉和衍射现象提示了光的波动性,而单缝衍射[16]是衍射现象中最基本也是最典型的例子。研究衍射现象及其规律,在理论上和实践上都有重要意义。光的偏振直接有力地证明光是横波,偏振现象已广泛应用于科研和生产实际中,对偏振光的观察和分析,能有效加深对光偏振基本规律的理解[13]。
然而这些实验操作步骤繁杂,或操作的现象只能操作者一人看到,或仪器多杂难辨,不便于实验讲解。因此,在编程软件Visual C++框架下,采用OpenGL编程制作了虚拟三维模型,拓展了实验教学方式,开辟了一条探索物理类虚拟仿真实验项目的新途径。
OpenGL是一个跨编程语言、跨平台的专业的图形程序接口,是高性能三维图形编程和交互式视景处理标准,包括核心函数库、实用函数库、辅助函数库等,有250个函数。这些函数具有以下8个方面功能:几何建模、几何变换、颜色设置、光照和材质设置、纹理映射、位图显示和图像增强、双缓存以及交互选择。通过几何建模和几何变换可以构建复杂的三维场景;通过颜色设置、光照和材质设置、纹理映射、位图显示和图像增强可以模拟接近真实世界的视觉效果;通过几何变换、双缓存可以实现实时、流畅的动画效果;通过交互选择可以实现交互操作。
OpenGL只是一个图形接口,需要在一定的开发环境中使用,采用编程环境是Visual C++。C++是一门面向对象的语言,具有语言简练、灵活高效、易于移植的特点。Visual C++提供了MFC类库,扩展了C++类层次结构,使开发Windows应用程序更加方便;一般性的界面由Visual C++自己生成,用户只需要添加自己要实现的功能。
OpenGL的绘图方式和Windows的绘图方式是不同的,Windows采用的是图形设备接口(Graphic Device Interface,GDI)绘图,而OpenGL采用的是渲染描述表(Rendering Context,RC)绘图,而且使用特殊像素格式。因此,在Visual C++环境下开发OpenGL应用程序必须为OpenGL创建渲染描述表并设置适合OpenGL的像素格式。
基于OpenGL,本文构建了分光计、迈克尔逊干涉、光的衍射和偏振等三维模型,和实物仪器一样,各个部件可以通过鼠标操作,操作结果及实验现象实时显示,可以进行相应的虚拟测量,结果符合物理规律。
虚拟仪器不但模型和实物仪器一致,而且各个部件跟实物仪器一样可调。在建模时,已经将实现调节的几何变换函数(如glTranslatef、glRotatef)的参数设置为变量,通过调节这些变量,就可以实现仪器的调节。
以分光计为例,要实现平行光管的调节,将鼠标移动到其调节横向(或纵向)调节螺丝上,通过滚动鼠标滚轮,可以改变横向(或纵向)倾斜度变量的数值,程序会实时重新绘制模型,显示调节效果,其部分代码如下:
void CRenderView::Lightpipe(GLenum RenderMode)
{
glPushMatrix ();
…
//平行光管同轴旋转
glTranslatef (0.0, 0.0, 48.0);
glRotatef (m_Rlightpipe4, 0.0, 1.0, 0.0);
glTranslatef (0.0, 0.0, -48.0);
//平行光管倾度旋转
glTranslatef (0.0, 48.5, 26.0);
glRotatef (m_Rlightpipe3, 1.0, 0.0, 0.0);
glTranslatef (0.0, -48.5, -26.0);
//平行光管
glPushMatrix ();
glPushMatrix ();
…
//平行光管
glTranslatef (0.0, 0.0, -30.0);
glTranslatef (1.5, 6.5, 3.0);
DrawPipe(m_pqobj, 3.0, 4.0, 4.0, 35.0);
//平行光管透镜
glTranslatef (0.0, 0.0, -35.1);
DrawPipe(m_pqobj, 2.9, 4.1, 4.1, 3.0);
…
glPopMatrix ();
…
glPopMatrix ();
…
glPopMatrix ();
}
程序界面除了虚拟仪器模型,一般还包括菜单栏、工具栏、状态栏和观察视场4个部分,分光计和迈克尔逊实验仪器增加了刻度盘读数。以分光计为例进行讲解,虚拟分光计模型如图1所示。菜单栏及其下拉菜单可实现程序的所有操作、设置;工具栏为本程序的常规操作,如取放平面镜、棱镜、光栅等;状态栏显示当下的操作说明。仪器模型可以从不同角度观察并调节,目镜视场实时显示分光计目镜中看到的视场,游标盘读数可直接从界面上读出。
图1 虚拟分光计程序界面
虚拟实验仪器操作非常简单,实验操作约定:将鼠标移动到可操作部件上,调节滚轮就可以对该部件进行调节(包括仪器的开启和关闭)。鼠标点击空白位置,调节滚轮即对整个虚拟实验仪器进行左右旋转操作。按住鼠标左键拖动,即对整个实验装置进行旋转操作。
利用OpenGL构建了动态可调的三维模型,同时采用Windows的GDI画图模拟实验的现象。可实现的功能包括但不仅仅包括分光计的调节、折射、衍射实验,迈克尔逊干涉,单缝衍射和偏振光等。实验现象会根据仪器的调节实时显示,基本实现物理实验教学中的所有功能。
2.3.1 分光计
在虚拟分光计上可以进行目镜调节、望远镜调节、平行光管调节以及各半调节等。以各半调节为例进行讲解。
各半调节:放上平面镜,找到绿十字;开始时,绿十字一般不在水平准线的位置[见图2(a)]。经各半调节后,不管平行镜的哪一面正对望远镜筒,绿十字都在上水平准线的高度[见图2(b)]。
(a)
(b)
三棱镜折射实验。三棱镜折射现象是根据折射公式实时计算的,折射条纹的偏转角度会根据三棱镜位置的调节而改变,因此可以在虚拟分光计上运用最小偏向角法测棱镜折射率,如图3所示。
光栅衍射实验。衍射现象也是根据衍射公式实时计算的,衍射条纹的偏转角度会根据光栅位置的调节而改变,也可以利用最小偏向角法或者垂直光栅法进行相关的测量,如图4所示。
图3 三棱镜折射实验
图4 光栅衍射实验
2.3.2 迈克尔逊干涉仪
迈克尔逊干涉仪结构复杂,主要由光源、分光板、补偿板、反光镜、调节拉杆螺丝、大转轮和微调转轮等部分构成,如图5所示。光源包括钠光、氦氖激光和白光,可模拟等倾干涉条纹、等厚干射条纹等。
图5 迈克尔逊干涉仪外观
等倾干涉条纹的调整。调节反射镜M2背后的倾斜度调节螺丝,使出现干涉条纹[见图6(a)]。然后通过反复调节水平、垂直拉杆螺丝,把等厚干涉条纹调节成等倾干涉条纹,如图6(b)所示。最后,为了获得稀疏等倾干涉条纹,需要调节大转轮、微调转轮使干涉条件变稀疏,如图6(c)所示。
白光等厚干涉条纹的调整。将光源换成白光,调节水平(垂直)拉杆螺丝,使等倾干涉条纹变成弧形,如图7(a)所示。然后调节反射镜M1的位置,使干涉条纹变成直线形的等厚干涉条纹,如图7(b)所示。
(a)
(b)
(c)
(a)
(b)
2.3.3 虚拟单缝衍射实验
虚拟单缝衍射实验较为简单,可模拟菲涅尔衍射实验及测量其光强分布。通过调节狭缝上方的旋钮B使狭缝大小合适,在显示板上观察到菲涅尔衍射现象,如图8所示。再选择工具中的“测量”即可对光强分布进行测量。
图8 菲涅尔衍射实验程序界面
2.3.4 偏振光模拟实验
偏振光模拟实验界面简单,操作便捷,可模拟线偏振光、圆偏振光以及椭圆偏振光的实验现象和操作。图9为圆偏振光的实验现象,并显示出了波形。
图9 圆偏振光实验
在Visual C++框架下,基于OpenGL设计了虚拟分光计、迈克尔逊干涉仪、单缝衍射和光的偏振等仪器的三维模型,模拟了仪器的各种操作和调节步骤,实时显示虚拟操作的实验现象和测量结果,基本可满足物理实验教学中的所有功能。这些三维模型可以作为实验课件用于实验讲解,也可以作为预习或者复习工具提供给学生,以提高学生的学习兴趣和学习热情。
实践证明:OpenGL是虚拟仿真仪器制作的有力工具,既可以模拟相对复杂的分光计,也可以用于制作其它物理类虚拟仪器;虚拟仪器对物理实验教学有很大的促进作用,而且有助于缓解高校实验资源短缺和日益紧张的空间资源。一言以蔽之,虚拟仿真仪器应该进行推广,以推进实验教学改革,提高教学质量和效率。
当然,虚拟分光计还存在一些不足,比如仪器的界面还不够逼真,无法网络应用。下一步工作还需不断改进加强,制作更多更好的虚拟物理实验仪器。