大話3D

 編者按:本文作者王進祥,從事雲渲染行業,他們現在做的產品叫炫3D,是一個基於雲渲染的設計分享平臺,讓用戶分享並傳播自己的設計。這是他的微博。

繼好萊塢的 3D 大片風起雲涌之後,最近 3D 打印也來勢洶洶。恰巧本人就是吃 3D 這碗飯的,藉着這股 3D 風,來談談我所瞭解的各種 3D 技術,發發牢騷,供大家解解悶。

3D的顯示

其實自打有 2D 那天,人們就一直想着怎麼搞出 3D 來。最早算得上 3D 的發明,按照 Wiki 上的說法,恐怕是 1838 年 Charles Wheatstone 發明的一種利用鏡子來讓人的左右眼分別看到不同的畫面來模擬雙眼觀察同一場景的效果,並利用視差讓人產生 3D 感的裝置,算是現在紅藍眼鏡這類視差 3D 的鼻祖。


Wheatstone mirror stereoscope

由於 3D 效果是利用人腦對視差,也就是雙眼所觀察到的畫面有微小角度的差異,進行合成而產生的,並不需要真的有 3D 數據或者實物,因此算是最簡單的一種呈現 3D 的方式。後來又有了很多改進版本,利用繪畫,或者照片等等,但一直只能呈現靜態的 3D 場景。直到攝影技術和光學的發展,可以用兩個甚至多個攝像機模擬雙眼的位置拍攝,並利用不同顏色或者偏振光來顯示,讓人藉助特製的眼鏡來產生 3D 的動態視覺效果。比如紅藍視頻就是用偏紅的顏色代表一隻眼看到的影像,偏藍的顏色代表另一隻眼看到的,人帶上眼鏡後再看就能有 3D 感。

近幾年更是有能在不同角度投射出不同顏色光線的 3D 屏幕,可以不借助任何眼鏡等設備,讓人眼直接觀察到 3D 效果,也就是所謂的裸眼 3D (Autostereoscopy)。但裸眼 3D 的一個問題是,對於只由對應左右眼的兩組影像合成的 3D 場景,如果你的觀察位置稍微有些移動,那麼本應該左眼看到的影像可能就會被右眼看到,而左眼看到的卻是右眼應該看到的影像,於是會有種錯位感,英文叫 movement parallax,中文大概翻譯成移動視差吧。

2010 年,我曾經在一個展會上演示過一臺合作伙伴的裸眼 3D 屏幕,能在 8 個角度投射光線,也就是說它能模擬 8 隻眼看到的影像。因此如果你在一個小範圍內移動觀察,也能保證雙眼看到的影像是按照順序的,一定程度上減輕了移動視差,但看時間長了還是會有點暈。

真正炫酷的技術是全息 3D,能把 3D 影像直接投影在空中,並且無論從任何角度都能完美的觀察到 3D 效果,是近年來好萊塢科幻電影的必備元素。

就拿我最喜愛的鋼鐵俠來說,這張截圖中,Tony Stark 正在利用全息投影來設計他的新型盔甲 Mark II,他甚至還可以在空中操作投影出來的機械模型(這個應該可以用類似 kinect 的技術做到,後面還會提到)。

不過全息投影的原理可比視差 3D 複雜多了,在這給大家簡單解釋一下(涉及一些專業術語,需具備一定物理常識,不喜者可跳過)。

從電磁學的角度來說,光就是電磁波,具有振幅、頻率和相位。振幅就是光強,頻率就是顏色。一般的 2D 照相機,能夠記錄光的顏色和強度,也就是振幅和頻率,但無法記錄光的相位。而全息投影首先需要可以記錄包括光的相位的所有信息,形成一張全息圖。這也是全息的意思,光的全部信息。物理上做全息攝影時,一般將一束激光用棱鏡分爲光強不同的兩束,以保證這兩束激光頻率相同、相位差恆定。強度大的一束作爲物光打在物體上並反射到底片上,另一束強度弱的作爲參考光直接打在底片上,與從物體上反射到底片的物光發生干涉,並記錄在底片上。雖然底片依然只能記錄光強和頻率,但由於此時光強不止由物光決定,而是由物光和參考光的干涉結果決定,因此,其強度變化就記錄了光的相位。而還原相位信息的辦法就是,用同樣頻率的激光打在底片上,將底片記錄的干涉條紋作爲光柵,利用光的衍射來重現物體。但單一頻率的激光只能記錄一種顏色,據說彩色的全息圖是由多束不同頻率激光共同產生的。本人上學時只做過單色激光的全息攝影實驗,至於彩色全息,具體技術細節不詳。

