APP下载

基于Unity 3D的体感游戏设计与视角互补滤波优化

2021-07-28林梅燕廖一鹏

关键词:陀螺仪滤波敌人

林梅燕 , 廖一鹏

(1.阳光学院 人工智能学院,福建 福州 350015; 2.福州大学 物理与信息工程学院,福建 福州 350108)

随着计算机三维绘制技术、视景立体仿真技术、对观察者眼球和动作的跟踪技术以及语音识别、触觉反馈等技术的发展,虚拟现实技术应运而生.作为当今世界的主流引擎之一,Unity 3D游戏引擎已在各种游戏平台的制作中得到广泛运用,同时随着虚拟现实技术的发展,VR应用市场中以Unity 3D引擎制作的游戏占据了半壁江山[1—2].因此,在Unity3D游戏引擎强大的技术支持下,基于Unity 3D的VR游戏开发将是未来游戏市场的重要组成部分[3—5].因此本文提出了一种基于无线手柄的Unity 3D的体感游戏设计.但设计时提升人机交互的体验感,给予玩家更真实、更震撼的沉浸感最为关键的技术之一在于进行人物建模以及游戏场景搭载时给玩家提供良好真实的游戏视觉[6].

目前,游戏视角采集模块主要基于MPU6050运动处理传感器,MPU6050内部集成三轴加速度计和三轴陀螺仪,为Unity 3D引擎提供三轴加速度和三轴角速度的原始数据[7—8].但原始数据噪声大,加速度计的加速度取值较为敏感,易受外部干扰,取瞬时值计算的角度误差较大,但误差不随时间积累[9—10];陀螺仪通过积分运算时会有累积误差,累积误差在短时间内产生的积分漂移和零点漂移对游戏影响不大,随着时间的增加而产生较大的误差,即游戏玩得越久角度偏差越大,对玩家影响越大,但受外部干扰小,动态测量效果好[9—10].因此将其各自优点结合互补可以改进测量效果.专家们提出了很多滤波算法,如卡曼滤波、经典互补滤波、传感器DMP自带滤波.卡曼滤波算法需要考虑信号的统计特性,并对干扰信号精确建模,计算量大,适应能力差[11].经典互补滤波无需精确建模,计算量小,但陀螺仪存在漂移误差,精度不高[12].误差补偿互补滤波,在补偿环节加入校正环节,以消除陀螺仪漂移常数值误差,但对细微动作和大幅度动作精度不高,且各性能与经典互补滤波算法相比没有明显提高[13].传感器DMP自带滤波算法,可以根据不同运动速度,设置不同的滤波系数,能够识别细微动作和大幅度动作,精度高,但没有校正参数,会出现漂移现象[14].为此,本文通过对原始数据进行DMP自带滤波提高数据的精度,结合误差补偿互补滤波对算法进行优化.对加速度器和陀螺仪的各自优点进行互补,获得准确的姿态角度,根据这两个传感器不同的频率特性,采用不同的滤波算法,滤除加速度计的高频噪声和陀螺仪的低频噪声,滤除相应的干扰信号,保留加速度计的有用低频信号和陀螺仪的有用高频信号,再对加速度计定时采样角度和取平均值,以此对陀螺仪得到的角度进行校正,减小误差.动态跟踪效果良好,稳定性提高,算法简单,响应速度快,从而获得良好的游戏视角.

1 Unity 3D游戏设计

1.1 Unity 3D游戏软件总体设计

首先获取传感器原始数据,调用DMP函数,获取DMP滤波后的四元数数据,在Unity 3D引擎中,将获得的四元数数据进行互补滤波和误差计算,获得欧拉角(θ,γ,ψ),其中θ表示姿态与y轴产生的俯仰角,γ表示姿态与x轴产生的翻滚角,ψ表示姿态与z轴产生的偏航角,然后将姿态角赋值于游戏场景中人物对象,获得良好的游戏视觉,并将按键数据赋值于角色.欧拉角和按键数据接收完成后,处理该数据,即通过欧拉角数据控制玩家角色的镜头转向,按键数据控制人物的前进、后退、左移、右移、攻击及跳跃.若数据未接收完整,则返回线程继续接收该数据.游戏中的敌人拥有自动寻找玩家并朝玩家移动和自动攻击等功能.游戏结束则关闭串口,数据接收中止.

Unity 3D游戏软件总体流程见图1.

图 1 Unity 3D游戏设计主流程图

1.2 玩家视角转向设计

通过误差计算和互补滤波得到的欧拉角对需要控制的人物的Rotation 3个分量进行赋值,以控制Camera随手柄的转向而进行的镜头转向.欧拉角数据处理结束后,返回主程序.玩家视角转向流程见图2.

图2 玩家视角转向流程图

部分程序代码如下:

void Update()

{//每帧更新角色状态

Debug.Log(angleRoll + ","+ angleYaw + "," + anglePitch);//控制台显示获得的欧拉角数据

transform.eulerAngles = new Vector3(-angleRoll,angleYaw,0);//对游戏对象进行欧拉角的赋值

}

