基于Unity3D与VR头盔的虚拟现实体感游戏开发

2017-09-09 20:01张阳杨长强郑慧平
软件导刊 2017年8期
关键词:虚拟现实

张阳+杨长强+郑慧平

摘 要:智能手机迅速普及,VR虚拟现实头盔技术亦日趋成熟。将手机与VR头盔结合,开发出虚拟现实的手机体感游戏。利用手机中的陀螺仪系统,实现惯性定位来捕获人身体的变化,达到体感操作目的。使用Unity3D双屏显示与VR头盔结合,通过手机便可身临其境地体验到沉浸式的虚拟现实效果。配合蓝牙摇杆控制器,玩家通过佩戴装载有智能手机的VR头盔,即可体验身临其境的虚拟现实体感游戏。

关键词:虚拟现实;Unity3D;VR;手机体感游戏

DOIDOI:10.11907/rjdk.171222

中圖分类号:TP319

文献标识码:A 文章编号文章编号:1672-7800(2017)008-0119-04

0 引言

VR虚拟现实技术是一种可以创建和体验虚拟世界的计算机仿真系统。它利用计算机生成一种模拟环境,是一种多源信息融合的交互式三维动态视景和实体行为系统仿真[1]。2015年三星、谷歌、微软等大型公司进军VR市场,2016年被业内称为VR元年。本文中的游戏使用的暴风魔镜四代VR头盔作为交互式硬件。

Unity3D游戏引擎平台开放、交互友好,可使用C#、JS、Boo语言进行开发,并可发布成PC、网页、安卓、苹果、家用机等跨平台应用版本,使用Unity3D可以更好地普及虚拟现实体感游戏。基于Unity3D开发并发布成手机应用,将安装有应用的手机放入暴风魔镜等主流VR头盔中,使玩家沉浸式地体验体感游戏。

1 概述

本游戏策划取材于“真人CS”户外对抗活动。游戏采用第一人称视角,玩家佩戴VR头盔后,通过头部和身体的移动控制角色移动与玩家视野,用蓝牙控制器控制游戏角色射击。在360°沉浸式的VR视觉效果中,体感方式控制游戏,在游戏中取得资源,完成任务通过关卡。

程序开发分为美工开发、游戏场景与UI搭建、游戏程序设计、角色程序设计、VR系统配置几个部分。游戏开发流程如图1所示。

游戏设计过程:调用Unity官方API函数AnimationEvent创建动画事件播放过场动画,AudioSettings实现音频控制,通过GUIContent界面内容、GUILayout界面布局、GUIStyleState界面风格状态函数对界面内容进行编辑,实现模式选择等功能。游戏中设置多处场景触发器,当玩家抵达规定的地方时,触发道具获得与场景变化。游戏中玩家需要找到并操作智能计算机控制台,关闭路径上的陷阱,打开通过下一关卡的控制门。

VR系统开发需要使用可以放入手机的VR头盔,游戏程序通过调用手机内的陀螺仪装置实现惯性定位、虚拟漫游,并使用蓝牙遥控器对手机中游戏应用进行控制。VR头盔如图2所示,蓝牙遥控器如图3所示。

人眼之所以能分辨出立体物体与平面物体,是因为人的两个眼睛看到不同的视觉画面。VR头盔利用这一点,将人的两个眼睛看到的画面单独分开显示,这就要求在游戏开发时设置成双屏画面。双屏画面有细微差别,以供人眼看到后显示出三维效果。游戏画面如图2所示,佩戴头盔后的操作效果如图2左下角所示。

2 游戏程序算法

2.1 A星算法

游戏设计了多种敌方机器人,要使敌方机器人进入防御状态很容易,可通过设置坐标位置或采用Unity3D中的AI设计方法。但要让敌人智能逼真地动起来,就需要用到相应的算法——A星算法。

A星算法在人工智能中是一种典型的启发式搜索算法[2],解决搜索问题的过程就是从开始位置点经过每一个过程位置点到目标位置点的过程。这些点构成一个图的数据结构,这个图就是状态空间,状态空间搜索就是在这些点中找到一条从起点到终点的路径过程。

