去年是VR元年,本人也跟风搞过一段时间的VR,工作室资助买了一套Oculus CV1还攒了一台主机,毕竟对于苦逼的在校大学生,动不动一两万的设备钱还是贵的,不过我们老师马上要申请一个VR实验室,就可以有钱搞一波儿了今天学弟问我VR程序怎么做,所以就简单的来说一下。
首先说一下什么是VR
VR(Virtual Reality):虚拟现实技术,是一种可以创建和体验虚拟世界的计算机仿真系统,它利用计算机生成一种模拟环境,是一种多源信息融合的、交互式的三维动态视景和实体行为的系统仿真使用户沉浸到该环境中。
与此相关的还有:
AR(Augmented Reality),增强现实,去年挺火的Pokemon Go就是一款AR游戏
MR(Mix Reality),混合现实,严格意义上讲HoloLens应该是一款MR产品而不是AR
CR(Cinematic Reality),影像现实,这个是Google投资的Magic Leap提出的概念,主要为了强调与VR和AR技术的不同,同样,其自认为与MR也不同,实际上理念是类似的。
这里我开发VR用的是Unity3D引擎,其中Oculus使用VR开发的话只要在设置的时候配置一下就可以了,其中HTCVive的开发平台虽然是SteamVR,但是可以在Unity3D配置插件既可以使用,或者直接使用OpenVR(OpenVR 是由 Valve 公司开发的一套 VR 设备通用 API ,换而言之,不管是 Oculus Rift 或 HTC Vive 甚至是其他 VR 设备,都不再需要使用产商提供的 SDK 就可以进行开发,有种打算一统天下的范儿,使用新的OpenVR SDK将不必关注硬件设备本身设备造成的差异。),至于那些手机VR就更简单了。
首先启动Unity3D,新建一个项目,在场景中添加一个Cube,然后点击Edit->Project Setting->Player,在Inspector的Other Settings里面选中Vrtual Reality Supported,选择相应的SDK即可(我这里用的Oculus的头盔,所以选择的Oculus的SDK)
然后连接好设备,点击运行,即可在头盔里看到VR影像
网上很多教程到这里就结束了,但是相信对于跟多初学者这有点糊弄人,只是设置一个参数而已,其他都没说。
首先应该想到的是头盔运动。怎样可以进行360°的视线变换。现在个人的理解是VR的头盔运动相当于鼠标的运动,所以想要视线随着头盔运动只要摄像头跟随头盔运动即可
新建一个C#脚本,命名为CameraMove,添加如下代码
public float sensitivityX = 10f;
public float sensitivityY = 10f;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
float CameraX = sensitivityX * Input.GetAxis("Mouse X");//鼠标x方向运动
float CameraY = sensitivityY * Input.GetAxis("Mouse Y");//鼠标y方向运动
this.transform.Rotate(-CameraY, CameraX, 0);//摄像头旋转
}
将该脚本添加到摄像机上,再次运行,你会发现你的视线将跟随你的鼠标转动,带上头盔,将可以进行360°观察
首先大家应该明白人的左右眼看到的影像是不一样的,而VR就是利用这个不一样让眼睛产生立体的观感,所以无论是Oculus、HTC那些VR头盔还是暴风魔镜、Google眼镜之类的都是利用的左右眼的视线偏差,所以大家会看到很多手机上的VR游戏或者电影都是分成左右两屏的,所以这个时候如果大家再使用VR眼镜的时候如果出现左右无法重合的时候就会影响VR的体验
同时由于人的眼睛的视野时100°,而平面的视线为90°,所以VR眼镜的镜片是凸面镜。如下图所示
眼睛通过左右眼关注到某点的直线交点确定空间中点的位置。正常人的视力范围比视野要小,因为视力范围是要求能迅速、清晰地看清目标细节的范围,只能是视野中的一部分。简单来说,VR头盔的两个镜片可以看成两个完全相同的放大镜, VR头盔强调的沉浸感,一方面取决于屏幕的大小,另一方面取决于镜片弯折光线的能力。因此,就引出了视场角(FOV)的概念,这也是广大VR厂商经常宣传的一个参数。
所以我们可以根据这个原理来设计一下不用Oculus之类的头盔的VR应用(用两个摄像机分屏完成图像的显示)
首先新建一个场景,同样添加一个Cube物体,将原来的Main Camera删除,再添加一个GameObject命名为VRCamera,然后在VRCamera添加两个Camera,分别命名为LiftCamera,RightCamera分别代表人的左右两只眼睛。
这个时候显示出来的只有一个屏幕,所以我们需要设置LiftCamera,RightCamera的显示参数,将Inspector->Camera->Viewport Rect中的x改为-0.5和0.5,这时你会发现Game窗口的图像分成了左右两个部分(同样的手机上运行时可以修改y值,使其分成上下两个部分)。但是现在这个时候左右两个图像的内容是完全一致的,像我上文说的人的左右眼观察的图像是有略微差别的,如果直接这样运行左右图像无法重合,感到眩晕,这里就需要调整左右摄像头的位置。这里我是将Transform中的Position中的x值设置为了-0.03和0.03,相当于人的左右眼睛的距离(这里我没有太多的计算依据,如果大家有什么方法欢迎交流)
上面写的完全是个人的看法和经验,如果有问题欢迎大家指出。我上传了一个Demo,大家可以下载去看看http://download.csdn.net/detail/u014025201/9828278