基于Unity3D虚拟针灸碰撞检测仿真
2022-03-05吕珊珊梁富娥刘东华
吕珊珊 张 伟 梁富娥 刘东华 顾 旋
(甘肃中医药大学信息工程学院,甘肃 兰州 730100)
1 引言
针灸作为传统中医诊疗手段的重要组成部分,在形成、应用与发展过程中表现出鲜明的民族文化特征。但是,针灸诊疗手段会在治疗过程中对患者产生疼痛等危害。患者在进行针灸治疗时,对于新手医生会有很大的排斥感,这就导致很多新人中医长时间得不到实际的针刺练习,无法积累针灸治疗经验,不利于培养中医的针灸治疗水平。虚拟针灸系统可以有效解决这一难题。在虚拟针灸系统建设过程中,碰撞检测技术的应用能够有效保证虚拟场景真实性,因此,应当加强对虚拟检测技术的应用研究,保证虚拟画面流畅性,提高虚拟场景真实性,才能促进虚拟针灸系统为中医针灸诊疗方法教育过程提供更好的服务。
2 虚拟针灸系统
2.1 虚拟针灸系统介绍
针灸学是在中医理论指导下,研究经络、腧穴、刺法灸法,探讨运用针灸防治疾病规律的一门学科,相较于中医基础理论课程而言,针灸学是一门实践性较强的课程[1]。针灸针法指的是根据中医经络理论,将针具按照一定的角度刺入患者体内,通过捻转与提拉等手法刺激特定穴位,从而达到治疗疾病的目的。但是,传统的练习方法有两种,一种是在人体身上进行扎针练习,若是误取穴位或是针灸手法不准确,就会导致人体出现疼痛、内出血等不良反应,具备一定的危险性;另一种则是制作纸垫、棉团,在上面反复练习,但纸垫、棉团与人体的物理特性不同,完全无法体现出毫针刺入皮肤、肌肉和触及骨骼的不同力感[2]。无论哪种方法都会增加针灸练习的困难程度。
虚拟现实技术(Virtual Reality,VR)利用计算机生成一种可对参与者直接施加视觉、听觉和触觉感受,并允许其交互地观察和操作虚拟世界的技术[3]。虚拟针灸系统就是将虚拟现实技术利用在针灸刺针练习过程中,将针刺训练进行仿真,中医在练习针灸治疗手法时,可以在虚拟世界中完成刺针练习,既能够有效避免针灸练习过程中对人体产生的伤害情况,又可以观察不同针刺手法下针具刺入皮肤的角度与深度,还可以通过力反馈技术感受针灸治疗过程中皮肤弹性对针具产生的阻力大小,有利于中医掌握针刺力度。
2.2 Unity 3D碰撞检测
Unity 3D作为实时3D内容创造和运营平台,支持通过编写脚本代码控制物体模型等完成游戏、设计等动画开发过程。Unity 3D对于编程语言的包容性极强,包括C#、C++、JavaScript等多种编程语言,由于C#语言更能体现Unity 3D软件的编程思想,所以本文中使用C#语言来编写脚本代码。
碰撞检测技术作为虚拟针灸系统的关键技术,会直接影响虚拟针刺过程的真实程度。Unity 3D碰撞检测的算法主要有以下两种包围盒算法[4],即AABB包围盒以及OBB包围盒。两种包围盒算法的原理、特征、缺陷、应用等对比见表1。
表1 AABB包围盒与OBB包围盒对比
OBB包围盒算法具备方向任意性的特征,更适合针灸不同刺针角度的模拟,所以本文选择OBB包围盒算法。OBB包围盒算法在Unity3D中应用在较多的碰撞器中,包括Box Collider,Sphere Collider,Capsule Collider,Mesh Collider,Wheel Collider等。
3 虚拟针灸碰撞检测仿真
3.1 模型设计准备
本次实验中,选择较为流行的开发模式,涉及针具(毫针为例)以及人体模型的建立过程。首先,在Maya建模软件中,建立完整的毫针模型以及人体模型。
现阶段,较为流行的手工建模方法主要包括NURBS和Polygon建模两种,由于Polygon建模方法可以使用任意的多边形面,适用于较为复杂的表面细节处加线,因此本次实验模型选择Polygon建模方法。其次,将完整的人体模型以及毫针模型保存为.Fbx格式,即可直接导入至Unity3D软件中。通过编写脚本程序即可控制针灸模型与人体模型的运动过程。
3.2 虚拟场景设计
将毫针与人体.Fbx模型放入Unity3D项目文件下的assets文件夹下或者直接将模型拖入assets文件下,就可以在Unity3D-assets文件夹直接看到模型数据,将模型拖入场景中,根据人体与针灸的大小比例,在transform窗口下调整模型position、rotation和scale数据,就可以对模型的位置、角度以及大小比例进行调整,另外加上Unity3D中自带的plane模型,即可简单完成虚拟针灸场景构建。为缓解碰撞检测过程PC运行压力,本次实验中直接选择Unity3D自带材质球完成场景渲染工作。虚拟场景设计时,场景自带Main Camera组件以及Directional Light组件,为虚拟场景提供摄像机视野范围以及灯光照明功能。
3.3 碰撞检测应用
应用Unity3D开发平台进行碰撞检测实验时,为防止毫针模型与人体模型在运行过程中出现下沉的现象,应当为模型添加刚体组件(rigidbody)。确定毫针模型为运动模型,将test1脚本程序挂在毫针模型上运行,test1脚本程序可以控制毫针的运动速度以及使用方向键控制运动方向,与穴位点触发碰撞检测之后,使穴位点显示红色。在实验设计中,为虚拟的三维针灸模型、人体模型以及暂时充当穴位点的球体模型添加相应的碰撞体组件,划分碰撞区域。对于复杂的模型,可以选择添加多个碰撞体组件的方式提高碰撞检测精确度。由于本次实验的针灸模型主要涉及毫针针尖与穴位的碰撞检测过程,所以在添加碰撞组件时仅选择单一的碰撞组件,不会对模型进行物理分解,但需要对碰撞组件包围盒的位置及大小进行适当的调整,从而达到提高控制精度的目的。为针灸模型添加胶囊碰撞体后,根据针灸模型在空间坐标轴的位置以及比例设置包围盒的中心位置及大小参数,针灸 模 型 空 间 坐标位置position:X=3.98,Y=1.32,Z=2.16,scale:X=7.6,Y=10.4,Z=7.6。为使包围盒更加贴近针灸模型外轮廓形状,提高证碰撞检测过程的精确度,包围盒中心点位置参数需根据针灸模型的相对位置确定。当包围盒高度、方向参数设置为height=1,direction=Y-Axis时,包围盒位置参数应设置为position:X=0,Y=0,Z=0.5,此时包围盒位置形状更加贴合针灸模型外部轮廓形状,如图1所示。
图1 针灸模型添加胶囊碰撞体组件
碰撞检测脚本代码为:
为模型添加碰撞组件之后即可进行碰撞检测实验。在针灸test1脚本中,首先为针灸添加移动速度,在方向键控制毫针模型移动过程中,若毫针与标记穴位的球体模型产生碰撞时,根据脚本程序设定,应当在检测到碰撞时,穴位球体模型变为红色。
4 实验效果分析
基于Unity3D的虚拟针灸碰撞检测仿真实验运行中,使用者可以通过操纵方向键实现毫针模型的控制过程,当检测到毫针模型与穴位模型发生碰撞时,穴位模型可根据脚本设置变为红色,如图2所示。一般情况下,帧率维持在30FPS左右标志画面能够流畅运行,且数值越大标识画面越流畅。虚拟针灸碰撞检测仿真实验的运行时,运行帧率数据维持在73FPS左右,如图3所示,这就表示虚拟针灸碰撞检测仿真实验运行画面较为流畅。
图2 检测碰撞后穴位模型变红色
图3 虚拟针灸碰撞检测仿真运行数据
5 结语
为有效解决针灸练习过程中使用铜人等真实模型无法观察针刺角度与深度以及真人练习时产生一定伤害的问题,应当将虚拟现实技术应用在针灸练习过程中。Unity 3D对于模型以及编程语言具备强大的包容性,基于Unity 3D引擎进行虚拟针灸碰撞检测仿真,能够较为便利地使用各类碰撞检测组件,检验模型的碰撞检测效果。经过多次调试,碰撞检测仿真过程运行效果良好,使用者可通过控制针灸模型运动方向,检验自身对穴位点正确位置的掌握程度,运行时画面流畅度也能够满足画面真实性的基本要求,能够为针灸练习人员提供良好的练习环境。