首页 > 代码库 > 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;}




Android 手机裸眼 3D 技术原理和编程实现