除了物理上用激光產生全息圖之外,還可以用計算機模擬激光干涉的過程計算出全息圖(Computer Generated Holography,簡稱 CGH)。這種方式更方便快捷,而且可以爲虛擬的 3D 模型,而不僅僅是真實的物體產生全息圖,甚至動態的全息視頻。

上圖是一張 google 出來的 CGH 全息圖,同樣也是不能直接看的,也要有相應頻率的激光來還原才行。我見過一種打印在可以彎曲的特製塑料板上的全息圖,在黑暗處用白光手電筒一照,就能看到還原的 3D 圖像,在垂直於板子 45°以內的位置都能很好的觀察到,而且還可以捲起來放在裝羽毛球的筒子裏,很方便。

而且全息圖一個很有意思的特點是,它的任何一部分都保存了物體上所有點反射的光線的全部信息。因此,哪怕只有半張、甚至一小塊全息圖,也都能完整的還原出原始的 3D 場景。這還只是製作全息圖,要想將全息圖投影出來,並從 360°都能看到,也很複雜。一種方式是利用海市蜃樓的原理,將全息圖投影在水蒸氣上,利用分子的不均衡震動,來產生有層次感和立體感的圖像。目前,全息投影的設備還都很貴,相比 3D 打印而言,還遠沒到能夠普及的時候。但很多領域已經開始有所應用,比如演唱會、展覽、產品發佈會等等,前途無量,我個人非常看好。

全息 3D,尤其是計算機產生的全息 3D,和視差 3D 最大的區別在於,它需要真正的 3D 數據,而不是用幾張 2D 圖片靠人腦來產生 3D 感。傳統上 3D 數據往往是用 CAD 或者類似 3ds max、maya 這樣的建模軟件做出來的。拿繪畫做個類比,如果沒經過訓練,一般人很難畫出逼真的 2D 畫作,直到照相機的誕生。同樣,如果沒經過訓練,一般人也很難用這些專業的建模軟件做出逼真的 3D 模型,直到 3D 激光掃描儀的誕生。


如何獲得3D?

激光掃描最早是從測繪領域發展起來的。大家應該時常能在馬路上看到一些測繪人員,用一個架在三腳架上的儀器來測量馬路。那種一般用的是全站儀,就是可以測量距離、角度、經緯度等等數據,集多功能於一身,所以叫全站儀。但是這類測繪儀器往往一次只能發射一束激光,測量一個點,並且爲了提高精度,測量時間也比較長。激光掃描則是同時發射很多束激光,快速測量很多點的位置和角度,並將這些結果變換到一個統一的座標系下,形成由很多點來描述的模型。如果給這些包含 3D 座標的點加上顏色之類的信息,就是 3D 的像素,不嚴格來說也可以叫體素。就像 2D 圖像是由具有 2D 座標和顏色的像素組成一樣,3D 激光掃描儀掃描的結果是由具有 3D 座標和顏色的體素組成的 3D 圖像。


用中距離掃描儀掃描的建築,左下角圓弧狀沒有點的地方就是掃描儀的位置

別看 3D 圖像只比 2D 圖像多了一維,數據量可是大了好多。一般高清數碼相機的照片最多也就十幾兆二十兆,可 3D 圖像至少都有幾十兆數百兆之大,包含成百上千萬的點,因此有個形象的名字叫點雲。就像 2D 圖像可以分爲光柵圖和矢量圖一樣,激光掃描儀所產生的點雲就相當於光柵圖,而 3D 的矢量圖則是 CAD 或 3ds Max 所產生的網格模型(mesh)。2D 圖像的矢量圖大小一般小於光柵圖,3D 圖像也是如此。而且在激光掃描儀之前的 3D 軟件往往也只能處理網格模型,不能直接處理點雲。所以常見的做法是先從點雲中計算出網格模型,然後再做進一步處理。這個套路在製造業已經非常成熟,學名叫逆向工程,也就是大家熟悉的山寨。國內那些仿造的手機殼、汽車外殼等等,都是這麼來的。