一般情况下,使用的状态空间搜索类似于数据结构中图的遍历方法,分为深度优先和广度优先两种搜索方式。广度优先,顾名思义是从初始点一层一层向下找,直到找到目标为止。深度优先是按照层的顺序先搜索完成一个分支,再搜索另一个分支,直至找到目标为止。当过程中的点过多时,无论是深度优先搜索还是广度优先搜索,都会使得搜索效率降低,因此需要使用启发式搜索算法。

之所以称为启发式搜索算法是因为这种算法只是一种猜测。启发式搜索就是从起点对周围每个位置点进行评估,将起点周围点写进open表中,计算出表中每个点的h(n)和g(n),得到评估值f(n),将f(n)较小的值写进close表中,继续将close表中周围的点加入open表中,注意障碍物和已加入的点不作处理。逐个对位置点遍历直到终点目标。启发中的估价用估价函数表示:

f(n)=g(n)+h(n)(1)

函数表示的含义如下:f(n):节点n的估价函数;g(n):在状态空间中从初始位置点到第n个位置点的实际代价;h(n):从n到目标节点最佳路径的估计代价[3]。

h(n)是估计出来的,计算方法有多种,这里采用最方便的方法,即h(n)等于起点和终点所在行差的绝对值加上起点和终点所在列差的绝对值。h(n)在启发搜索中对位置的估价起着很重要的作用。A星搜索在搜索时能够利用启发式信息智能地调整搜索策略。

A星搜索是一种迭代的有序搜索。从起点开始通过评价函数f*(n)评价点close表中各个邻接点的状态。若新的预测值小于之前迭代值则将该点作为新的迭代点,直到遍历到终点为止。

定义如下:

f*(n)=g*(n)+h*(n)(2)

其中各函数表示的具体含义如下:g*(n):表示沿路径从起点到当前点的移动耗费;h*(n):从第n个点到目标点的估算代价;f*(n):从初始点经过第n个点到达目标点的预计值[4]。将这个值与之前的迭代值比较,若小于迭代值便将该点加入“最优路径”中,当迭代到目标点时迭代结束,得到的路径便是“最优路径”。endprint

A星算法思想就是从起始点开始不断迭代的过程,下一个迭代点从目前点的周围点产生,计算出目前点的f*(n)值和周围点的f*(n)值,每次保留数值最小的f*(n)将其加入最优路径表中。如此下去,直到迭代到终点为止。这是一个不断搜索的过程,最后得到的路径便是最优路径。

2.2 OBB包围盒碰撞检测算法

三维物体的碰撞检测比二维物体复杂得多,这里使用OBB包围盒碰撞检测算法实现。在游戏引擎中,对于场景物体进行表面凸分解,组织层次凸块二叉树,然后为凸块构建OBB包围盒,最后对凸块进行三角形带压缩编码来完成三维物体间的碰撞检测[5]。

构建凸块的OBB包围盒,凸块所有顶点的坐标向量协方差矩阵计算如下:

Cjk=13n∑ni=0(pjipki+qjiqki+rjirki)(3)

μ=13n∑ni=0(pi+qi+ri)1≤j,k≤3(4)

p、q、r为凸块顶点的三维坐标系,μ为三维坐标凸块的向量均值,C是协方差矩阵。碰撞检测中遍历物体的层次凸块二叉树,可采用SAT来判断两个凸多边形是否发生重叠,检测凸块OBB包围盒是否相交,以实现碰撞检测算法,最终完成相应的游戏开发设计。

2.3 陀螺仪空间定位算法

主流手机中都内置有陀螺仪传感器,三轴磁传感器的坐标方向是参考地磁场,当运动控制器件指向发生变化时,相对于地磁场会有一定變化。当运动控制器件指向任意方向时,地磁场产生的作用会分配在磁传感器的三轴上,表示为如下关系式:

axisX2+axisY2+axisZ2=Cgnd(5)

axisX:地磁场向量在传感器X轴上的分量;axisY:地磁场向量在传感器Y轴上的分量;axisZ:地磁场向量在传感器Z轴上的分量; Cgnd:地磁场向量目前作用于运动控制器件的磁场强度。axisX、axisY、axisZ是目前地磁传感器三轴采集的磁场强度值,进行必要的数据处理后,可计算出平面指向角α和俯仰角δ:

α=arctanaxisYaxisX(6)

δ=arctanaxisZaxisX2+axisY2(7)

重力加速度方向在某一固定位置是恒定的[5],根据重力加速度在多轴加速度传感器上的分量可计算出此时设备的俯仰角。

根据计算出的俯仰角信息、加速度信息以及重力感应信息,实时定位用户的头部运动状态,根据用户的头部变化、视角变化,控制游戏引擎中的摄像机位置,实现摄像机完全跟随用户视角变化而移动,达到VR虚拟现实效果。

3 游戏实现

Unity3D 是一款功能强大的专业游戏开发引擎,可用于创建3D交互式应用程序,也可以跨平台发布。它支持绝大多数文件格式,具有易用、灵活的着色器、支持联网、实时三维图形混音频流及视频流[6]等功能。本游戏使用 MAYA 进行场景建模。为了达到更好的视觉效果,在建模过程中进行了一系列优化,以充分达到逼真沉浸式的体验效果。

3.1 游戏开发需求分析

在游戏开发设计中,需求分析是首要也是最重要的环节,良好的分析活动有助于避免或尽早剔除早期错误,提高游戏开发效率与质量,降低开发成本。

此游戏故事情节开始于一家邪恶集团派遣各式各样的杀人暴徒和机器人来毁灭城市。玩家可以选择独闯虎穴、直捣黄龙,潜入总部毁灭基地。游戏角色是一位机枪手,游戏氛围刺激紧张,在玩家还在研究手中武器时,敌人可能已经冲上来。正是这种骇人的对手,使玩家必须打起十二分精神,仔细观察周围,找到一切隐性的通关秘诀。精致逼真的3D场景,众多的特殊道具,带给玩家全新的视觉和玩法体验。

根据剧情游戏设计3个关卡:第1关以科幻色彩浓厚的工业大楼作为主要场景,任务是玩家潜入军事基地收集情报,杀死邪恶暴徒并破坏设备,然后顺利逃出军事基地;第2关任务是潜入基地深处杀死幕后指挥官并破坏设备,在到达指挥室的过程中,玩家要不断收集场景中纸片,纸片内容会指引玩家找到指挥官;第3关玩家需要到达基地总部引爆炸弹,毁掉整个军事基地,赢得最后胜利。

在游戏中玩家扮演机枪手,可射击或躲避,可操纵敌军设备,通过蓝牙控制器以及头部和身体移动来控制方向、躲避敌人、射击、更换装备等。在突破游戏设计关卡后,完成设定的剧情任务便可获胜。

3.2 场景优化

三维虚拟游戏中,模型建立是非常重要的部分,逼真的场景能够迅速吸引玩家的眼球,激发玩家的兴趣。然而VR游戏又不同于普通游戏,最大差别在于VR的渲染是普通游戏的两倍,因此在性能优化上必须下很大功夫。

(1)使用法线贴图优化表面。在搭建模型方面,为了实现逼真效果,必然要建立很多画面,导致渲染次数增加,性能消耗增大。为解决这一问题,最直接的方法便是改建模,每个模型减掉一半的面来实现,但这样逼真效果就会降低。在保证高性能和高逼真度的情况下,本文使用法线贴图优化表面。

