侯冬曼, 陳武喝, 馬佳洪
(華南理工大學 物理與光電學院, 廣州 510641)
隨著計算機技術(shù)的發(fā)展,多媒體技術(shù)在教學中發(fā)揮著越來越重要的作用[1-2],不再局限于作為PPT演示[3]、動畫展示,虛擬實驗室[4-6]應(yīng)運而生。目前虛擬仿真技術(shù)多種多樣,各有優(yōu)勢、競相發(fā)展,常用的有flash[7-8]、Java[9]等。近幾年,隨著3D顯示技術(shù)的進步,虛擬仿真向著3D顯示的方向發(fā)展,VRML[10]、Java3D[11]、開放式圖形庫(Open Graphics Library,OpenGL)[12]等虛擬仿真技術(shù)得到了廣泛應(yīng)用。
分光計[13]是基礎(chǔ)物理實驗教學的常用儀器,它的基本結(jié)構(gòu)是許多光學儀器的基礎(chǔ),既能夠培養(yǎng)學生的基本實驗技能,又能培養(yǎng)學生應(yīng)用理論知識解決實際問題的能力。邁克爾遜干涉儀[14-15]設(shè)計巧妙,測量極其精密,是近代許多干涉儀的基礎(chǔ)。光的干涉和衍射現(xiàn)象提示了光的波動性,而單縫衍射[16]是衍射現(xiàn)象中最基本也是最典型的例子。研究衍射現(xiàn)象及其規(guī)律,在理論上和實踐上都有重要意義。光的偏振直接有力地證明光是橫波,偏振現(xiàn)象已廣泛應(yīng)用于科研和生產(chǎn)實際中,對偏振光的觀察和分析,能有效加深對光偏振基本規(guī)律的理解[13]。
然而這些實驗操作步驟繁雜,或操作的現(xiàn)象只能操作者一人看到,或儀器多雜難辨,不便于實驗講解。因此,在編程軟件Visual C++框架下,采用OpenGL編程制作了虛擬三維模型,拓展了實驗教學方式,開辟了一條探索物理類虛擬仿真實驗項目的新途徑。
OpenGL是一個跨編程語言、跨平臺的專業(yè)的圖形程序接口,是高性能三維圖形編程和交互式視景處理標準,包括核心函數(shù)庫、實用函數(shù)庫、輔助函數(shù)庫等,有250個函數(shù)。這些函數(shù)具有以下8個方面功能:幾何建模、幾何變換、顏色設(shè)置、光照和材質(zhì)設(shè)置、紋理映射、位圖顯示和圖像增強、雙緩存以及交互選擇。通過幾何建模和幾何變換可以構(gòu)建復(fù)雜的三維場景;通過顏色設(shè)置、光照和材質(zhì)設(shè)置、紋理映射、位圖顯示和圖像增強可以模擬接近真實世界的視覺效果;通過幾何變換、雙緩存可以實現(xiàn)實時、流暢的動畫效果;通過交互選擇可以實現(xiàn)交互操作。
OpenGL只是一個圖形接口,需要在一定的開發(fā)環(huán)境中使用,采用編程環(huán)境是Visual C++。C++是一門面向?qū)ο蟮恼Z言,具有語言簡練、靈活高效、易于移植的特點。Visual C++提供了MFC類庫,擴展了C++類層次結(jié)構(gòu),使開發(fā)Windows應(yīng)用程序更加方便;一般性的界面由Visual C++自己生成,用戶只需要添加自己要實現(xiàn)的功能。
OpenGL的繪圖方式和Windows的繪圖方式是不同的,Windows采用的是圖形設(shè)備接口(Graphic Device Interface,GDI)繪圖,而OpenGL采用的是渲染描述表(Rendering Context,RC)繪圖,而且使用特殊像素格式。因此,在Visual C++環(huán)境下開發(fā)OpenGL應(yīng)用程序必須為OpenGL創(chuàng)建渲染描述表并設(shè)置適合OpenGL的像素格式。
基于OpenGL,本文構(gòu)建了分光計、邁克爾遜干涉、光的衍射和偏振等三維模型,和實物儀器一樣,各個部件可以通過鼠標操作,操作結(jié)果及實驗現(xiàn)象實時顯示,可以進行相應(yīng)的虛擬測量,結(jié)果符合物理規(guī)律。
虛擬儀器不但模型和實物儀器一致,而且各個部件跟實物儀器一樣可調(diào)。在建模時,已經(jīng)將實現(xiàn)調(diào)節(jié)的幾何變換函數(shù)(如glTranslatef、glRotatef)的參數(shù)設(shè)置為變量,通過調(diào)節(jié)這些變量,就可以實現(xiàn)儀器的調(diào)節(jié)。
以分光計為例,要實現(xiàn)平行光管的調(diào)節(jié),將鼠標移動到其調(diào)節(jié)橫向(或縱向)調(diào)節(jié)螺絲上,通過滾動鼠標滾輪,可以改變橫向(或縱向)傾斜度變量的數(shù)值,程序會實時重新繪制模型,顯示調(diào)節(jié)效果,其部分代碼如下:
void CRenderView::Lightpipe(GLenum RenderMode)
{
glPushMatrix ();
…
//平行光管同軸旋轉(zhuǎn)
glTranslatef (0.0, 0.0, 48.0);
glRotatef (m_Rlightpipe4, 0.0, 1.0, 0.0);
glTranslatef (0.0, 0.0, -48.0);
//平行光管傾度旋轉(zhuǎn)
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 ();
}
程序界面除了虛擬儀器模型,一般還包括菜單欄、工具欄、狀態(tài)欄和觀察視場4個部分,分光計和邁克爾遜實驗儀器增加了刻度盤讀數(shù)。以分光計為例進行講解,虛擬分光計模型如圖1所示。菜單欄及其下拉菜單可實現(xiàn)程序的所有操作、設(shè)置;工具欄為本程序的常規(guī)操作,如取放平面鏡、棱鏡、光柵等;狀態(tài)欄顯示當下的操作說明。儀器模型可以從不同角度觀察并調(diào)節(jié),目鏡視場實時顯示分光計目鏡中看到的視場,游標盤讀數(shù)可直接從界面上讀出。
圖1 虛擬分光計程序界面
虛擬實驗儀器操作非常簡單,實驗操作約定:將鼠標移動到可操作部件上,調(diào)節(jié)滾輪就可以對該部件進行調(diào)節(jié)(包括儀器的開啟和關(guān)閉)。鼠標點擊空白位置,調(diào)節(jié)滾輪即對整個虛擬實驗儀器進行左右旋轉(zhuǎn)操作。按住鼠標左鍵拖動,即對整個實驗裝置進行旋轉(zhuǎn)操作。
利用OpenGL構(gòu)建了動態(tài)可調(diào)的三維模型,同時采用Windows的GDI畫圖模擬實驗的現(xiàn)象??蓪崿F(xiàn)的功能包括但不僅僅包括分光計的調(diào)節(jié)、折射、衍射實驗,邁克爾遜干涉,單縫衍射和偏振光等。實驗現(xiàn)象會根據(jù)儀器的調(diào)節(jié)實時顯示,基本實現(xiàn)物理實驗教學中的所有功能。
2.3.1 分光計
在虛擬分光計上可以進行目鏡調(diào)節(jié)、望遠鏡調(diào)節(jié)、平行光管調(diào)節(jié)以及各半調(diào)節(jié)等。以各半調(diào)節(jié)為例進行講解。
各半調(diào)節(jié):放上平面鏡,找到綠十字;開始時,綠十字一般不在水平準線的位置[見圖2(a)]。經(jīng)各半調(diào)節(jié)后,不管平行鏡的哪一面正對望遠鏡筒,綠十字都在上水平準線的高度[見圖2(b)]。
(a)
(b)
三棱鏡折射實驗。三棱鏡折射現(xiàn)象是根據(jù)折射公式實時計算的,折射條紋的偏轉(zhuǎn)角度會根據(jù)三棱鏡位置的調(diào)節(jié)而改變,因此可以在虛擬分光計上運用最小偏向角法測棱鏡折射率,如圖3所示。
光柵衍射實驗。衍射現(xiàn)象也是根據(jù)衍射公式實時計算的,衍射條紋的偏轉(zhuǎn)角度會根據(jù)光柵位置的調(diào)節(jié)而改變,也可以利用最小偏向角法或者垂直光柵法進行相關(guān)的測量,如圖4所示。
圖3 三棱鏡折射實驗
圖4 光柵衍射實驗
2.3.2 邁克爾遜干涉儀
邁克爾遜干涉儀結(jié)構(gòu)復(fù)雜,主要由光源、分光板、補償板、反光鏡、調(diào)節(jié)拉桿螺絲、大轉(zhuǎn)輪和微調(diào)轉(zhuǎn)輪等部分構(gòu)成,如圖5所示。光源包括鈉光、氦氖激光和白光,可模擬等傾干涉條紋、等厚干射條紋等。
圖5 邁克爾遜干涉儀外觀
等傾干涉條紋的調(diào)整。調(diào)節(jié)反射鏡M2背后的傾斜度調(diào)節(jié)螺絲,使出現(xiàn)干涉條紋[見圖6(a)]。然后通過反復(fù)調(diào)節(jié)水平、垂直拉桿螺絲,把等厚干涉條紋調(diào)節(jié)成等傾干涉條紋,如圖6(b)所示。最后,為了獲得稀疏等傾干涉條紋,需要調(diào)節(jié)大轉(zhuǎn)輪、微調(diào)轉(zhuǎn)輪使干涉條件變稀疏,如圖6(c)所示。
白光等厚干涉條紋的調(diào)整。將光源換成白光,調(diào)節(jié)水平(垂直)拉桿螺絲,使等傾干涉條紋變成弧形,如圖7(a)所示。然后調(diào)節(jié)反射鏡M1的位置,使干涉條紋變成直線形的等厚干涉條紋,如圖7(b)所示。
(a)
(b)
(c)
(a)
(b)
2.3.3 虛擬單縫衍射實驗
虛擬單縫衍射實驗較為簡單,可模擬菲涅爾衍射實驗及測量其光強分布。通過調(diào)節(jié)狹縫上方的旋鈕B使狹縫大小合適,在顯示板上觀察到菲涅爾衍射現(xiàn)象,如圖8所示。再選擇工具中的“測量”即可對光強分布進行測量。
圖8 菲涅爾衍射實驗程序界面
2.3.4 偏振光模擬實驗
偏振光模擬實驗界面簡單,操作便捷,可模擬線偏振光、圓偏振光以及橢圓偏振光的實驗現(xiàn)象和操作。圖9為圓偏振光的實驗現(xiàn)象,并顯示出了波形。
圖9 圓偏振光實驗
在Visual C++框架下,基于OpenGL設(shè)計了虛擬分光計、邁克爾遜干涉儀、單縫衍射和光的偏振等儀器的三維模型,模擬了儀器的各種操作和調(diào)節(jié)步驟,實時顯示虛擬操作的實驗現(xiàn)象和測量結(jié)果,基本可滿足物理實驗教學中的所有功能。這些三維模型可以作為實驗課件用于實驗講解,也可以作為預(yù)習或者復(fù)習工具提供給學生,以提高學生的學習興趣和學習熱情。
實踐證明:OpenGL是虛擬仿真儀器制作的有力工具,既可以模擬相對復(fù)雜的分光計,也可以用于制作其它物理類虛擬儀器;虛擬儀器對物理實驗教學有很大的促進作用,而且有助于緩解高校實驗資源短缺和日益緊張的空間資源。一言以蔽之,虛擬仿真儀器應(yīng)該進行推廣,以推進實驗教學改革,提高教學質(zhì)量和效率。
當然,虛擬分光計還存在一些不足,比如儀器的界面還不夠逼真,無法網(wǎng)絡(luò)應(yīng)用。下一步工作還需不斷改進加強,制作更多更好的虛擬物理實驗儀器。