[摘要]首先分析了攝影仿真系統目的和功能。然后闡述系統實現中的主要技術,重點探討了彈出式功能菜單的實現、焦距調節和照片生成技術。測試結果表明系統運行穩定,能實時生成照片。系統為虛擬實驗的開發和應用提供了新的思路。
[關鍵詞]虛擬實驗;攝影;仿真
[中圖分類號]G434 [文獻標識碼]B [論文編號]1009-8097(2008)05-0114-94
引言
虛擬實驗的研究對提高教育技術水平、改善實驗實訓環境、優化教學過程、促進教學場所的變化、節省教育投資、提高學生的動手和創新能力產生具有重要意義。《大學攝影》是一門實踐性較強的課程,目前攝影實驗中主要存在以下問題:相機數量相對有限,學生只能分組實驗,效率較低;相機關鍵部件(如鏡頭等)容易損壞:數碼產品更新換代較快,由于經費等原因,用于實驗的相機型號相對陳舊,降低了學生實驗的興趣。如何有效的解決這些問題成為大家關注的熱點,基于網絡的攝影仿真系統提供了一種解決思路。
一 系統分析與設計
1 系統分析
攝影仿真系統是為了加深學生對相機的了解,供學生在漫游虛擬場景中進行拍攝訓練,最終達到提高學生攝影技能的目的。學生可以在虛擬場景中觀摩三維相機模型,了解相機主要部件及功能;進行調節焦距、調節光圈、調節快門和拍照等攝影訓練。要求系統可以在網絡上運行:交互性好,方便用戶操作相機;實時性好,即當用戶按下快門后,能實時產生照片;仿真程度高,拍攝的照片能反映相機的參數。
虛擬現實建模語言VRML是一種網絡上使用的三維形體和交互環境的場景描述語言,具有交互性和平臺無關性等優點。Java在網上具有強大生命力,具有面向對象、跨平臺、安全和可移植等特點。基于Java與VRML的交互技術可以實現復雜運算、邏輯處理、網絡通信和精確控制場景基于Java與VRML的交互技術目前已經比較成熟,應用比較廣泛,利用該技術開發攝影仿真系統是可行的。
2 系統功能設計
根據系統分析,攝影仿真系統主要功能模塊分解如下:場景漫游、相機觀摩、焦距調節、光圈調節、快門調節和照片拍攝,系統功能結構如圖1所示。

