APP下载

虚拟环境下手部操纵物体方法探究

2018-08-21张田田何聚厚

计算机技术与发展 2018年8期
关键词:坐标值指骨碰撞检测

张田田,何聚厚

(1.陕西师范大学 计算机科学学院,陕西 西安 710119;2.陕西师范大学 现代教学技术教育部重点实验室,陕西 西安 710062)

0 引 言

虚拟现实技术是近年来发展较为迅速的计算机技术,因其具有极好的沉浸、交互和构想的特性,以及能够高精度地对现实世界和假象世界进行模拟和表现,在军事、医学、交通、游戏和文化教育等行业和部门的研究中应用广泛。虚拟现实中的人机交互是用户在虚拟环境中操作各种虚拟对象,获得逼真感知的必要条件[1]。

LEAP公司推出的Leap Motion小型传感设备,是目前较为新型的基于手部运动的虚拟现实人机交互设备。Leap Motion体感设备通过采用两个广角相机传感器和3个红外LED,能够捕捉在150°视场以及25~600 ms的有效探测范围内的多个物体,且能够对用户的手部以超过每秒200帧的速度实现实时的动态跟踪探测,精度高达1/100 ms。

在人机交互中,人体手部姿态是传递信息的重要方式[2],因此如何能够更加高效准确地实现手部操纵物体是一个重要的研究方向。现今,国内外很多学者对虚拟现实研究领域内的虚拟手操纵物体的人机交互理论都进行了不同程度的研究。例如,文献[2]研究了数据手套针对不同形状下物体的操纵方式;文献[3]对基于数据手套的虚拟手精确抓取物体的各种姿态的方法进行了研究;文献[4]研究了在工业生产中的机械手抓取物体的方法;文献[5]研究了不同的凸面物体下虚拟手抓取物体的情况;文献[6]通过建立虚拟手模型及其坐标系统,设计了根据虚拟手与物体在接触面的法向量的不同夹角决定其抓取物体的状态条件;文献[7]研究了基于数据手套的在无力反馈的情况下实现的虚拟手抓取物体的情况;文献[8]提出了基于Leap Motion的虚拟手部关键点的手部姿态估计方法,但在手部出现遮挡的情况下,该姿态估计状况急剧下降。

在Leap Motion官方提供的SDK的手部抓取虚拟物体的算法示例中,采用的是仅基于距离进行判定的算法思想,也即通过虚拟手的大拇指指尖距离虚拟物体距离的大小判定手是否处于抓取物体状态。并且该算法在求解目标物体的目标位置时仅使用大拇指指尖与食指指尖距离的中点进行计算。该算法设计过于简化,容易出现误操作的现象,同时因为不同物体需要设定的距离不同,反复地设定多个距离过于复杂,拓展性不够好。此外,在虚拟手模型对虚拟3D物体模型进行抓取操作时,会出现严重的手指穿透物体的不真实现象。

针对该问题,提出一种基于触发检测思想的虚拟手操作物体算法,通过触发检测传递出来的手部数据信息,判断手部抓取物体的不同状态。手部不触发物体,物体就没有任何操作,增加了手部控制物体的灵敏性和准确性,并且通过Unity3D引擎设计实验对算法的可行性进行了验证。

1 手部操纵虚拟物体分析

1.1 手部骨骼组成

人的手部结构可以分为腕部、手掌、手指以及手背等几个部分,在手部抓取物体时,主要依靠手掌和手指来控制物体的运动。所以,详细分析手部的组成结构对设定手部操纵物体的状态条件非常必要。以人的一只手为例,生物学上,有5块掌骨,14块指骨,指骨分为近节指骨、中节指骨以及末节指骨3类,如图1所示。在手部掌骨和指骨中,大拇指仅由3个骨骼组成,其余4根手指均由4个骨骼组成,即1块掌骨和3块指骨。在Leap Motion采集手部骨骼信息时,规定大拇指的掌骨长度为0,其余3个有长度的骨骼划入为指骨计算。

图1 手部骨骼结构

1.2 手部操作物体算法

在Leap Motion使用过程中,一定会出现虚拟手指与物体之间的接触碰撞,处理这些碰撞,使用高效率的碰撞检测算法,能够使虚拟手更实时地操纵物体。一般常用的碰撞检测算法有包围盒层次法、距离跟踪法以及空间剖分法等[9]。

文中采用触发检测来获取手部的相关信息,触发检测采用层次包围盒碰撞检测思想。层次包围盒碰撞检测算法应用比较广泛,该算法曾经在计算机图形学的许多应用领域中都被深入的研究[10]。

