下面的教程是我今天整理的资料,教你们一步步完成本身的3D立体游戏,并向你们介绍一些3D成像的原理。
理论上,每一个普通的非立体3d游戏,均可以改成3D立体游戏,看完这篇帖子,大家均可以把本身以前作过的3D游戏改成立体游戏,那效果。。。
一直想尝试用unity作3D立体游戏,昨天终于入手了一台3D显示器,并成功模拟出3D信号,出现了3D效果:
带上眼镜后的观看效果不错,我的感受比通常的3D电影的立体效果还要强。
第一步:了解偏振式3D成像原理
偏振式3D成像是根据人眼成像原理发明的,人眼看到的景象呈现立体感,是因为双眼所观察到的景象有略微的差异,由于瞳距(两眼球之间的距离)致使观察的物体的角度不一样。
所谓偏振成像就是将两幅不一样偏振态的图像送到双眼,每只眼睛只容许看到其中一幅,咱们用unity制做3D游戏,其实就是制做这两幅图像。或者说模拟3D信号。
第二步:了解如今的硬件技术能帮咱们作什么,咱们须要作什么
在3D显示器出现以前,咱们要作3D立体游戏,估计只能用两台投影仪来实现3D效果了,不过如今的3D液晶显示器大多都是集成好一键转3D功能,在这里这个转3D功能指的是自动识别左右半宽的信号(上下的就不考虑了,通常都是左右),并将其融合,转换为偏振的3D信号,并经过3D眼镜观看到3D效果。固然如今的3D显示器常常会宣传说一键2D转3D功能,这个功能不是我刚才说的融合,而是显示器根据2D影像自动给加上景深,生成左右两幅图像,实际上是伪3D,试了一下,的确略微有些效果,不过效果然的不怎么样。。。咱们这里仍是作真的3D立体吧。
知道了显示器可以帮咱们自动融合左右图像后,咱们就只须要模拟出左右半宽的图像就OK了
第三步:如何用Unity3D模拟出3D信号
这步才是咱们要作的重点。要模拟出真实的3D立体影像,首先要知道人眼成像原理,上面第一步说了,由于咱们有两只眼睛,并分开必定距离(大约150px),这样就出现了距离感。咱们都知道unity中的摄像机是模拟人的眼睛的,通常咱们在unity中观察场景都是建立一个摄像机,固然就没有立体感了,要模拟人的眼睛,就要建立两个摄像机(好吧,废话一大堆,其实我就是想说,请先建立两个摄像机。。。)。
把场景原本存在的主相机删掉,把建立的两个摄像机放在同一平面,分开很小的距离,角度调成同样,注意不是往中间看,而是平视,人的双眼也都是平视向前的,这个和焦距是两个概念,别弄混了,相似于下面这样:
至于相距多少,这个视环境而定,两个摄像机之间的距离相似于人眼之间的距离。咱们用自带的第一人称控制器来解释这个距离。导入第一人称控制,把这两个摄像机拖到第一人称控制器的摄像机下,做为子物体,把第一人称控制自带的相机关掉(enabled=false),就是把camera组件对号去掉。把左右相机的位置改成这样:
左相机:
右相机:
对于第一人称控制器的大小来讲,这个0.06的距离够用了,为何说是够用了,不是正好,是由于距离大点小点都是能够的,距离越大,景深越大,看起来更清晰,好像是距离拉近了,不过给人观看的感受更累了,这个很好理解,人的眼睛距离变大,就至关于人变成了巨人,或者眼前的景象拉近,也就是你把手指从远处拉到眼前的感受,当近到必定程度是,你要看你的手指就会很吃力,要不就重影~~再近,就是斗鸡眼了,斗鸡眼的感受,你懂的。。。
若是距离拉近的话,3D感会渐渐变弱,最近就是两个相机重合,重合后就没有立体感了。因此这个距离要根据你看的场景而定,对于自带的第一人称控制器,它的大小做为人的大小的话,它所存在的场景比例就是固定的,此时的瞳距根据你想要的效果而定,具体能够在显示器上测试。
当两个摄像机的距离固定后,怎么把影像分开呢?由于咱们用3d显示器来融合,就不须要考虑unity的融合图像部分,只须要把两个相机的影像分为左右半宽同时输出便可。要达到这样的效果,用RenderTexture是个很好的解决方案,咱们新建两个RenderTexture,分别用来显示左右两个相机的视野:
把新建的两个RenderTexture放到plane上,并排放到一块儿,并新建一个垂直摄像机来单独显示这两个RenderTexture,这个摄像机也是咱们最后看到的画面所使用的相机。因此它的depth要设置的高一点。
关于RenderTexture,咱们须要稍微调整一下,size改成2048*1024,注意不要改成2048*2048,即便这样会更加清晰,可是会出现显示不全的状况。注意,此时这两个plane的scale大小只有设为2:1的比例才不会出现图像变形,也就是说plane的大小要和RenderTexture的比例同样才会显示正常比例内容,可是咱们须要的并非正常比例,只要融合后是正常比例既可,显示器的融合功能是将左右部分先放大到整个屏幕,再进行偏振融合,因此咱们要的3d信号是压缩一半以后的两个影像,因此降2:1的比例压缩后就成了1:1.也就是plane的大小仍是1:1的方形,这样在融合后才不会出现比例失真的状况。
大多数的3D显示器的屏幕比例都是1920*1080,也就是16:9,如今的3D视频分辨率大多也是这个比例,这样在全屏的时候就不会变形或者出现黑边,咱们玩游戏全屏不失真的话,也要按这个比例(16:9),固然不全屏的话也是看不了3D的,由于左右半宽的窗体没法融合,3D显示器也不认识这样的3D信号。
再回到上面说的RenderTexture的大小(分辨率)问题上来,假如选择了2048*2048,而game窗口比例又是16:9,unity的RenderTexture为了显示1:1的比例,就把摄像机中间部分显示出来,两侧内容裁减掉了,形成视野缺失,因此要选择size为2048*1024,不过这样又出新的问题,Game窗口是16:9,也就是摄像机视野比例是16:9,比2048*1024,也就是2:1的比例要小,形成RenderTexture两侧多显示了一部分,这部分是左右相机视野中没有的部分,必需要去掉的。去掉的方法其实很简单,经过更改材质的UV值便可,也就是让这两个RenderTexture,显示的影像往中间偏移,偏移的量,经过计算能够算出为0.05555…,咱们改变UV偏移:
因为咱们的摄像机视野时16:9,因此附有RenderTexture的plane的两侧内容并不在咱们的视野内,这样主相机的显示影像只有左右相机的视野影像,不会有其余的内容.
到这里,咱们在unity中要作的3D方面的操做已经差很少了,剩下的内容就是咱们作普通游戏的流程,只要把咱们曾经用的相机改成上面作的两个相机便可,咱们能够把这两个相机连它们的父物体导出一个预制体,看向RenderTexture主相机和两个附有RenderTexture的plane导出另外一个预制体,这两个预制体导出包package,这个package包就是一个转3D立体游戏的插件了,要转化哪一个游戏为立体游戏,就把这个包导入,把两个预制体拖进场景,把相机替换为左右两个相机,而后导出游戏就是3d立体游戏了。
将导出的游戏(exe)打开,电脑要连好3D显示器,这样在选择比例的时候才有1920*1080, Windowed的对号去掉,保证是全屏,导出设置里面也有默认全屏,
打开后,将显示器改成3D模式,3D显示器通常都有按键在下面或者侧面,有转换3D的功能键,打开后,带上眼镜就能够体验3D立体效果了!
最终搞出来的效果:
注:假如感受立体效果不明显,就把两个相机的距离拉开一点.