需要構建一個逼真的拍攝場景,讓用戶可以在虛擬場景中自由漫游;通過觀摩相機了解相機主要部件及功能,對一些禁止操作進行警告,并真實再現損壞情況,如鏡頭變模糊等;通過調節焦距直觀的感受到所拍攝景物的變化;通過調節光圈和快門設置相機參數;通過按快門實現照片拍攝,實時獲得與相機參數相對應的照片。
二 系統實現
簡單場景可直接通過VRML編輯器建立,相機模型等復雜造型需要先在3dmax中創建。然后導成VRML格式文件,在VRML中借助腳本、路由及Java技術實現交互,用戶通過含插件的瀏覽器進行攝影訓練。系統開發中的主要技術如下:
1 取景框、顯示屏幕與相機分離
實際拍攝中,用戶通過取景器來確定所要拍攝的景物,通過顯示屏幕觀看相機參數和進行相機功能切換。在攝影仿真系統中,相機模型相對較小,其取景器、顯示屏幕等就更小了,用戶無法通過如此小的部件來選擇景物,查看相機參數和切換相機功能。借鑒部分數碼相機顯示屏幕可以展開到一定位置和角度的思想,系統將小部件進行分解和擴大:將相機上方的一個矩形區域定義為取景框,將顯示相機參數的屏幕定義在場景的左下方,將進行功能切換的功能菜單定義在右下方。
將取景框、顯示屏幕和功能菜單與相機分離能夠突出主要信息,方便用戶操作。如何讓這些分離的部件隨用戶在場景中移動而同步移動是關鍵。瀏覽器對Transform節點嵌套的子節點能自動進行坐標變換,只要將這些部件及相機等都定義在視點坐標系內,借助路由實時更新視點坐標系(位置和朝向)就可以實現相機及其部件隨視點同步移動。
2 彈出式功能菜單的實現
在拍攝實驗中,相機具有拍攝、調節焦距、調節光圈、調節快門等多種狀態,每種狀態都對應相機的不同姿態,可借助觸發器來實現這些狀態的切換。為保證用戶對場景的瀏覽效果,用于功能切換的觸發物體要盡可能的小。比較常見方法是為各種功能設置一個觸發球,并在觸發球旁用文字進行功能說明。當功能較多時,功能觸發球及功能說明將隨之增加,占據了場景屏幕的大部分空間,勢必影響了用戶對場景的觀賞效果。在windows操作系統中,彈出式菜單具有按需顯示,占空間少等優點,結合這種思想,我們設計并實現了基于VRML虛擬場景的彈出式功能菜單。
對三維空間中的一個物體進行縮放變換時,若縮放比例為(1,1,1)時,變換后的物體和原來的相同,若縮放比例為(0,0,0)時,變換后的物體縮小到原點,此時可認為該物體已經消失了。
利用上面的縮放變換原理,根據功能需求設計了若干個菜單項,每個菜單項實質為貼有圖片的矩形平面,圖片顯示了相應功能名稱,這些菜單項從上到下依次排列。各菜單項所在的局部坐標系Transform節點scale域初始值為(000),即默認各菜單項不顯示;當鼠標單擊其父菜單時,更新子菜單項scale域值為(111),將顯示各菜單項物體,即彈出各菜單項。對菜單項的單擊處理事件需要借助腳本和路由實現,在此不再贅述。
3 焦距調節
焦距是鏡頭最重要的性能指標,焦距的長短對拍攝影像的拍攝視角、拍攝景深、空間透視感和放大率等都會產生影響。其規律是焦距變大(小),拍攝視角將變小(大),空間透視感將變弱(強),景深將變小(大)。焦距調節訓練的目的是讓學生體驗焦距變化對拍攝效果的影響,鍛煉實驗者調節焦距的技能。
用戶通過鼠標點擊調焦環實現其轉動,同時實時更新焦距值,取景框內顯示拍攝影像的變化(目前主要考慮拍攝視角和拍攝景深),其控制流程如圖2所示。

實現上述流程控制是通過VRML腳本及路由實現的,其關鍵問題是焦距的變化對攝影視角和景深的影響,下面將分別討論。
(1)焦距變化對拍攝視角的影響
取景框定義在視點坐標系內,它隨著視點及視線的變化而同步變化。為了反映焦距變化規律,在焦距變大(小)的同時,按當前視線方向向前(后)移動視點,即移動視點坐標系的原點,移動距離s與焦距變化幅度d的關系為:s=k*d;其中k為變換系數,可根據不同相機的焦距變化范圍設置不同的值,本系統中k的值為2時攝影視角變化比較明顯。
設視點坐標系原點的原坐標為(x0,y0,z0),由于視線始終為視點坐標系z軸負方向,則視點坐標系的新坐標(X,y,Z)變為:x=x0;y=y0;z=z0+s;用(x,y,z)的值借助路由更新視點坐標系的translation域值。
(2)焦距變化對景深的影響
景深是指能夠在畫面中形成相對清晰影像的景物前后范圍。為了體現焦距變小(大)時,景深變大(小)的規律,采用視點沿視線方向向后(前)移動;同時采用VRML的霧化效果節點Fog,放大(縮小)其可見域visibilityRange的域值。visibilityRange域值越小,場景產生的霧化效果越強,使得被拍攝物后方的景物模糊狀態越來越加劇。visibilityRange域值與焦距變化幅度的關系為:v=-a*d+v0其中v表示visibilityRange域的新值,a為系數,可根據不同相機的焦距變化范圍設置不同的值,本系統取a的值為-11時霧化效果比較明顯,d為焦距變化幅度,v0為visibilityRange的當前值。
焦距對拍攝視角和景深的影響如圖3所示,焦距為85ram時拍攝視角較小,景深較小,人物后面的房子處在景深以外,比較模糊:焦距縮小為37mm時拍攝視角變大,房子處在景深以內,比較清晰。

