Unity3D入門教程之空間增強現實

話不多說,咱們這就開始今天的Unity3D入門教程。

1 空間增強現實投影

一般的投影是在平面、柱面或者球面屏幕上進行的。但是由於某些特殊的需求,需要在一些特殊的外形表面上進行投影,例如汽車表面、機器人表面或者其他一些工藝品等。這時僅僅從一個方向進行投影往往會有很多投影死角是不能被照亮的。所以需要從多個角度使用多個投影機進行工作。對於這種特殊的投影需求,投影的圖像需要進行一些手動的變形以適應那些特殊的投影表面,以及不同投影圖像之間的拼接。本文對主要的貝塞爾變形過程進行介紹,並且附上源代碼。

2 實現原理

在unity 3D中,可以生成一個網格,網格線的每一個交叉點都是三角面片的頂點,如圖1所示。

Unity3D入門教程之空間增強現實

圖1 網格控制示意圖

然後將要投影的圖像以紋理貼圖的方式貼在網格上。此時,網格對應點已經和圖像的像素點產生了映射關係。用戶只需要控制網格頂點變動,其動作趨勢就會被捕捉到,然後圖像相應的映射點產生一致的位移。圖中的每一個三角形面片都是一個圖像單元。在圖像區域人為生成一個控制點陣列(例如3*4),當某一個控制點移動時,其周圍的三角面片頂點會依據距離遠近進行不同程度的移動,這些三角面片也會隨之發生形變。從全局角度看,所有的面片都發生著變化,進而使得貼附在網格面上的圖像也發生著相應的變化。這一過程如圖2所示。

Unity3D入門教程之空間增強現實

圖2 圖像隨頂點變化示意圖

這樣一來,將控制點進行拖動,同時對照投影屏幕上的圖像,就可以使圖像的特定點達到指定的位置上。圖1中網格記錄的是圖像的對應點的位置,一旦網格控制點的位置變化,對應的圖像位置也會發生相應的變化,被拉伸的地方要進行插值,被壓縮的地方進行抽樣,為了使這種變換更加平滑,有必要採用一種適當的變形算法。

3 貝塞爾變形的實現

上面介紹的變形我們採用貝塞爾變形來完成。這種變形的特點在於,圖像的每一個位置都是與所有的控制點的位置相關的,對於某一個選定的圖像位置,離它越近的控制點被賦予越高的權重。因此,我們只需要調整控制點的位置,就可以控制圖像進行變形了。並且這種變形是比較平滑的。(參考書:計算機圖形學(第三版),Donald Hearn et al.)

Unity3D入門教程之空間增強現實

圖3 貝塞爾曲面

主要公式如下:

Unity3D入門教程之空間增強現實

其中:

Unity3D入門教程之空間增強現實

Unity3D入門教程之空間增強現實

Bezier.cs 的主要代碼如下:

Unity3D入門教程之空間增強現實

Unity3D入門教程之空間增強現實

Unity3D入門教程之空間增強現實

實例實驗結果如下所示。黃色的方塊表示控制點的位置,可以使用鼠標拖動來改變位置。青色的小球顯示了生成的網格的頂點位置,實際使用時候沒有必要繪製出來。

Unity3D入門教程之空間增強現實

圖4 實驗結果圖

通過上面的簡單介紹,相信你已經對於貝塞爾曲面有了初步的認識。可以利用給出的代碼擴展自己的工程,將變形功能加入到現有的程序中了。


分享到:


相關文章: