黄俊杰,金沐祥,秦亚光,彭 迪
(武汉纺织大学,湖北 武汉 430200)
近年来,随着计算机软硬件技术以及虚拟现实技术的不断发展,其研究和应用也愈发成熟。目前虚拟现实技术已经被广泛应用在各个领域,其中就包括体育领域。20世纪初Paul Hawkins等人基于虚拟现实技术发明了一套鹰眼系统,该系统在设计之初是为了帮助赛场裁判对边界球、争议球做出判罚。当前国内外相关学者对鹰眼技术进行了积极探索,但是仍存在商业化成本高,应用场景受限以及用户体验不佳等问题。
文中基于Unity3D平台设计和实现了一套应用于网球赛事中的鹰眼三维可视化系统,该系统实现成本相对低廉,除了能够用于辅助赛场裁判对边界球做出判罚和分析球员的击球方式和策略,还能提供用户和虚拟场景中的对象之间的交互功能,提升了用户体验。此外,结合当下快速发展的WebGL技术,上传系统的Unity网页版文件到服务器,部署网络云平台,让系统的应用场景不再受硬件设备、场地环境的限制。
鹰眼三维可视化系统的主要设计步骤如下:
(1)在场地周围布置多架高速摄像机采集网球运动的二维图像数据,然后运用基于NTP同步协议的方式[1]实现多目摄像机帧同步,再通过边缘检测和哈夫变换处理得到网球球心的二维坐标[1-4],最后利用OpenCV相关方法还原演算得到网球在真实场地中的空间三维坐标,并存入数据库;
(2)根据网球场地拍摄的图片和已知的资料利用3D Max进行网球场地建模,利用photoshop制作纹理贴图,然后将已经制作完成的模型从3D Max中以FBX的格式导入到Unity3D工程中;
(3)在Unity3D中完成相关的场景搭建和图形用户界面GUI的制作,利用Visual Studio编辑C#交互式脚本;
(4)系统发布。
系统开发具体流程如图1所示。
图1 鹰眼三维可视化系统开发流程
网球场地的三维建模是整个系统的基础,利用3D Max进行场地建模的主要方法有基础建模法、多边形建模法、修改器建模法、复合对象建模法等[5]。为使场地模型达到更加逼真的效果,采用多边形建模法再配合其他建模法进行搭建,并利用光照烘焙和纹理贴图设置材质和渲染输出。网球场地三维模型如图2所示。
图2 网球场地三维模型
通过多目高速摄像机获取网球运动的二维图像,由于软硬件原因,无法保证数据接收端在同一时刻接收到的不同摄像机的数据是同一时刻不同角度网球的照片,目前解决这一问题的方法主要分为以下几种:(1)硬件帧同步,通过同步控制触发器来触发多个摄像头同时启动拍摄。(2)基于PLL锁相环的方式[6-7],该方法利用相位同步电压实现目摄像机帧同步。(3)基于NTP同步协议的方式[8],该方法通过计算各个数据发送端发送数据到服务器需要等待的时间,来确定摄像机之间的时间差,再根据相应的时间差确定同一时刻网球运动图像的帧组。其中硬件帧同步对设备要求高,无法普及;而基于PLL锁相环的方式,需要调节和控制摄像机的增益参数,以及LED灯光照,操作较为复杂。文中通过设置同步信号发生器,并使各分站相机之间的线径相同,同时给每一帧图片加上一个标记位,当帧数达到50时,摄像机停止工作,待信号发生器再次发送脉冲信号时,同步启动拍摄。其基本原理如下:
采用的高速摄像机最高可以以2 000 fps的速度拍摄网球运动图像,设置同步信号发生的时间间隔为50 ms,摄像机接收到同步脉冲信号时启动拍摄50帧图像,将所有摄像接收到该次同步信号启动拍摄的50帧作为一组同步图像,依次类推。每间隔50 ms做一次校正,有效减少帧同步误差。
图3中T1代表同步信号发生器首次产生脉冲信号在时间轴上的值,T2代表摄像机启动拍摄时在时间轴上的值,T3代表同步信号发生器再次产生脉冲信号时在时间轴上的值,T4代表摄像机第二次收到同步信号并启动拍摄时在时间轴上的值。
图3 同步信号发生器工作原理
系统要能够在协助裁判在边界球等疑难状况下做出准确判罚,并实时地通过该系统再现比赛画面,其中很重要的一步就是快速准确地获取运动网球的三维坐标。首先对得到的网球运动二维图像数据进行边缘检测,再利用哈夫变换基本原理求取网球成像圆心的二维坐标值,最后基于两部相机之间的成像关系原理由网球成像二维圆心坐标解算得到网球的空间三维坐标值。其基本原理和实现方法如下:首先通过相机标定技术得到相机的畸变系数、世界坐标值、焦距等相关信息,然后对选取两幅同步图像进行特征提取特征匹配,最后利用两部相机之间的成像关系,调用OpenCV库中的相关函数还原网球的三维空间坐标值。其中,特征提取是通过计算机图像处理技术提取图像中的信息,并由此确定这些信息当中能唯一标定一个图像特征的特征值;特征匹配简单来说就是确定通过世界坐标系中的物体在两幅图像中的投影点之间的相互联系,根据它们之间的相互关系确定该点在三维空间中的坐标;利用OpenCV还原网球真实的空间三维坐标的主要步骤是:
(1)利用函数find Fundamental Mat()求取二维图像的基础矩阵F,然后将基础矩阵代入函数Compute Correspond Epilines()中,利用极线约束原理在两幅图像中确定相互对应的极线,并在极线上搜索唯一对应的点,由此确定其坐标值。
(2)根据以上配对完成的点坐标值以及相机参数基础矩阵,通过find Essential Mat()得到本征矩阵E,再进行SVD分解,最后得到旋转矩阵R、平移向量t和两幅图像的投影矩阵P1、P2,再根据相机成像基本原理计算网球的空间三维坐标。
实际情况下,网球空间三维坐标的分布并不完全在一条空间曲线上,需要对网球运动轨迹曲线进行空间曲线拟合运算。系统基于投影法和最小二乘法[9-10]进行曲线拟合,基本思想是先将三维问题转为二维平面问题,即首先将求得的网球空间坐标向xoy平面投影得到相应投影坐标,然后再对这些平面上的二维坐标进行曲线拟合,得到的最优解对应的网球空间三维坐标,最后将拟合完成的网球空间三维坐标存入数据库。解算网球空间三维坐标的流程示意图如图4所示。
图4 网球空间三维坐标计算流程示意图
鹰眼三维可视化系统第一人称视角漫游,可用于制作场地渲染动画,提升观赏度等。在虚拟网球场地中通过鼠标移动来控制第一人称的转向,利用键盘上的按键进行前后左右的移动。具体实现如下:
通过Unity3D引擎提供的GameObject创建Empty空物体,命名为Perspecive,把标签Tag改为Perspecive,点击Component组件,依次选择Physics->Character Controller,添加刚体(Rigibody)组件,让创建的物体具有物理特性。再勾选is Kinematic让对象不再受物理引擎的控制,使其只能通过Transform属性来操控。部分核心代码如下:
VoidMouseControl()
{
float th =Input.GetAxis(“Mouse X”); //鼠标水平方向上的移动单位数
float tv =Input.GetAxis(“Mouse Y”); //鼠标垂直方向上的移动单位数
t_cameraR.x-=tv;
t_cameraR.y+=th;
m_camTransform=t_cameraR; //根据鼠标移动距离旋转第一人称摄像机
系统通过在Canvas对象上放置控件,并挂载相应功能的脚本组件,使其能根据用户的选择动态调整观赛视角、改变场地背景贴图以及回放功能,实现系统和用户之间的交互[11]。
通过Unity3D引擎提供的GameObject功能创建八个Camera对象,并将它们置于场景的适当位置,使其对应于场地中各个摄像机对象,以此来渲染不同的视角,然后通过挂载C#脚本实现不同视角之间的切换。多视角展示效果如图5所示。
图5 多视角展示
4.3.1 设置碰撞检测
在本系统中,由于网球会与地面和周围场景产生碰撞,为了使场景还原更加逼真,通过设置环境碰撞检测来模拟网球落地以后和周围场景产生碰撞的场景。实现方法如下:
(1)通过选择Component->Physics->Rigidbody给网球添加刚体。然后右击Project,依次选择Import Package->Physic Matarials设置刚体属性。上述步骤完成以后把材质拖入到Hierachy窗口的组件中。
(2)通过添加脚本进行监听。依次选择Assets->Create->Script创建脚本:
Function t_OnCollision (t_obj:Collision)
{
Debug.Log(“Collide:”+obj.collider.name+”t_gameObject.name”);
}
其中函数t_OnCollision是在被绑定的物体发生碰撞时调用。t_Obj为被撞物体的参数,Collision为类型,t_gameobject为网球。最后将脚本文件绑定到空物体上即可。
4.3.2 获取网球运动数据与可视化
通过C#脚本组件连接数据库,获取由上文方法计算得到的网球空间三维坐标,将这些坐标数据实时传递给虚拟场景的网球对象,最后还原网球真实的运动场景。还原的网球运动场景如图6所示。其具体实现步骤如下:
图6 网球运动场景
(1)在制作好的网球对象上添加C#脚本组件,设置数据库所在的IP地址和开启的端口,创建连接套接字与数据库建立连接,获取网球三维坐标数据。部分核心代码如下:
string ConnectStr="server=(服务器地址);port=(服务器开启的端口);database=world;user=root;password=******;SslMode = none;"
MySqlConnection conn=new MySqlConnection(connet Str);
MySqlCommand cmd=new MySqlCommand("select * from city", conn);
MySqlDataReader reader=null;
conn.Open(); //打开通道,建立连接
//执行查询,并将结果返回给读取器
reader=cmd.ExecuteReader();
while (reader.Read())
{
print("ID=" + reader[0].ToString() + " ,TITLE=" + reader[1].ToString() + " ,KEYWORD=" +
reader[2].ToString() + " ,CONTENT=" + reader[3].ToString() + ".");
}
(2)在Void Update()函数体中将获取的坐标数据传递给transform.localPosition,从而改变每一帧网球对象的位置,还原出网球运动场景。部分核心代码如下:
void Update () {
transform.localPosition = Vector3.MoveTowards(tra nsform.localPosition, new Vector3(arr[i][4], arr[i][3], 0),speed * Time.deltaTime);
//实时改变网球的位置
}
随着计算机通信技术的不断发展进步,各类云平台应用程序已经成为一种新兴的信息服务模式。本系统通过部署网络云平台,让用户可以通过安装有浏览器的PC端、手机端等来访问Web服务器在线观看比赛[12]。考虑到比赛数据的安全性,将服务器部署在防火墙之后,并以分布式的方式部署在线服务系统,确保访问请求时的用户体验和服务器的稳定性。后端数据库服务器的部署,可以根据实际需求灵活布置,当系统被用于教练及运动员内部讨论分析比赛策略时,可部署在局域网内,既降低了服务器和数据的更新维护成本,又保障了比赛数据的安全性。当用户规模较大时,可以部署在云服务器上,这样可以根据用户数量动态拓展服务器的规模。其网络系统架构如图7所示。
图7 网络云平台部署结构
(1)转换模型的格式:将建立的模型导出为FBX或Unity3D支持的格式模型;
(2)模型轻量化:将模型导入Unity3D引擎,给模型添加相应的材质,并对模型进行轻量化处理,以确保其在网络云平台上运行顺畅;
(3)利用Revit建立结构化数据库;
(4)功能模块:在Unity3D引擎中编写功能模块和在本地部署的功能模块一致;
(5)数据交互模块:数据交互模块主要使用Json实现数据库、网页、Unity3D之间数据的提取、传输和保存;
(6)跨平台开发:将程序发布到WebGL;如果需要还可以将程序发布到其他操作系统上,目前Unity3D支持的操作系统如图8所示。
图8 Unity3D支持的发布平台
5.3.1 模型轻量化处理的基本原理
基于B/S模式搭建网络云平台,为了获得更好的用户体验,三维模型往往涉及到大量的细节纹理等,这就导致了模型文件相较于目前的网络而言还过于臃肿。为了解决这一问题,要求在保证用户体验的同时需要尽可能地减少需要的传输数据量。而对于减少数据传输量很重要的一步就是使用轻量化模型,但传统的轻量化模型会降低模型材质、文本、纹理等信息的质量。系统通过平面拟合轻量化模型,在保证模型质量不影响观赏体验的前提下实现模型的轻量化,其基本步骤如下:
(1)遍历构建模型的三角形,求出它们的法向量,根据这些法向量之间的夹角设定一个合适的阈值角度;
(2)将在法向量之间的角度小于预设阈值角度的三角形归为一组;
(3)计算第二步中的三角形顶点的空间坐标,并判断该组是否存在相同的顶点空间坐标,若存在则再将其归为相邻组,依次下去以三角形最少的一组作为基础多边形组。
该方法的重点是根据物体的外形规则选择合适的拟合角度作多边形,这样就能达到整个平面的相对最小化,从而实现模型数据小型化的目的。
5.3.2 模型轻量化具体实现
针对模型轻量化的算法有很多种,而模型轻量化也是有针对性的,即一些特殊的模型设计了针对模型轻量化的特殊算法。这里的云平台架构设计和功能研发主要基于Unity3D,所以轻量级模型也是在Unity3D引擎环境下实现的。Unity3D在其Asset Store中推出了MeshSimplify插件,在一定程度上实现了模型的轻量化。MeshSimplify插件包含各种轻量级算法,其核心算法也是基于上述平面拟合原理。它最显著的特点是可以遍历父对象下的所有子对象,分析每个子对象的组成,然后进行有针对性的轻量化处理。MeshSimplify插件是一个开源插件。如果有些算法不适合当前的模型,可以继承源代码类并修改它们,这样就不会破坏源代码,实现想要的新功能。通常在Unity3D中使用简单的插件,只需将带有插件的脚本MeshSimplify (Script)添加到需要轻量化的模型中。需要注意的是MeshSimplify (Script)脚本会将所有子对象进行轻量化,并将此脚本添加到空对象中。该脚本遍历空对象的所有子集,并使所有对象子集轻量化。
构建网络云平台需要将经由上述步骤轻量化处理模型以后将其上传至服务器数据库。文中以SQLServer搭建服务器数据库:
(1)在SQLServer数据中创建一个名为Tennis_database的数据库;
(2)打开Tennis_database以ODBC的方式建立数据库连接;
(3)新建数据源,并设置相应的参数,在后续的管理上可以直接通过改数据源进行管理;
(4)安装相应的数据源驱动;
(5)建立连接数据库的ODBC数据源,可通过该数据源连接数据库。
需要注意的是,将模型导入到SQLServer的过程中,每个模型都是作为一个单独的文件创建,需要将模型的数据文件分开导入到SQLServer中。这里将所有模型链接到同一个模组里,这样在通过url寻址相应的文件时相当于自动分层级,避免出现命名重复的问题。
本系统采用三维建模技术按照真实场景[13]和虚拟场景1∶1的比例搭建模拟场景,利用虚拟现实技术[14-15]细致、全面地描绘出了网球场地的三维场景。通过Unity3D平台挂载C#脚本实现和用户之间的交互。部署网络云平台降低了系统成本和拓展了应用场景。主要研究结论如下:
(1)基于Unity3D进行三维可视化系统的开发具有高度的可移植性,可兼容目前大多数主流平台。
(2)Unity3D引擎对第三方平台开发设计的模型具有良好兼容性,支持3DS Max、Google SketchUp、Maya等主流平台开发设计的模型。
(3)Unity3D引擎的渲染组件功能强大,能够生成较为逼真的场景效果,引擎提供丰富的二次开发的接口,具有良好的可扩展性和可移植性。
下一步主要工作是找出鹰眼三维可视化系统运行过程中用户在使用各种功能时的交互体验问题和系统性能问题,以便及时纠正和改进。同时,由于三维模型文件大于传统图形文件,不利于在中低端设备上运行,在采用B/S模式部署为网络云平台之后,还需要占用大量的网络带宽。为此,将继续优化系统的资源文件,以改善用户体验,降低硬件配置要求。