1. 程式人生 > >android手機裸眼3D技術原理和程式設計實現

android手機裸眼3D技術原理和程式設計實現

1.裸眼3D手機從去年開始流行。做為一個賣點或者噱頭,為手機的輸入輸出提供一抹靈動的色彩。裸眼3D可以在二維的手機螢幕上不需要配戴VR眼鏡或者谷歌紙盒就能展示三維的世界的效果,一般來說要給使用者提供好的體驗,需要軟體硬體相結合實現。硬體一般需要支援裸眼3D的手機或者普通的手機貼上裸眼3D的膜。

2.目前手機上使用的裸眼3D技術叫柱狀透鏡技術,也被稱為雙凸透鏡或微柱透鏡。它的原理是在液晶顯示屏的前面加上一層柱狀透鏡,使液晶屏的像平面位於透鏡的焦平面上,這樣在每個柱透鏡下面的影象的畫素被分成幾個子畫素,透鏡就能以不同的方向投影每個子畫素。而雙眼從不同的角度觀看顯示屏,會看到不同的子畫素。經過大腦加工,就會形成3D畫片。這個的原理和谷歌盒子的原理相似,也許可以說是基本一樣,谷歌盒子軟體開發時我們會把圖片或者視訊資源分成左眼和右眼兩個不同的畫面,兩個畫面的主要區別是差幾列視差樸素,而裸眼3D正是藉助3D屏或者3D手機膜把谷歌左右眼的影象按畫素分別合在柱狀透鏡兩側,由於微柱狀透鏡的對光線折射作用,會使雙眼形成不同視覺。不管是3D 屏還是3d膜一般只支援橫向觀看,同時對觀看角度有一定要求,一般視線應該接近垂直螢幕,這是由於柱狀透鏡一般在手機螢幕上是橫向排列,而左右眼畫素要形成視差需要一定的寬度,而且左右眼合併會損失差不多一半左右的相素。

3.下面是從別外拷來的柱狀透鏡示意圖。我們會把左右眼的影象合成在柱狀透鏡兩側。其實普通的平面圖像或者視訊也可以轉為左右眼3D或者裸眼3D,只要把圖片分割成兩張,留出視差,就可以形成左右眼3D,左右眼3D藉助VR眼鏡或者谷歌紙盒就能得到3D效果,再把左右眼影象按裸眼3D合成規律合成一張,藉助裸眼3D手機就能得到類似3D效果。

4.左右眼3D軟體實現,一般需要考慮三點,一是兩眼的視差, 二是柱狀透鏡的間隔,三是螢幕大小。視差不對,形不成3D視覺,柱狀透鏡間隔決定左右眼畫素的間距,一般的密度大概是螢幕畫素高的一半,這樣一個柱狀對應一列左眼一列右眼,均勻分佈。三是螢幕大小,合成的影象要和螢幕大小匹配或者小於,要不會因為系統自動縮放而損失畫素,從而導致左右眼畫素不一致,導致無法形成3D效果。

5.下面是左右眼視覺合成裸眼3D,合成的圖片在電腦或者普通手機上看起來有些模糊和重影,這說明合成是正確的,左右眼由於視差的存在,看到的影象會有很小的差別,這些差別按畫素列放在同一張圖中時,就能明顯看出不同,在微柱狀透鏡折射下,左右眼可以看到不到的畫素,從而形成3D視覺效果。

6.附簡單實現程式碼

public Bitmap create3DImg() {
    //Bitmap bm = BitmapFactory.decodeResource(this.getResources(), R.drawable.bb);
    Bitmap bm = getBitmapByWidth(R.drawable.bb, 2000, 0);
    int w = bm.getWidth();
    int h = bm.getHeight();

    Bitmap bitmap1 = Bitmap.createBitmap(w/2, h, Bitmap.Config.RGB_565);

    Canvas canvas = new Canvas(bitmap1);
    Rect mSrcRect = new Rect(0, 0, w/2, h);
    Rect mDestRect = new Rect(0, 0, w/2, h);
    Paint paint = new Paint();
    paint.setAlpha(80);
    canvas.drawBitmap(bm, mSrcRect, mDestRect, null);
    int ww = 1;
    for (int i = 0; i < (((w / 2)/ww)/2); i++) {
        Rect mRightSrcRect = new Rect((w / 2)+i*ww*2, 0, (w / 2)+i*ww*2+ww, h);
        Rect mDestRect2 = new Rect((i+1)*ww*2, 0, (i+1)*ww*2+ww, h);
        canvas.drawBitmap(bm, mRightSrcRect, mDestRect2, null);
    }
    return bitmap1;
}