4 照片生成及顯示
攝影仿真系統的最終目的是生成照片,照片的生成速度、真實感程度及能否如實反映當前相機的各項參數等將直接影響整個系統的性能,處理好照片的生成對整個系統具有重要意義。
結合基于圖像的繪制(IBR)思想,我們提出了基于場景圖的照片生成技術:捕獲與視點相關的視景框內的區域作為初始圖像,然后結合相機參數采用一定算法對初始圖像進一步處理形成最終照片。
由于VRML本身沒有捕獲功能,照片也需要在一定區域顯示,在此需要借助Java技術協助實現。引入Java Applet與場景在一個網頁中,JavaApplet區域實時顯示拍攝的照片,并提供功能面板設置相機參數。
設屏幕中視景框區域為矩形(x,y,w,h),其中(x,y)為矩形坐上角坐標,w,h為矩形的寬度和高度。則實現圖片抓取及在Java Applet區域顯示的關鍵代碼如下:
(1)包的引入,Applet子類成員變量的定義及初始化
importjava.awt.image.*;//引入圖象處理包,其他包略
//2立與當前JavaApplet區域同樣大小的Image對象,用于存放抓取的新圖
Image Buf=createlmage(this.size().width,this.size().height);
int[]pixels=newinl[w*h];//定義一塊內存空間,用于存放圖片各象素信息
(2)相應用戶按相機快門事件的處理代碼
//抓取屏幕中視景框所在區域(x,y,w,h),存入對象screenshot由
Bufferedlmage screenshot=(new Robot()),createScreenCapture(new Rectangle(x,y,w,h));
PixelGrabber pg=new
PixelGrabber(screenshot,0,0,w,h,pixels,(),w);
pg.grabPixels();//將圖片各像素信息讀入數組pixels中,用于結合相機參數處理圖片
disposeByCameraParam(相機參數);//根據相機參數處理pixels中的象素數據,參數由虛擬場景獲得
Image newPic=createlmage(new MemoryImageSource(w,h,pixels,0,w));//生成新圖片
Buf.drawlmage(newPic,0,0,this);//將新圖片寫入Buf中;
(3)在方法paint(Graphics g)中顯示新圖片
g.drawlmage(Buf,0,0,this);
5 測試結果
在解決上述關鍵問題的基礎上我們實現了攝影仿真系統,系統用戶界面如圖4所示,場景左下方實時顯示相機當前參數;場景右下方為彈出式功能菜單,用戶鼠標點擊其父菜單“實時操作”將自動展開,通過該菜單進行各種功能的切換;場景中間下方為相機,其上方為取景框。界面右側為Java Applet區域,用于顯示拍攝照片和設置相機參數。用戶可以隨時通過網絡平臺進行虛擬漫游、觀摩相機和攝影訓練,既可在虛擬場景中通過鼠標直觀的調節焦距、光圈和快門,也可在控制面板中直接輸入其值,真實的體驗光圈快門的變化對照片的影響。

在圖4所示的視點和視線下,調整相機參數(光圈和快門)所拍攝的部分結果如圖5所示。當照片大小為112×70時,部分客戶端機型的最大響應時間(從按下快門到照片顯示的最大時間間隔)如表1所示。測試表明,系統運行穩定,照片生成速度較快,相機參數的改變對拍攝結果的影響比較明顯。

三 結論及未來工作
攝影仿真系統為《大學攝影》實驗中目前存在的問題提供了一種解決思路。該系統可供學生熟悉相機,鍛煉調節焦距、調節光圈、調節快門和拍攝等基本技能,理解焦距、光圈及快門等參數的變化對成像結果的影響。需要說明的是攝影仿真系統畢竟是虛擬的,不能完全代替實際拍攝實踐,可作為攝影實驗的入門實驗,為拍攝實踐打下良好基礎。

系統目前需要根據絕對坐標抓場景圖,這對屏幕分辨率有較大的依賴性(本系統采用1024*768),今后將探討在多種屏幕分辨率下自動獲取視景框相對坐標的方法;現在僅考慮光圈和快門對拍攝結果的影響,下一步將結合其他相機參數,尋求更符合相機成像規律的算法;對動態場景拍照及錄像功能仿真正在研究開發中。