利用點雲對汽車車身做逆向工程

爲了更快的掃描更大的範圍,還可以把掃描儀安在汽車或者飛機上,將經過的地方都掃描下來。當然,這樣掃描一圈回來,數據量肯定是非常非常大了。

說到這,估計有人會想,既然點雲數據這麼大,動不動上百兆上千兆,那轉換成網格模型也會很慢啊。事實的確如此,有一本名字叫《基於點的圖形學(Point Based Graphics)》的書,就專門研究如何直接處理點雲,而不是網格。本質上,這是一個幾何基元的問題。最早在計算機上表達 3D 模型的方法,其實也不是網格,而是像立體幾何課本上所畫的那些線框圖,現在在一些 CAD 軟件中依然可以看到。這算是用線來作爲基元表達 3D,後來纔出現顯示效果更好的多邊形網格。而由於三角形是最簡單的多邊形,並且計算上能做很多優化,用的人越來越多,漸漸成爲了網格模型的主流,OpenGL 標準也就直接以三角網格作爲幾何基元,專門處理 3D 的顯卡 GPU 也都對三角網格的顯示做了最多的優化。但點纔是幾何上最簡單的元素,比三角形還要簡單。基於點的圖形學已經能把點雲顯示的和網格效果一樣好,也能做光線追蹤,不用特殊處理就直接可以做粒子系統模擬物理過程的動畫,還能做基於點的有限元分析,好處多多。而如今又有了能很容易產生點雲模型的設備,那麼是否將來會用點來代替三角網格呢?歸根到底,無論是網格還是點雲,都是爲了能在計算機上表達 3D 模型,只要能夠表達好模型,用什麼無所謂。

專業的 3D 激光掃描儀非常貴,一般都要幾十萬 RMB,不是一般人消費得起的,而且其數據後處理也需要一定的學習,不那麼容易上手。但微軟無意間做了一件好事,發明了 kinect,讓一切又有了希望。

本來 kinect 只是被微軟用在自己的 xbox 上做體感遊戲的輸入設備,也就是在遊戲中像鋼鐵俠裏的 Tony Stark 那樣,能夠憑空操作機械模型之類的事。但微軟的研究人員不滿足於此,還建立了一個名爲 Kinect Fusion 的研究項目,利用 kinect 來進行 3D 激光掃描,並發表在 2011 年的 SIGGRAPH 上。


發佈會上的Kinect

很快,開源項目 Point Cloud Library 也實現了自己的開源版本 KinFu,利用 GPU 的通用計算能力來實時計算掃描的模型。前幾天,我在公司的 Ubuntu 上也玩了一下開源版的 KinFu。因爲還沒發佈,所以 KinFu 要自己從源代碼編譯才能運行,不過操作起來非常簡單,並可以在屏幕上直接看到掃描的中間結果,可以及時調整掃描的位置,幾分鐘就能熟練掌握,大大降低了激光掃描的門檻。只是目前 kinect 的精度還比較低,其彩色攝像頭的分辨率是 640x480,而深度傳感器的分辨率只有 320x240,使得掃描出的模型比較粗糙。畢竟 kinect 最開始只是用來玩遊戲的,但如果市場需要,相信今後會不斷改善。


用PCL KinFu掃描的辦公桌,有點亂,湊合看吧

聽說微軟已經計劃把 Kinect Fusion 集成到其 Kinect For Windows 中了,以後只要花不到 2000 塊買個 kinect,就能自己在家掃描了,比單反相機還要便宜。而最近,新秀創業公司 Leap Motion,計劃在明年初發布其類似 kinect、但精度大大提高的 3D 動作控制系統。其所公佈的參數如果屬實,那將可能使 kinect fusion 這一技術達到傳統激光掃描儀的水準,而同時成本卻大大降低,非常值得關注。

