免费色播,亚洲国产欧美国产第一区二区三区,毛片看,日本精品在线观看视频,国产成人精品一区二区免费视频,日本黄色免费网站,一级毛片免费

虛擬現(xiàn)實(shí)開發(fā)入門:3D圖像的處理過程

來源:網(wǎng)絡(luò)

點(diǎn)擊:1011

A+ A-

所屬頻道:新聞中心

關(guān)鍵詞: 虛擬現(xiàn)實(shí),3D圖像

    在進(jìn)行第一個(gè)VR應(yīng)用開發(fā)之前,我們來看看幾個(gè)重要的概念:

    搭建場(chǎng)景:創(chuàng)建一個(gè)可視化、可交互、腳本驅(qū)動(dòng)的虛擬現(xiàn)實(shí)環(huán)境。

    立體渲染:用兩個(gè)相機(jī)渲染場(chǎng)景分別表示用戶的左右眼,然后通過Oculus Rift頭顯的透鏡,這兩幅圖片被重合在一起,從而形成清晰且具有深度視覺的場(chǎng)景。

    頭動(dòng)追蹤:通過捕獲Oculus Rift頭顯的位置和轉(zhuǎn)向來改變虛擬世界中相機(jī)的位置和轉(zhuǎn)向。

    我們需要編寫大量3D操作的代碼來表現(xiàn)我們的想法,可以直接通過OpenGL和DirectX來渲染3D視圖,但是這樣做太浪費(fèi)時(shí)間了,而且也超出了本書的范疇。我們unity3D游戲引擎來做這件事,Unity用于快速構(gòu)建VR內(nèi)容非常合適,最主要的是它非常容易掌握。

    在深入研究Unity之前,我們來簡(jiǎn)單了解一下基本的3D圖形技術(shù)。如果你對(duì)3D圖形編程已經(jīng)非常熟悉了,這部分內(nèi)容可以直接跳過。

    3D圖形學(xué)基礎(chǔ)定義

    在繼續(xù)之前,我們來看看3D圖形學(xué)的定義,下面是維基百科給出的定義:3D computer graphics (in contrast to 2D computer graphics) are graphics that use a three-dimensional representation of geometric data (often Cartesian) that is stored in the computer for the purposes of performing calculations and rendering 2D images. Such images may be stored for viewing later or displayed in real-time.

    上面的定義主要有3個(gè)部分:(1)所有的數(shù)據(jù)都以三維坐標(biāo)系方式表示。(2)它們最終都會(huì)畫(渲染)在一張二維圖上,其中VR會(huì)分成左右眼畫在兩張圖上。(3)圖像都是實(shí)時(shí)渲染的,當(dāng)一些動(dòng)畫或者用戶操作引起了3D數(shù)據(jù)的改變,它們所渲染出來的圖像會(huì)實(shí)時(shí)更新,這種更新頻率必須讓人眼無法察覺。以上三點(diǎn)中最后一點(diǎn)是建立可交互應(yīng)用的關(guān)鍵。事實(shí)上,3D圖形渲染技術(shù)如此重要,以至于它已經(jīng)創(chuàng)造了幾十億美元的市場(chǎng),許多大公司都在一心專注做3D實(shí)時(shí)渲染的技術(shù),比如NVIDIA、ATI、Qualcomm等。

    一、三維坐標(biāo)系統(tǒng)

    如果你熟悉二維坐標(biāo)系,如Windows桌面應(yīng)用或者IOS手機(jī)應(yīng)用采用的坐標(biāo)系,你一定知道x、y軸。二維坐標(biāo)可以表示子窗體或者UI控件擺放的位置,當(dāng)調(diào)用繪圖API是可以定義畫筆和畫刷的繪制點(diǎn)。與二維坐標(biāo)類似,三維坐標(biāo)系統(tǒng)只是多了一個(gè)z軸,這個(gè)方向用來描述深度信息(一個(gè)物體距離屏幕的遠(yuǎn)近),如果你已經(jīng)了解二維坐標(biāo)系的概念,那么轉(zhuǎn)換到三維坐標(biāo)系就很簡(jiǎn)單了。

    圖3-1是本書采用的坐標(biāo)系示意圖,它的x軸水平,方向?yàn)樽蟮接遥瑈軸豎直,方向?yàn)橄碌缴?,z軸穿過屏幕,方向?yàn)槔锏酵猓⑶?,這三個(gè)軸都相互垂直。有些三維坐標(biāo)系的z軸是豎直的,而y軸是穿過屏幕。

    圖3-1

    unity3d采用的坐標(biāo)系就是上圖所示這種,只不過它的z軸方向是外向里。我們圖中顯示的是右手坐標(biāo)系,而且Unity3D中的是左手坐標(biāo)系,需要注意的是OpengGL通常也是采用的右手坐標(biāo)系。

    二、網(wǎng)格、多邊形、頂點(diǎn)

    繪制3D圖形有許多方法,用的最多的是用網(wǎng)格繪制。一個(gè)網(wǎng)格由一個(gè)或多個(gè)多邊形組成,這些多邊形的頂點(diǎn)都是三維空間中的點(diǎn),它們具有x、y、z三個(gè)坐標(biāo)值。網(wǎng)格中通常采用三角形和四邊形,這些基本面片可以圍成網(wǎng)格,從而形成了模型。

    圖3-2中就是一個(gè)三維網(wǎng)格,黑色的線條就是四邊形的邊,這些四邊形圍出了一個(gè)人臉的形狀。當(dāng)然,這些黑色的線條在最終渲染的圖形中是不可見的。網(wǎng)格的節(jié)點(diǎn)坐標(biāo)僅僅表示了模型的外形,網(wǎng)格表面的顏色、光照用另外的屬性表示,這些我們?cè)诤竺鏁?huì)介紹。

    圖3-2

    三、材質(zhì)、貼圖、光照

    除了x、y、z坐標(biāo)以外,網(wǎng)格的表面采用另外的屬性表示。表面屬性可以非常簡(jiǎn)單地采用單色,也可以采用復(fù)雜的方法,比如它的反光效果怎么樣或者它看起來是否有光澤。網(wǎng)格表面還可以采用一個(gè)或多個(gè)位圖,一個(gè)我們叫貼圖,多個(gè)我們叫圖集。貼圖可以是文字效果(例如T恤上面的圖案),也可以是復(fù)雜的粗糙效果或彩虹效果。大多數(shù)的圖形系統(tǒng)會(huì)將網(wǎng)格的表面屬性統(tǒng)一用材質(zhì)來表示,而材質(zhì)最終表現(xiàn)出來的效果會(huì)受環(huán)境中的光照影響。

    圖3-2中的模型使用的材質(zhì)顏色是深紫色,表面光照效果表現(xiàn)的是受到了左側(cè)的光照,這點(diǎn)我們可以通過右側(cè)的陰暗部分看出來。

    四、轉(zhuǎn)換矩陣

    模型網(wǎng)格的三維空間位置都是由它們的頂點(diǎn)坐標(biāo)決定的,如果每次想要移動(dòng)一下模型位置都要依次改變每個(gè)網(wǎng)格的頂點(diǎn)坐標(biāo),這將一件非常頭疼的事,要是遇上需要顯示動(dòng)畫效果那就更糟了。為了解決這個(gè)問題,大部分的三維系統(tǒng)都會(huì)提供轉(zhuǎn)換操作,這個(gè)操作原理是整體移動(dòng)網(wǎng)格,這樣網(wǎng)格與世界坐標(biāo)就有一個(gè)相對(duì)轉(zhuǎn)換,而不需要去改變每一個(gè)頂點(diǎn)的坐標(biāo)值。其中,轉(zhuǎn)換操作包括:移動(dòng)、旋轉(zhuǎn)、縮放,這些操作都是針對(duì)網(wǎng)格整體相對(duì)世界坐標(biāo)系的,而不是特定的每一個(gè)頂點(diǎn)。

    圖3-3中展示了轉(zhuǎn)換操作,圖中有三個(gè)立方體,每一個(gè)立方體都是由一個(gè)立方體網(wǎng)格組成,它們都包含相同的頂點(diǎn),在我們進(jìn)行移動(dòng)、旋轉(zhuǎn)、縮放操作的時(shí)候不需要改變這些頂點(diǎn)的坐標(biāo)值,而是給立方體網(wǎng)格賦予一個(gè)轉(zhuǎn)換操作。左邊紅色的立方體向右移動(dòng)了4個(gè)單位(進(jìn)行了[-4,0,0]操作),然后又相對(duì)x和y軸進(jìn)行了旋轉(zhuǎn)(這里注意一下,我們這里角度的單位是弧度,即一弧度等于360度除以2*PI)。右邊藍(lán)色的立方體向右移動(dòng)了4個(gè)單位,然后對(duì)三個(gè)方向都放大了1.5倍,中間綠色立方體就是最初始位置。

    圖3-3

    我們用一個(gè)矩陣來代表轉(zhuǎn)換操作,這個(gè)矩陣中保存著一個(gè)數(shù)組,通過這個(gè)數(shù)組進(jìn)行一些數(shù)學(xué)計(jì)算就可以得到轉(zhuǎn)換以后的頂點(diǎn)坐標(biāo)值。大部分的轉(zhuǎn)換矩陣用4*4的數(shù)組表示,這個(gè)數(shù)組包含4行4列一共16個(gè)數(shù)。圖3-4就是一個(gè)4*4數(shù)組的示意圖,其中m12、m13、m14用來操作移動(dòng),m0、m5、m10用來操作縮放,m1和m2、m4和m6、m8和m9分別用來操作相對(duì)x、y、z軸的旋轉(zhuǎn),轉(zhuǎn)換矩陣乘以頂點(diǎn)坐標(biāo)就是轉(zhuǎn)換之后的坐標(biāo)。

    圖3-4

    如果你同我一樣是個(gè)線性代數(shù)極客,我這么講你肯定聽得懂,如果你不熟悉線性代數(shù)也沒關(guān)系,unity3D以及其它工具中已經(jīng)將這些操作都封裝好了,我們只需要正確調(diào)用它們的API即可,但是了解一下這些操作的底層計(jì)算過程總還是好的。

    五、相機(jī)、透視圖、視口、投影

    渲染好的場(chǎng)景都需要一個(gè)可以供用戶查看的視圖,我們通常在3D場(chǎng)景中用相機(jī)來提供這種需求。相機(jī)相對(duì)場(chǎng)景有位置和方向,就像我們生活中的相機(jī)一樣,它也提供透視圖查看方式,這種方式可以有近大遠(yuǎn)小的效果。相機(jī)最終會(huì)將三維的場(chǎng)景渲染成一幅幅二維的圖片,我們就可以通過它的視口進(jìn)行觀察。

    相機(jī)處理計(jì)算時(shí)主要涉及到兩個(gè)矩陣,第一個(gè)是線性變換矩陣(之前章節(jié)我們稱為轉(zhuǎn)換矩陣),它負(fù)責(zé)定義場(chǎng)景物體的位置和朝向,第二個(gè)是投影矩陣,它負(fù)責(zé)將三維場(chǎng)景物體投影到二維視口中。當(dāng)然具體的細(xì)節(jié)需要太多數(shù)學(xué)理論,所以u(píng)nity3D都將這些已經(jīng)封裝好了,我們開發(fā)人員只需要簡(jiǎn)單的“瞄準(zhǔn)、發(fā)射”。

    圖3-5中描述的是相機(jī)核心概念視口和投影,在圖中左下角那只大眼睛就代表我們的相機(jī)所處的位置,紅色的x軸代表相機(jī)的朝向,兩個(gè)藍(lán)色的方塊就是被觀察的物體,綠色和紅色的矩形分別代表近切面和遠(yuǎn)切面(兩個(gè)切面之間的物體才可以被看見,而這之間的區(qū)域我們稱為可視平截椎),近切面就是我們的視口,投影在視口上的圖像就是我們真正看見的圖像。

    圖3-5

    相機(jī)非常強(qiáng)大,它可以讓觀察者非常真實(shí)地觀察一個(gè)三維場(chǎng)景,此外,它還為動(dòng)畫場(chǎng)景提供了強(qiáng)大的支持,通過移動(dòng)相機(jī)就可以像拍電影一樣創(chuàng)建一個(gè)動(dòng)態(tài)的敘事的場(chǎng)景,當(dāng)然,對(duì)于VR來說需要我們不能隨意移動(dòng)相機(jī),如果要移動(dòng)相機(jī)我們需要多方面考量,最好做到讓用戶完全控制相機(jī),這樣用戶會(huì)有一種身臨其境的感覺。

    六、立體渲染

    在虛擬現(xiàn)實(shí)中,三維圖像渲染是一個(gè)大問題,然而現(xiàn)在又碰到了如何處理相機(jī)這個(gè)難題,相機(jī)本身就需要處理變換矩陣和投影矩陣,可惡的是,VR中我們還需要處理兩次(每只眼睛處理一次)。不過境況并沒有那么糟糕,我們有幾種處理相機(jī)的方法,下面來介紹一個(gè)最簡(jiǎn)單的方法:

    創(chuàng)建一個(gè)主相機(jī):應(yīng)用程序控制唯一一個(gè)主相機(jī),所有的邏輯動(dòng)畫等等都只針對(duì)主相機(jī),這樣,我們?cè)谔幚硐鄼C(jī)與其他物體交互的時(shí)候就變得簡(jiǎn)單統(tǒng)一,此外需要注意主相機(jī)不參與真正的渲染。主相機(jī)還有一個(gè)好處,就是可以在雙立體視圖和傳統(tǒng)單一視圖之間切換。

    用兩個(gè)相機(jī)渲染:除了主相機(jī),VR程序需要外加兩個(gè)相機(jī),用來真正處理渲染。這兩個(gè)相機(jī)需要與主相機(jī)的位置和朝向保持一致,只是有一點(diǎn)不同,就是它們分別要向左向右偏移一點(diǎn)點(diǎn),用來模擬我們的瞳距。

    渲染至兩個(gè)視口:VR應(yīng)用分別創(chuàng)建的左右眼的渲染相機(jī),它們的視口寬度都是屏幕寬度的一半,高度都為屏幕高度。每個(gè)相機(jī)處理圖形的時(shí)候都用了特殊的投影矩陣,這個(gè)投影矩陣可以處理反畸變問題(Oculus SDK中提供了這個(gè)算法)。

    至此,我們已經(jīng)簡(jiǎn)單的了解了VR的圖像處理過程,這里講的非常簡(jiǎn)單,如果要深入那么每一個(gè)點(diǎn)都可以用一整本書來介紹。隨著你的程序變得越來越龐大,你需要處理大量的底層問題,對(duì)于這些問題最好交個(gè)游戲引擎來做,當(dāng)然,你要是非常NB,你可以自己寫一個(gè)引擎,但是如果你跟我一樣希望集中精力做應(yīng)用層的事情,那么最好還是使用一個(gè)現(xiàn)成的引擎。目前市面上有許多很好的引擎,其中包括下節(jié)要介紹的unity3d游戲引擎。

    (審核編輯: 林靜)

    聲明:除特別說明之外,新聞內(nèi)容及圖片均來自網(wǎng)絡(luò)及各大主流媒體。版權(quán)歸原作者所有。如認(rèn)為內(nèi)容侵權(quán),請(qǐng)聯(lián)系我們刪除。