flash 360度3D虛擬實(shí)境(cubicVR)實(shí)現(xiàn)原理
flash的3D虛擬實(shí)境最早源自于德國的flash圖形學(xué)大牛andre.michelle在其labsite:lab.andre-michelle.com上發(fā)表了一篇關(guān)于虛擬實(shí)境的文章,并提供了一個(gè)實(shí)例(NaN sourcecode).為了深入虛擬實(shí)境,在接下來的2個(gè)月里我陸續(xù)找到一些cubicVR的源文件并嘗試破譯了一些源碼,我同時(shí)嘗試開發(fā)了一個(gè)簡單的flash3D引擎以及圖片3D拉伸算法,所有這些的思想均來自于andre-michelle在其日志中提到的一些idea.現(xiàn)在在這篇文章中所用的實(shí)例依然是我對andre早期版本的整理,雖然目前我開發(fā)的新版本有更好的結(jié)構(gòu)以及執(zhí)行效率,但此版本的編程思想更通俗易懂。我想利用這個(gè)假期時(shí)間開發(fā)出flash球型虛擬實(shí)境,使它變得更真實(shí)。
在flash里部署3D虛擬實(shí)境無疑是一個(gè)革命性進(jìn)步,我們再也不用去安裝java虛擬機(jī)和QTVR了,事實(shí)上,在基于flash的可編程矢量圖形界面基礎(chǔ)上開發(fā)出來的虛擬現(xiàn)實(shí)可以通過創(chuàng)新的用戶界面以達(dá)到完美的用戶體驗(yàn)。city8.com既采用這種技術(shù)來部署他們的全景體驗(yàn)城市地圖。
demo:鼠標(biāo)拖拽以轉(zhuǎn)換camera視角
原理:
點(diǎn)透視與投影
通過1點(diǎn)透視來產(chǎn)生遠(yuǎn)小近大的變化以產(chǎn)生空間感,在cubicVR中,設(shè)想觀察者camera在一個(gè)正六面體中央,通過一點(diǎn)透視來計(jì)算每個(gè)面的在空間投影中的位置,以產(chǎn)生透視效果。
demo:沒有導(dǎo)入透視方程的情況:
細(xì)分貼圖
flash的matrix類只支持2D圖形變換:切變、縮放、平面位移。位圖無法實(shí)現(xiàn)3D變換,這與openGL不同,openGL只需要在定義多邊型頂點(diǎn)和貼圖法線,位圖就會(huì)自動(dòng)貼到一個(gè)面片上,而且整個(gè)貼圖過程完全由GPU完成。而在flash中必須使用細(xì)分貼圖的方法來欺騙人們的眼睛,既:將一張圖片細(xì)分為n張小的三角面片,再將小三角面片進(jìn)行平面切變,正因?yàn)槿绱耍琭lash3D一旦涉及貼圖必然導(dǎo)致大量占用cpu運(yùn)算資源。
細(xì)分貼圖的demo: http://godson.blueidea.com/archives/2006/3708.shtml
消隱算法
如果沒有消隱算法,那么觀察者只能看到離屏幕最近的面,而不能看到整個(gè)3D空間,理論上消隱算法有3個(gè)步驟:1在一個(gè)六面體中,面法線與視錐體夾角大于180度則應(yīng)設(shè)為不可見,2在同一個(gè)像素上,只顯示與camera最近的多邊形(Zbuffer算法),3投影在屏幕以外的多邊型不可見,但這三種算法非常占用cpu資源,andrew設(shè)計(jì)了一種更簡單的算法:1多邊形的中心與camera重合,在camera坐標(biāo)系中Z值<0的多邊形不可見,2投影在屏幕以外的多邊型不可見。
經(jīng)典論壇討論: http://bbs.blueidea.com/thread-2717880-1-1.html
本文鏈接:http://www.95time.cn/tech/multimedia/2007/4486.asp
出處:藍(lán)色理想
責(zé)任編輯:blue
◎進(jìn)入論壇RIA設(shè)計(jì)與應(yīng)用版塊參加討論
|