1.3 敌人AI脚本设计

通过编写C#脚本,添加到敌人模型的组件上,让敌人能够自动寻找及朝向玩家,并以一定速度向玩家位置移动.当敌人与玩家的距离小于游戏中定义的矢量长度2时,能自动攻击玩家.每次攻击结束,返回主程序.

敌人AI脚本流程见图3.

图3 敌人AI脚本流程图

部分程序代码如下:

GameObject go = GameObject.FindGameObjectWithTag("Player");//摄像机跟随标签为Player的游戏对象

Debug.DrawLine(target.position,myTransform.position,Color.blue);//画一条目标和对象直接蓝色的线

myTransform.rotation = Quaternion.Slerp(myTransform.rotation,Quaternion.LookRotation(target.position - myTransform.position),rotationSpeed*Time.deltaTime);//敌人看向玩家,即正面以一定速度转向玩家的位置

if (Vector3.Distance(target.transform.position,myTransform.position)>2)

{//当玩家和敌人的位置大于2

myTransform.position += myTransform.forward * Time.deltaTime;//敌人向玩家的位置移动

}

1.4 攻击模块设计

通过编写C#脚本,添加到玩家和敌人模型的组件上.当玩家和敌人处于游戏中定义的矢量长度2以内时,敌人会自动以多种不同的攻击动作攻击玩家,玩家也可以通过手柄按键来攻击敌人.每次攻击都设定攻击时间间隔.每次攻击结束,返回主程序.

攻击模块流程见图4.

图4 攻击模块流程图

部分程序代码如下:

Attack();//攻击

attackTimer = coolDown;//攻击时间间隔等于冷却时间

float distance = Vector3.Distance(target.transform.position,transform.position);//玩家和敌人的直接距离

Vector3 dir = (target.transform.position - transform.position).normalized;//将玩家和敌人的直接距离变为向量1.0形式

float direction = Vector3.Dot(dir,transform.forward);//点乘方式计算敌人和玩家间的夹角

if (distance< 2.5f && direction>0)

{//如果夹角小于2.5并大于0,获取敌人的最大生命值和当前生命值

EnemyHealth eh = (EnemyHealth)target.GetComponent("EnemyHealth");

eh.AddjustCurHealth(-10);//每次攻击减少10点生命

}

1.5 生命和血槽设计

通过编写C#脚本,添加到玩家和敌人模型的组件上.玩家和敌人各有100的血量,当相距在游戏中定义的矢量长度2以内时,其中一方每受到一次对方攻击,屏幕中的血槽UI长度以及血量会随之减少10.

生命和血槽设计见图5.

图 5 生命和血槽设计

部分程序代码如下:

healthBarLength = Screen.width/2;//生命槽长度为屏幕宽度的一半

AddjustCurHealth(0);//调整当前生命(治疗或收到伤害值)

GUI.Box(new Rect(10,40,healthBarLength,20),curHealth + "/" + maxHealth);//屏幕左上角显示矩形生命槽

curHealth += adj;//当前生命加上被攻击时受到的伤害

healthBarLength = (Screen.width/2) * (curHealth/(float)maxHealth);//生命槽长度随当前生命大小改变长度

2 误差补偿互补滤波的姿态解算

本文采用的误差补偿互补滤波的姿态解算法,以互补滤波算法在短时间内采用陀螺仪得到的高通滤波后的角度为最优[15],同时对加速度计采样的低通滤波后的角度进行取平均值以校正陀螺仪得到的角度,并修正随时间增加的漂移带来的较大误差.

互补滤波的姿态解算法流程见图6.

图6 互补滤波姿态解算流程图

互补滤波的算法:

消除零点漂移公式为

其中 Angle_ax为x轴方向的角度,Acc_x为x轴的加速度,Kd,Kp为漂移调整系数.同时,通过误差计算消除零点误差:

bias-gx=bias-gx×Kx+gy-sped×Ky,gy-temp=gy-sped-bias-gx,

其中:Kx,Ky分别表示速度计角速度和陀螺仪角速度权重系数;bias_gx表示加速度计的平均值;gy_sped表示加速度计的采样值;gy_temp表示陀螺仪得到的角度.

3 实验与分析

3.1 算法实验结果比较分析

本设计是在Visual Studio 2015的编辑环境下,运用C#语言编写Unity 3D游戏.通过实验验证几种算法对视角的提取效果,并对实验结果进行详细的分析和对比.误差补偿互补滤波算法,采用的是四元数解算姿态获取欧拉角的方法.通过互补滤波算法,再进行误差校正,获取Unity 3D游戏所需的视角,通过脚本添加到控制的游戏对象(图7).由图7可见,游戏的视角没有漂移现象,但角度偏右,而且斜了,角色不能准确获取所需要的欧拉角;在脚本中直接调用DMP自带滤波算法,处理后的效果见图8.由图8可见,出现漂移现象,一直在晃动,不能正确对角色进行操控.本文提出的算法,在调用DMP自带滤波算法的基础上,结合误差补偿互补滤波算法,通过误差计算消除零点漂移现象.本文分别设置Kd=1 100,Kp=16 384,Kx=0.998,Ky=0.002,效果见图9.由图9可见,消除了漂移现象,能够得到正确的欧拉角以及所需的游戏视角.

