姚天成 王巍
摘要:研究并實現(xiàn)了一種對于實時三維立體圖像渲染的視點(diǎn)相關(guān)透視改進(jìn)算法,算法使得計算機(jī)輸出的三維圖像在傳統(tǒng)顯示器和投影儀設(shè)備等二維平面顯示設(shè)備上,呈現(xiàn)出關(guān)于任意觀察者頭部位置進(jìn)行透視矯正的立體圖像。使用微軟的Kinect for Windows設(shè)備來捕捉觀察者的視點(diǎn)位置,使用Unity 3D游戲引擎渲染三維場景,使用兩臺投影儀分別在兩個互相垂直的投影面上投影出拼接后的透視矯正的立體圖像。實驗結(jié)果表明本文算法視點(diǎn)相關(guān)的渲染效果具有魯棒性和實時性。
關(guān)鍵詞:立體圖像;頭部相關(guān)透視;虛擬現(xiàn)實; Unity 3D; Kinect for Windows
中圖分類號:TP41 文獻(xiàn)標(biāo)識碼:A 文章編號:1009-3044(2017)01-0175-04
Research and Implementation of Head-coupled Perspective Algorithm for Real-time Stereo Rendering
YAO Tian-cheng, WANG Wei
(Department of Computer Science and Engineering, Dalian Nationalities University, Dalian 116600, China)
Abstract: This article presents an implementation of head-coupled perspective technique which improves traditional computer generated real-time 3D stereo image rendering. This technique enables traditional planar display device such as monitors and projectors to have the ability to present perspective correct stereo image for the observer in arbitrary view positions. In the demonstration, a Microsoft Kinect for Windows is used to capture the observers head position. A PC with the game engine Unity 3D installed is used to take the observers head position data from Kinect as input and render out perspective correct stereo image. Finally, two projector are utilized to project two sub-images output from the rendering PC onto two perpendicular surface respectively to expand display surface area. Experimental results shows real-time and robustness of the proposed algorithm.
Key words:stereo rendering; head-coupled perspective; virtual reality; Unity 3D; Kinect for Windows
1 介紹
1.1 背景
立體顯示技術(shù)[1]已經(jīng)被廣泛運(yùn)用于生活中的各個領(lǐng)域。這種技術(shù),一些算法中觀察者需要佩戴特制的眼鏡,如分色鏡片,偏振鏡片等,另一些算法則不需要。不過算法本質(zhì)都是令每只眼睛分別看到由顯示屏輸出的帶有瞳距偏移的圖像,從而在大腦中重組獲得帶有深度的立體圖像。
屏幕上的三維圖像可以是事先由計算機(jī)生成或者使用立體攝像機(jī)拍攝好的,比如說3D電影;也可以是由計算機(jī)實時生成,比如說電子游戲、虛擬現(xiàn)實。然而,這些傳統(tǒng)的算法中,無論立體圖像是事先制作,還是計算機(jī)實時生成,都假設(shè)了用戶的觀察位置固定于屏幕中心前方的一定距離。當(dāng)觀察者的觀察位置處于這個假設(shè)的觀察點(diǎn)附近時,這種圖像獲得較好的立體效果,一旦觀察者遠(yuǎn)離這個假設(shè)的觀察位置,立體效果就會有損失,對于觀察者而言,畫面會出現(xiàn)不期望的變形。這是因為在這種情形下,畫面的透視分布不正確導(dǎo)致的。
為了解決這一問題,頭部相關(guān)透視方法被提出來用于解決由于觀察位置不同而導(dǎo)致的圖像透視不正確問題。這種方法的基本原理是,立體圖像由計算機(jī)采用虛擬場景實時渲染而成,除此之外,要使用某種捕捉設(shè)備獲得當(dāng)前觀察者的頭部位置,計算機(jī)對幾何體進(jìn)行投影要針對當(dāng)前的觀察者頭部做出調(diào)整。觀察者在移動頭部位置時,圖像的透視隨之改變,造成一種類似通過一扇窗戶觀察虛擬場景的立體效果。
這種技術(shù)已經(jīng)在各種虛擬現(xiàn)實系統(tǒng)中被廣泛運(yùn)用,也有部分電子游戲采用了這種技術(shù)。
1.2 本文的工作
本文的工作在于使用廉價、常見的設(shè)備,如Kinect for Windows,投影儀和普通PC,并使用免費(fèi)游戲引擎軟件Unity 3D,制作一個支持頭部相關(guān)透視技術(shù)的虛擬現(xiàn)實系統(tǒng)。
除此之外,為了增加顯示面積以增強(qiáng)立體效果,在本文的實現(xiàn)中,使用了兩塊投影屏幕呈互相垂直并且對齊后輸出透視矯正的立體圖像,盡可能地使得虛擬物體可以存在于屏幕前方,使得觀察者能從更多角度看到虛擬物體的不同面。本文第二部分介紹立體感的主要來源,頭部相關(guān)透視技術(shù)的基本原理和實現(xiàn)方法。第三部分介紹本文實現(xiàn)的一個基本的帶有頭部相關(guān)透視的立體圖像虛擬現(xiàn)實系統(tǒng)的搭建方法,列出其所包含的硬件設(shè)備,介紹在Unity 3D引擎中的實現(xiàn)。最后,對本文算法進(jìn)行了總結(jié)。
2 頭部相關(guān)透視算法原理及實現(xiàn)
2.1 立體感的來源
本文把圖像立體感的來源簡單歸納為兩個方面:透視和視差。
人眼對外界光線的感受器官視網(wǎng)膜在結(jié)構(gòu)上是一個二維的結(jié)構(gòu),視網(wǎng)膜面前有一套類似于凸透鏡的光學(xué)系統(tǒng)負(fù)責(zé)把物體的光線收集起來在視網(wǎng)膜上形成物體的像,這種結(jié)構(gòu)使得人眼看到的圖像成一種天然的透視結(jié)構(gòu),這種透視結(jié)構(gòu)最基本的原則就是“近大遠(yuǎn)小”,即離眼睛越近,物體顯得越大;離得越遠(yuǎn),物體顯得越小。而大腦中的視覺處理部分可以綜合一副圖像中各物體的相對大小,在這種透視結(jié)構(gòu)的圖像中解讀出物體的深度分布信息。
在計算機(jī)圖形學(xué)中,物體的成像需要經(jīng)過透視投影。在這一階段中,算法確定虛擬的視點(diǎn)位置,根據(jù)屏幕的大小,把虛擬物體表面的三維空間位置變換到屏幕上的二維坐標(biāo)。投影的結(jié)果與凸透鏡的成像效果類似,造成“近大遠(yuǎn)小”的透視效果。頭部相關(guān)透視投影技術(shù)就是要對這一步驟做出改變。
然而,透視貢獻(xiàn)的立體信息只占立體感來源的一部分,另外很重要的一部分就是視差。人類的眼睛在水平方向呈一定距離分布在兩側(cè),形成了天然的瞳距。瞳距的存在使得兩只眼睛的成像之間形成透視偏移。這種透視偏移的表現(xiàn)是,相同的物體,離人眼越遠(yuǎn),在視網(wǎng)膜中成像位置的偏移越?。浑x人眼越近,在視網(wǎng)膜中的成像位置的偏移越大。視覺中樞根據(jù)這一原則,可以準(zhǔn)確地測量出視覺中某一個點(diǎn)的深度信息,從而形成立體視覺。
為了生成有視差的圖像,在計算機(jī)中通常需要使用兩個虛擬的攝像機(jī)模擬人的雙眼以一定的瞳距放置在場景中,每一幀都要為左右眼分別渲染一次場景后輸出到顯示設(shè)備上。在顯示設(shè)備上,再通過特殊的手段把每個攝像機(jī)的畫面分別單獨(dú)呈現(xiàn)給觀察者對應(yīng)的眼睛。
2.2 頭部相關(guān)透視
在計算機(jī)圖形學(xué)的透視投影[2]模型中,一個攝像機(jī)擁有一個虛擬的投影平面,以及一個視點(diǎn)表示具體的觀察位置。一個三維空間中的點(diǎn)與視點(diǎn)連線與投影平面的交點(diǎn)的二維坐標(biāo)即一個點(diǎn)經(jīng)過透視投影的二維坐標(biāo)。這個投影坐標(biāo)可以分別在攝像機(jī)X軸方向和Y軸方向上使用相似三角形原理計算得出。投影的坐標(biāo)位置受到以下幾個因素影響,一個是投影平面的大小,另一個是投影平面相對于視點(diǎn)的位置,這兩個因素間接造就了不同的視場、寬高比等攝像機(jī)參數(shù)。
是遠(yuǎn)裁剪平面的深度,w是投影平面的寬度,h是投影平面的高度。其中視點(diǎn)位置實際上代表的是觀察者的眼睛位置,固定視點(diǎn)即固定了觀察者的觀察位置,從而使得在其他位置觀察投影后的圖形是透視錯誤的。為了實現(xiàn)頭部相關(guān)透視,必須拋棄視點(diǎn)位置是固定的這一假設(shè)。
若視點(diǎn)不固定在投影面中垂線上,為了計算方便,首先將視點(diǎn)仍然放在取景坐標(biāo)原點(diǎn),然后相反地,在XOY平面上反向移動投影平面的位置,這等價于視點(diǎn)相對于投影平面(即屏幕)的運(yùn)動。使用四個參數(shù)l,r,t,b分別代表投影平面左、右、頂、底邊界的坐標(biāo)范圍。這種更一般的透視投影矩陣需如下計算:
可以事先指定好,本文的實現(xiàn)中,為了能夠?qū)崿F(xiàn)虛擬物體向外穿越屏幕的效果,需要避免物體被近裁平面裁剪掉,因而給
3 演示系統(tǒng)的算法實現(xiàn)
3.1 概述
這個演示系統(tǒng)的目標(biāo)是利用現(xiàn)有的廉價、常見的硬件設(shè)備來搭建一個支持頭部相關(guān)透視[3-4]的簡易虛擬現(xiàn)實系統(tǒng),并盡可能地提高系統(tǒng)的精確度、降低延遲和增加可視面積。
本系統(tǒng)采用的硬件配備清單如下:
游戲引擎Unity 3D[5]被用于渲染虛擬場景,本文使用的版本為5.0.1。Kinect SDK版本為1.8,并且采用了CMU Kinect for Windows SDK Wrapper for Unity從而使得Kinect SDK API可以在Unity 3D中被調(diào)用。
3.2 坐標(biāo)系統(tǒng)
Kinect的骨架關(guān)節(jié)識別數(shù)據(jù)[6]是在其定義的設(shè)備坐標(biāo)系中描述的,而為了進(jìn)行頭部相關(guān)透視投影,需要計算出頭部位置關(guān)于屏幕位置的相對坐標(biāo),所以必須要建立一個統(tǒng)一的坐標(biāo)系統(tǒng),用來為位置數(shù)據(jù)在不同坐標(biāo)系下的變換作為橋梁。
本文的算法設(shè)計中對系統(tǒng)建立了一個“物理世界坐標(biāo)系”,規(guī)定坐標(biāo)系的原點(diǎn)在墻角地板上,三個軸分別沿著地板與墻面之間兩兩形成的交線方向向房間內(nèi)部延伸,形成一個左手笛卡爾坐標(biāo)系。接下來,對各個設(shè)備的位置在這個坐標(biāo)系下進(jìn)行測量,測量結(jié)果如下:
在Unity 3D場景中,需要建立分別建立代表虛擬屏幕和Kinect的游戲物體,將他們的世界位移和朝向設(shè)置為測量得到的數(shù)據(jù)。在Kinect游戲物體下建立一個空的子游戲物體,用于代表觀察者的頭部位置。
當(dāng)新的頭部位置數(shù)據(jù)到達(dá)時,通過設(shè)置GameObject.transform.localPosition屬性修改這個物體的位置。在計算準(zhǔn)備階段,通過訪問GameObject.transform.position屬性獲取其世界坐標(biāo)。
3.3 頭部相關(guān)透視投影的實現(xiàn)
3.4 雙眼立體視覺的實現(xiàn)
本文的演示程序采用紅青分色來實現(xiàn)立體視覺。具體做法是,在Unity中,為每一塊屏幕分別創(chuàng)建兩個攝像機(jī),分別模擬左眼和右眼。編寫一個圖像著色器,其作用是將攝像機(jī)渲染出的圖像只保留部分通道的顏色輸出后疊加到幀緩存中。將這個著色器腳本應(yīng)用到攝像機(jī)上,設(shè)置為左攝像機(jī)只保留紅色通道,為右攝像機(jī)保留藍(lán)色和綠色通道。觀察者在佩戴合適的紅青分色眼鏡后,就可以從渲染出的畫面獲得雙眼視差立體效果。
3.5 演示系統(tǒng)運(yùn)行結(jié)果
經(jīng)過測試,本文的頭部相關(guān)透視算法配合雙眼視差立體渲染獲得良好的立體效果,系統(tǒng)的精確度、延遲也在合理的范圍內(nèi)。
注意,圖4中的所有虛擬物體越過屏幕被放置在了外面,造成了一種“懸浮”于空中的效果,這得益于兩塊垂直放置的投影屏幕有效地增加了可視面積。
3.6 存在的問題
在本系統(tǒng)中,攝像機(jī)的近裁剪平面被設(shè)置成了0.2,這意味著物體在離人眼距離小于0.2米的時候才會被裁剪。但是,過小的近裁剪平面導(dǎo)致了更大的深度分布范圍,在深度緩存數(shù)據(jù)浮點(diǎn)型精確度有限的條件下導(dǎo)致深度方向分辨率下降,在實際應(yīng)用中的表現(xiàn)是,造成幾何體出現(xiàn)近鄰面的深度沖突(Z-Fighting)、基于Shadow Map技術(shù)的陰影質(zhì)量下降等問題。
4 結(jié)論
本文研究了基于頭部相關(guān)的透視實時立體圖形渲染算法,一個透視投影立體渲染虛擬現(xiàn)實系統(tǒng)被搭建出來并經(jīng)過測試,這個系統(tǒng)使用了Kinect for Windows作為頭部捕捉設(shè)備,使用Unity 3D作為渲染引擎。為了增加可視面積,制造更好的“出屏”效果,采用了兩臺投影互相垂直投影的做法,配合紅青分色雙眼立體渲染,取得了更優(yōu)秀的立體圖像效果。未來需要研究的內(nèi)容是如何解決深度方向分辨率下降等相關(guān)算法。
參考文獻(xiàn):
[1] 三維立體顯示技術(shù)研究新進(jìn)展, 鄭華東,于瀛潔,程維明, 光學(xué)技術(shù)[J],2008,34(3):426-430
[2] 蒲棟,基于平透視投影變換的單目視覺頭部姿態(tài)估計[D], 中南大學(xué)碩士論文,2014。
[3] Arthur K W. 3D task performance using head-coupled stereo displays[D]. university of british columbia, 1993.
[4] Cruz-Neira C, Sandin D J, DeFanti T A. Surround-screen projection-based virtual reality: the design and implementation of the CAVE[C]//Proceedings of the 20th annual conference on Computer graphics and interactive techniques. ACM, 1993: 135-142.
[5]金璽曾,Unity3D\2D手機(jī)游戲開發(fā)[M],北京,清華大學(xué)出版社,2014。
[6] 王雅懿,基于Kinect人體識別技術(shù)的虛擬現(xiàn)實交互方法的應(yīng)用研究[D], 北京工業(yè)大學(xué)碩士論文,2014。