如果你覺得專業的 3D 激光掃描儀太貴,而 Kinect Fusion 的模型又太粗糙,還有個辦法,就是照片建模。理論上,通過若干個在兩張照片中同時出現的空間點,就可以計算出它們在空間中的相對位置。如果能知道其中某兩點的實際距離,則能計算出其它點的絕對距離。類似激光掃描,只要點足夠多,就足以從中重建出 3D 模型。美國華盛頓大學的開源項目 Build Rome In A Day 就是利用這一方法,通過收集互聯網上大量的照片,提取出那些在多張照片中都出現過的特徵點,並計算這些點的空間座標,進而產生很多模型。如果真的照片足夠多,可以使所有場景串聯起來,就有可能重建出一個城市來。後來微軟基於這一項目推出了自己的一個在線照片建模平臺 photosynth,最近 3D 領域的巨頭 Autodesk 也推出了自己的 123D Catch,也是類似的在線產品。

如果照片分辨率夠高夠清晰,照片建模確實可以得到比 Kinect Fusion 更好的模型,而且只要用一般的數碼相機即可,不需要特別的設備。但因爲照相時往往會有一些死角,或者沒法在不挪動目標的情況下一次拍攝到的地方,要想做一個完整的好模型出來,拍攝時就要非常小心,有時還需要挪動目標拍攝多組照片,並在後期將每組照片生成的殘缺模型拼接起來,以形成完整的模型。其中有很多技巧,不是很容易掌握。


照片建模,拍了正反兩組照片,拼接而成的一隻完整的玩具龜

現在我們有了各種製作 3D 模型的方法,那怎麼才能把這些模型方便的分享給好友們呢?


分享你的3D

用 3D 打印機把模型打印出來,是最直觀的方法,而且最好的機器不只可以打印塑料,還可以打印金屬,只是成本高了些。或者直接把 3D 文件發給對方,但據我所知,還沒有哪個操作系統像支持 2D 圖像那樣,能原生支持某種 3D 格式。

隨 HTML5 而來的 WebGL 讓通過互聯網共享 3D 模型成爲可能。開源項目 three.js 就是用 WebGL 實現的一套 Javascript 的 3D 圖形庫,在它的官網有很多示例,體驗還是很不錯的。

不過 WebGL 也有一些天生的缺陷。首先,WebGL 需要把 3D 數據下載到瀏覽器本地才能顯示,所以在能看到 3D 模型之前多少都要等一會兒,時間長短取決於模型大小和網速。如果數據還是用 Javascript 來解析的,那麼別人就有可能複製和破解你的數據,用於他處,這對需要保密或者有版權的 3D 數據是很不好的。其次,WebGL 需要瀏覽器支持 HTML5,其運行性能也嚴重依賴瀏覽器的實現。目前 chrome 的支持是最好的,實現的 WebGL 性能也不錯,其他瀏覽器就差一些。但即使在理論上,WebGL 的性能也不可能趕上直接使用 OpenGL 的桌面程序。而且 WebGL 這種通過瀏覽器來解釋執行的方式,也意味着其對用戶終端的 3D 硬件有所要求,尤其是顯示大模型、或者複雜的 3D 效果,都需要更好的硬件支持才行。對於臺式機和筆記本,或許還可以配一塊好一些的顯卡,但對於移動設備,如手機和平板,往往不會有這麼好的顯卡,所以支持 WebGL 的移動瀏覽器好像還沒有,反正我還不知道。

但辦法還是有的。如果能把 3D 模型放在服務器端,只在瀏覽器上根據用戶操作,顯示渲染好的 2D 圖片,只要網速足夠快,使得 2D 圖片的更新足夠快,用戶用起來就會和在本機查看 3D 模型是一樣的。這個遠程桌面就可以做到,只是不能同時支持太多併發用戶,因爲這是由遠端服務器上運行的軟件決定的,而這些傳統桌面軟件往往也不支持併發,遠程桌面對此也無能爲力。

真正能解決問題的是雲渲染。