层次包围盒碰撞检测思想即是利用体积略大而形状简单的包围盒把复杂的几何对象包裹起来,在进行碰撞检测时首先进行包围盒之间的相交测试,如果包围盒相交则再进行几何对象之间的精确的碰撞检测[11]。文中将3D虚拟物体用形状简单的包围盒包括起来进行触发检测,通过获取的触发信息来定义手部所处的状态,从而判断手部操作虚拟物体的不同状态切换。

真实手在抓取物体时5根手指起了主要作用,以右手为例,若要抓取物体至少要有2根手指,大拇指和食指。所以定义不同的操作状态条件可以通过判断触发手指的个数,从而制定不同的状态切换条件。

根据手部抓取虚拟物体的形态判断,文中应用一个集合S描述两种抓取类型:S={Pinch,Grab}。其中Pinch元素表示捏取状态,描述仅运用手指末节指骨抓取物体的情况,当为Pinch控制状态时,通过5根手指的末节指骨对虚拟物体施加力来移动物体;Grab元素表示抓取状态,当为Grab控制状态时,通过5根手指和手掌结合对物体施加力来操纵物体的移动。

对于两种抓取类型,定义两个集合来处理抓取的状态切换。定义集合P={pinching,pinched,releasing,released},其中pinching表示手部将要捏取物体;pinched表示手部已经捏取物体,正处在操纵状态;releasing表示手部将要释放物体;released表示物体已经释放物体。同理,定义集合G={grabbing,grabbed,releasing,released},集合G的4个元素表示抓取物体过程的不同状态。

表1给出了在Pinch控制状态下手部捏取物体的各个状态需要满足的部分条件,Grab控制状态与Pinch状态下满足相同的触发条件。

表1 Pinch状态下各状态需满足的部分条件

为了增强手部操纵物体的仿真效果,防止出现误操作的情况,需要在以下控制状态下附加操作条件。

(1)当手完全处于伸展或者握拳状态时,即使触发器检测到手指,也认为用户没有意向要操纵物体。

(2)当手正在捏取或抓取物体时,手部相对虚拟物体微小的位移,不改变手部控制物体的状态。

(3)要操作的目标物体必须是刚体。

基于以上操作物体的条件,给出算法基本流程:

Step1:定义手部操作物体的不同状态条件;

Step2:根据从Leap Motion和触发器获取到的数据信息来决定手部的操作控制状态;

Step3:根据不同的控制状态决定不同的操作;

Step4:当处于pinched或grabbed状态时,计算目标物体要移动到的目标位置。当处于released状态时,目标物体脱离虚拟手控制;

Step5:回到Step1。

2 模型建立

2.1 两种控制状态下的模型建立

要实现操纵物体,除了完成抓取的动作之外,还需要在抓取的过程中实现物体的移动,这时就需要对物体的动态目标位置进行计算判断。文中求取目标物体需要移动的目标位置,通过该物体移动的速度进行计算。

根据手部模型控制虚拟物体不同的方式建立模型。当手部处于Pinch状态时,以3根手指捏取一个立方体为例。如图2所示,当3个手指的指尖与物体表面触发器接触时,以手指与触发器接触点A,B,C为顶点建立一个三角形模型,然后求解该三角形的重心点G(xG,yG,zG),点O(xO,yO,zO)为物体自身的位置坐标点,进而计算出O-G之间的距离DOG。

对于4个手指和5个手指的情况,需要建立的模型为多面体模型,如图3所示。在4个手指的情况下,建立了四面体模型。此时,需要计算该四面体的重心位置。同理,在5个手指的情况下,需要建立5个顶点的多面体模型,然后计算其重心坐标位置。对于大拇指与食指捏取的情况,建立以两只手指末节指骨中点为顶点的直线模型。

图2 三角形模型

图3 四面体模型

当手部处于Grab状态时,需要通过手指与手掌的配合来实现物体的抓取,根据Pinch状态下建模的思想启发,可以通过利用手部掌骨和指骨的骨骼中心点为顶点来建立非规则多面体模型,如图4所示。

图4 非规则多面体模型

2.2 目标位置计算

在建立的模型中,首先需要求得模型的重心坐标点G的位置,通过使用基于顶点系的重心坐标计算思想[12-13]进行求解。也即是,在空间坐标系O-xyz中,设多面体V的顶点Ai的坐标是Ai(xi,yi,zi),则组成的多面体的重心坐标G(xG,yG,zG)为:

(1)

其中,当为Pinch状态时,n=(2,…,5);当为Grab状态时,n=(2,…,20)。

通过式1计算出G点坐标之后,就可以计算出O-G两个位置坐标点的距离DOG。