图 9 本文算法视角

表1是动作幅度较大、正常和较小3种情况下测量的静态俯仰角的误差值.由表1可以看出,这3者的误差值都较小,但还是有所区别,误差补偿互补滤波算法是在补偿环节加入校正环节,以消除陀螺仪漂移常数值误差,但对细微和大幅度动作精度不高,总体准确率低于其他两种算法;传感器DMP自带滤波算法,可以根据不同运动速度,设置不同的滤波系数,能够识别细微和幅度大的动作,精度高,但没有校正参数,会出现漂移现象,所以准确率有局限,无法达到最好的状态;而在本文算法中,结合DMP自带滤波和误差补偿互补滤波算法,可以有效地提高细微和幅度大的动作时的角度的准确度,同时能够消除陀螺仪零点漂移现象,较其他两种算法准确率更高,稳定度更高,可以提供良好的游戏视角.

表1 静态俯仰角测量误差

3.2 游戏调试结果分析

在Unity 3D引擎中创建玩家、敌人以及游戏场景,游戏场景包括地形绘制、草地绘制、添加房屋、添加天空盒子、添加树木和添加光源等,同时在场景中对人物和地形添加碰撞检测与触发检测,以防止人物直接穿过地面或者墙壁等,游戏场景搭建见图10.通过本文算法优化后的视角赋值给游戏场景中人物对象,并控制玩家角色的镜头转向, 人物搭

图10 游戏场景搭建

建见图11,从图11中可以看出具有良好的游戏视角.

图11 人物搭建

Unity 3D游戏调试界面见图12.该界面为Unity 3D游戏引擎的场景界面,包括了Scene、Project、Game、Inspector、Hierarchy、Toolbar工具栏等界面.

图12 Unity 3D游戏调试界面

Scene界面是搭建游戏场景及人物的界面.Project界面中的Scripts是本设计中所编写的C#代码脚本,包括了串口线程接收DMP自带滤波后数据、误差补偿互补滤波的姿态解算、敌人AI、攻击、生命和血槽等脚本.Game界面是实时显示玩家控制角色的视角以及所搭建的游戏场景.Inspector界面是显示当前选中的游戏对象的所有组件脚本以及其属性的相关信息.Hierarchy界面包含了当前场景的所有游戏对象,本设计中拥有玩家、敌人、光源、地面、建筑、植物等游戏场景对象.Toolbar工具栏分别为播放、暂停和步进,按下播放按钮可进入游戏界面(图13).

图13 游戏界面

体感游戏手柄通过蓝牙控制Unity 3D游戏中的角色,做出站立、移动、攻击、跳跃等动作.角色的站立见图14,角色的移动见图15,角色的攻击见图16,角色的跳跃见图17.

图14 角色的站立图

图15 角色的移动图

图16 角色的攻击图

图17 角色的跳跃图

由以上实验分析可知,在进行人物建模以及游戏场景搭载时,采用本文算法获得的欧拉角来控制角色的转向,具有良好的游戏视觉效果,同时采用角色脚本中的Animation代码和动画实现动作化,例如控制游戏人物的前进、后退、左移、右移、攻击及跳跃等、同时还带有刚体碰撞、血槽UI等,整体游戏界面效果较丰富.

4 结论

如何获取良好的游戏视角是设计Unity 3D体感游戏人物建模以及游戏场景搭载的关键点之一,但游戏视角提取模块存在MPU6050取值敏感、不稳定、取值困难和瞬时角度值误差大等问题,针对以上问题本文提出一种结合DMP自带滤波算法和误差补偿互补滤波算法对游戏视角进行优化.采用DMP自带滤波算法提高原始数据精度,根据加速度器和陀螺仪各自的优势特性进行互补滤波,同时加入误差校正改进,获得准确的姿态角度.实验结果表明,本文算法可以有效地提高细微和幅度大的动作时的欧拉角获取的准确度,同时能够消除陀螺仪零点漂移现象,稳定度高,可以提供良好的游戏视角,适用于体感游戏背景和角色的视觉处理.但是,算法中采用2种算法结合,运算效率不高,因此如何降低复杂度,提高运算效率,仍需要进一步研究解决,这也是未来的研究方向.且本文游戏设计存在不足,例如,未开发出一个具有剧情逻辑的完整游戏,需进行进一步优化,才能更好地为游戏玩家服务.

猜你喜欢

陀螺仪滤波敌人
船岸通信技术下舰船导航信号非线性滤波
KD514:陀螺仪船桨空间姿态捕捉方法
基于Allan方差分析的陀螺仪漂移误差辨识与仿真复现
捡敌人的枪来用,靠不靠谱
基于EMD的MEMS陀螺仪随机漂移分析方法
一种考虑GPS信号中断的导航滤波算法
高效LCL滤波电路的分析与设计
敌人派(下)
微机械陀螺仪概述和发展
足够是够的敌人