(2)烘焙技术。在Unity中,实时光照可带来很好的体验效果,但由于手机CPU有限,实时光照过多会导致渲染次数增加,最终反映在画面上便是抖动严重,出现卡顿眩晕现象。为了解决这个问题,在游戏中选择一个实时光照,其它作为烘焙光照。光照探针(lightprobe)能对静态物品产生一个模拟光照,但这个光照是静态的,在游戏开始时进行渲染,游戏过程中不会重复渲染。这样做的好处就是在游戏开始时只做一次渲染,不必进行重复渲染,大大提高了渲染效率。

(3)遮挡剔除技术。游戏中每个被展示的部分放在一个特别的包中,称之为“描绘指令”(draw call),通过这个包传递到3D部分在屏幕上显示[7]。CPU负责相应模型和场景的包装和显示。场景中每一颗子弹消耗的字节和一个角色消耗的字节是一样的,如果不降低 draw call,电脑就会把场景中所有的物体都进行渲染,严重增加了CPU的负载,降低了渲染效率。解决这个问题需要用到遮挡剔除技术。遮挡剔除即当物体被其它物体遮挡,不出现在摄像机可视范围内时,不对其进行渲染。遮挡剔除并不是自动完成的,需要进行相应设置。首先关卡中的几何体必须分割成不同尺寸的块,每个块生成一个可见列表,当摄像机位于该范围内时激活列表,不在列表中的将其剔除。endprint

(4)LOD技术。该技术需要建两个模型,一个面数多,较为逼真,一个面数少,较为粗糙,具体执行过程如下:定义两个关键距离D1和D2作为摄像机和场景距离,当实际距离小于D1时,调用高清模型,当距离大于D2时,调用较粗糙模型。通过选择不同精度模型,大量减少绘制的顶点数目,从而对游戏场景的实时效果进行优化。在Unity中可以通过Component→Rendering→LODGroup进行操作,选择需要控制的模型以及进行距离设置。

(5)像素优化。overdraw指一个像素被多次绘制,像素优化的重点便是降低overdraw。控制绘制顺序,便是为了最大限度地避免overdraws。在PC上,资源无限,为了得到最准确的渲染结果,绘制顺序可能是从后往前绘制不透明物体,然后再绘制透明物体进行混合。但在移动平台上,这种方式会造成大量的overdraw。从前往后绘制之所以可以减少overdraw,都是因为深度检验的功劳[8]。

在Unity中,Shader中被设置为“Geometry” 队列的对象都是从前往后绘制,而其它固定队列(如“Transparent”、“Overla”等)的物体,则都是从后往前绘制。这意味着,可以尽量把物体的队列设置为“Geometry” ,还可以充分利用Unity队列来控制绘制顺序。例如,天空盒子几乎覆盖了所有像素,并且它永远会在所有物体的后面。因此,可以将它的队列设置为“Geometry+1”,这样就可保证降低overdraws。

3.3 代码优化

代码编写过程中,能够使用单例就尽量少用静态。单例在程序中只保留一份,而静态是多个;使用对象池对重复使用的物体进行统一管理;使用预加载方式,对一些资源加载造成的卡顿进行处理;尽量不使用foreach,而是使用for。foreach会涉及到迭代器的使用,而每一次循环所产生的迭代会带来24 Bytes的垃圾,循环10次就是240Bytes;不要直接访问gameobject的tag属性,比如if (go.tag ==“machine”)最好换成if (go.CompareTag (“machine”)),因为访问物体的tag属性会在堆上额外分配空间,如果在循环中这么处理,留下的垃圾就可想而知了;对代码多一些重构处理,程序的架构设计必须耦合性低,易于扩展。

3.4 CPU优化

CPU优化可通过减少Draw Calls实现,平时用的最多的还有批处理。所谓批处理就是将很多物体一起处理的意思,条件是同一材质物体。对于同一材质物体,除了顶点数据的差异外无其它差别,将这些顶点数据合并起来交给CUP处理,便是一次批处理,这大大降低了CUP的消耗。