(2)

其中,Δt表示每帧的间隔时间。

2.3 转换坐标系

Leap Motion采用的是右手笛卡尔坐标系,原点在Leap Motion控制器中心,返回的值是以真实世界的毫米为单位,而Unity采用的是左手坐标系,以米为单位。

如果要使用从Leap Motion中获取的手部坐标数据,则需要根据式3进行坐标转换,将毫米转换成米,需要乘以比例因子k=0.001,右手坐标系转换成左手坐标系,需要使用坐标转换向量Fz。通过式3计算出Unity坐标系下的本地坐标Plocal,该本地坐标值表示获取到的手部坐标值是相对于Unity空间中Leap Motion控制器位置的。

Plocal=k*Fz·Plp

(3)

在Unity中最后使用的坐标值,是基于Unity世界坐标系的世界坐标值,所以需要将Unity本地坐标系下的本地坐标值转换成世界坐标值。这需要坐标值在不同坐标系下进行仿射变换[14-15]。设坐标点在Unity世界坐标系下的坐标值为Pworld=[xw,yw,zw]T,运用仿射变换,该坐标值为:

(4)

其中,Mlocal→world为一个4×4的本地坐标值转换到世界坐标值的坐标变换矩阵。通过该变换可以获得手部信息在Unity世界坐标系下的坐标值。

3 实验结果

通过上述内容,设计了基本的手部控制物体操作实验。硬件环境配置为:Intel(R)Core(TM)i7-6700 CPU,3.4 GHz处理器,16.0 GB内存,NVIDIA GeForce GTX970显卡,Window7旗舰版操作系统,一台Leap Motion传感器。软件环境配置为:Unity3D引擎软件,5.1.3f1个人版本;VisualStudio2012专业版本集成开发环境;同时采用LEAP公司提供的SDK V2.3.0 for Windows获取Leap Motion传感器返回的信息数据。

通过采用几种不同形状的3D虚拟物体模型,验证了算法的可行性。图5和图6给出了未改进前算法的左右手实现捏取物体的效果图。从效果图中可以看出,未改进前算法虚拟手抓取物体出现了明显的穿透物体现象,抓取效果不够真实。图7和图8给出了改进算法虚拟手抓取物体的效果展示,可以看出虚拟手抓取物体效果明显提高。

图5 未改进算法左手抓取物体效果展示

图6 未改进算法右手抓取物体效果展示

图7 改进算法左右手捏取物体效果展示

图8 改进算法左右手抓取物体效果展示

4 结束语

通过分析手部骨骼结构以及手部运动姿态,建立了不同的非规则多面体模型,实现了左右两只手均能对Unity中构建的虚拟3D物体进行抓取、移动、释放等操作功能。文中算法基于Unity设计,实验结果表明,该算法具有良好的可行性和扩展性。因为对场景内虚拟物体使用了碰撞包围盒,所以极大降低了虚拟手指对虚拟物体的穿透现象的发生,增加了手部抓取物体模拟效果的真实性,为设计基于Leap Motion的人机交互应用提供了参考。在设计基于Leap Motion的Unity3D游戏中,可以将基于该算法设计的代码直接应用到具有触发器的3D虚拟物体和虚拟手模型上,进而实现手部模型操纵虚拟游戏物体的效果。

由于现在LEAP公司设计的Leap Motion传感器仅提供单个Leap Motion工作,在Leap Motion工作的过程中会出现手部遮挡部分无法检测的情况,这时操纵物体的效果会受到一定影响。此外,Leap Motion在检测过程中会出现丢帧现象,也会在一定程度上影响实验效果。因此,在以后的研究工作中,会思考并尝试将Leap Motion与多个计算机进行连接,使用多Leap Motion进行实验操作,以及将其与其他体感设备(如Kinect)相结合,从而增强手部操纵物体的综合实验效果。

猜你喜欢

坐标值指骨碰撞检测
整体最小二乘法坐标转换在河道测量中的应用
钢丝横穿末节指骨法治疗锤状指的临床疗效
基于动力学补偿的机器人电机力矩误差碰撞检测
单枚克氏针髓内穿梭法闭合复位内固定治疗儿童Ⅱ型指骨颈骨折
全新预测碰撞检测系统
基于BIM的铁路信号室外设备布置与碰撞检测方法
探讨Excel2007与ArcGis10.0结合提取小班四至界限的坐标值
基于Virtools的虚拟灭火系统碰撞检测设计与实现
微型自攻空心螺钉治疗掌指骨关节内小骨折
微型钢板与克氏针治疗掌指骨骨折的疗效对比分析