據說雲渲染的概念是 AMD 在 2009 年的 CES 展會上提出的,並預計將主要應用在 3D 網遊上。3D 網遊本質上也是大量共享 3D 模型的應用,而且和遠程桌面不同,會有很多玩家併發查看和操作這些模型。設想一下,如果只有一個用戶,那雲渲染就應該和遠程桌面差不多,但當併發用戶和操作很多時,情況就完全不同了。因此,真正的雲渲染就像任何一種雲計算技術一樣,需要一個服務器集羣來爲衆多併發在線的用戶服務。不過和另一種被稱作渲染農場的、也是利用集羣來渲染 3D 場景的應用不太一樣。渲染農場是專門用來應付像好萊塢大片中那些逼真複雜的 3D 特效的,它們往往通過模擬真實的物理過程來得到逼真的 3D 畫面,其計算過程非常複雜。如果只有一臺計算機,每一幀畫面都得需要數分鐘甚至數小時的計算才能渲染出來,而集羣的分佈式計算能力正可以用來加快其速度。也就是說渲染農場的集羣是專門用來應對那些很大的、需要多臺服務器協作的渲染任務,但渲染的結果往往只供一個或很少的用戶使用,很少有併發的情況。雲渲染則是要應對那些一臺服務器就可以很快處理完的小渲染任務,但很多很多,而且需要將不同的渲染結果返回給不同的用戶。需求和目的不同,也導致了兩者在架構上很大的不同。渲染農場的工作原理比較接近 MapReduce,先是要將一個很大的渲染任務分解,並分發到多臺服務器上處理,然後再將處理後的結果彙總,並最終返回給用戶,不需要處理併發。而云渲染則更像是一個網站,將很多用戶的併發請求通過負載均衡設備,分發給那些有空閒的服務器處理,然後各個服務器只需要將處理結果直接返回給發送請求的用戶就可以了,不需要彙總,也不一定需要負責分發的服務器轉發,但是一定要能應對大量併發請求。

由於雲渲染的顯示結果需要通過網絡傳輸,體驗起來暫時還不能達到 WebGL 那麼好,但它也有一些無法比擬的優勢。第一個就是不需要 HTML5,也不需要什麼特別的顯卡支持,只要能夠顯示 2D 圖片就可以,而現代的所有瀏覽器都滿足這一點,而且可以連 flash、silverlight 插件也不需要。第二呢,因爲不需要特殊的瀏覽器,也不需要插件,對硬件也沒要求,所以只要帶寬足夠,任何能上網的設備都可以用,移動設備也沒問題,iphone、ipad 這樣不支持 flash 的系統也沒問題。還有一條很重要就是不需要下載模型,因爲渲染過程都是在服務器端完成的,瀏覽器得到的只是一張渲染好的 2D 圖片,所以也就不可能有機會複製或破解你的 3D 數據。唯一需要的是網絡帶寬要夠大,足以將渲染的圖片快速傳輸到瀏覽器顯示出來,和網絡視頻的帶寬要求是差不多的。現在電信光纖的帶寬已經可以達到 20Mbps,足以應對雲渲染的要求。看新聞明年國內也可能開始上 4G 了,到時候即使對移動設備,帶寬也根本不是問題。

雖然理論上看一切都很好,但云渲染的實現難度明顯大於 WebGL,因此目前真正能夠實用的雲渲染產品還不多。

還有一個值得一提的技術——3D 全景圖。其原理是將站在同一位置、不同角度拍攝的多張照片縫合起來,形成一個可以在定點 360°觀察的、看起來像 3D 的圖像,所以叫全景圖。這也是最廉價的一種僞 3D 技術,非常適合像 Google 街景這樣,需要大量、低成本、快速製作模型的應用。但與 WebGL 和雲渲染相比,效果也是最差的。


Google StreetView

可以說到目前爲止,和 2D 技術相比,3D 技術的發展纔剛剛開始。想當年,那些龐大、笨重、難用且只有黑白色的老式照相機器,演變到如今隨身攜帶、高精度的彩色數碼相機,以及從膠捲到數碼打印、複印,再到各種網絡共享方式,2D 領域的變化可謂滄海桑田。即使到了今年,也依然有專注於 2D 圖片分享、並被 facebook 以 10 億美元的重金收購的 Instagram。而現在的那些昂貴的 3D 激光掃描儀,就相當於 2D 中那些笨重、老舊的設備。Kinect Fusion 或許代表了新的方向,而 3D 打印就相當於膠捲和印刷術,WebGL 和雲渲染就是 3D 的網絡共享,誰又知道 3D 中的 Instagram 在哪裏呢?

一切纔剛剛開始。

本文來源:http://www.36kr.com/p/200300.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章