Unity中有两种批处理方式:动态批处理和静态批处理。动态批处理会对每一帧进行计算,大量增加CUP开销;静态批处理可使游戏引擎尽量降低绘制物体所产生的DrawCall。由于合并后的物体需要额外内存资源来存储,所以内存占用会增加,CPU资源会减少。在绘制图形,例如桌子、椅子等时,可以在编辑器里设置成静态,所有具有相同材质的物体会被组合成一个网络,调用一个绘制,降低了CUP消耗[9]。

3.5 特殊效果

VR中第一人称能很好地模拟机枪手的视角,再加上真实的环境、气氛、声音,玩家很容易沉浸在游戏中,本游戏通过环境气氛、特效、光影(烘焙)和声音等方面进行强化。

3.6 游戏敌人AI功能

人工智能在游戏中非常重要,它可通过一些随机的数字让敌人做一些动作或逻辑,在Unity中通过AI脚本程序实现。传统的射击游戏设计,都是通过一套AI规则进行判断,无论玩家做出什么行为,都会根据AI规则作出相应的行动,因为确定性太强,易使玩家觉得单调,因此,需要引入更多的随机性。

为使机器人AI 更具智能,加入了模糊概率算法,提高了不确定性,给玩家一种新奇感。当玩家靠近敌人并在敌人视线之内,敌人便会进行攻击,可以通过脚本设定敌人攻击速度以及移动速度、命中率等。脚本写得足够详细,游戏玩起来才足够灵活。

针对游戏需求,设计的非玩家角色控制算法具备主动和被动控制两种状态[10]。处于被动时,要考虑是否被攻击为触发条件以及作出相应对策,如果非玩家角色被触发则转向主动状态。在主动状态时,如果有目标进入一个特定的距离范围,非玩家角色就进入攻击模式,否则处于防备状态。

4 结语

本文着重阐述了游戏开发过程中涉及到的算法、场景搭建规范以及优化技巧,通过复杂的AI系统创造出更加真实的角色行为,大大增强了游戏的逼真性及可玩性。游戏玩法多样,故事情节丰富。玩家戴着VR头盔,手持蓝牙遥控器,通过头部和身体的移动,便能尽情享受激战中带来的快感。

VR技术日趋成熟,新的应用层出不穷,在医疗、教育、建筑等行业应用逐步发展,但VR游戏依然是VR的重要发展部分。如何做到泛而不滥、内容精良,在策划和优化上要下功夫。本文着重阐述了游戏开发中涉及到的优化方法,以提高游戏的流畅性及逼真度,无论是场景搭建还是AI设计都会给用户带来全新的体验。

参考文献:

[1] 陈浩磊,邹湘军,陈燕,等.虚拟现实技术的最新发展与展望[J].中国科技论文在线,2011,20(8):1-15.

[2] 林中盛.基于DGPS/GIS机场场面交通管理系统的研究与开发[D].南京:南京航空航天大学, 2004.

[3] 刘爽.基于VRML的虚拟现实场景漫游技术研究与实现[D].长春:吉林大学,2007.

[4] 魏博.基于cocos2d-x跨平台引擎的趣味篮球游戏设计与开发[D].西安:西安电子科技大学,2014.

[5] 实时碰撞检测技术研究[EB/OL].[ 2012-09-04].http://www.docin.com.

[6] 伍传敏,张帅,邱锦明.基于Unity3D的FPS游戏设计与开发[J].三明学院學报,2012,29(2):2-6.

[7] J LU,Z PAN,H LIN,et al.Virtual leaning environment for medical education based on VRML and VTK[J].Computers & Graphics ,2014(6):25-26.

[8] P L WEISS,A S JESSEL.Vitual reality application to work[J].Work,2001(2):25-26.

[9] 申薇,夏利文.虚拟现实技术[M].北京:希望出版社,2012.

[10] 陈雪梅.基于 Unity3D 的手机游戏开发[J].电子技术与软件工程,2016,45(1):71-72.endprint

猜你喜欢
虚拟现实
论虚拟现实艺术的“沉浸”
REALITY BITES
虚拟现实技术向科幻小说借灵感
虚拟现实:另一个真实世界
浅谈虚拟现实