APP下载

基于MFC和OpenGL的虚拟人体经络穴位模型实现方法

2018-03-29许玉龙张佩江王忠义盛梦园赵玉梅王兵营

计算机与现代化 2018年3期
关键词:人体模型经络线段

许玉龙,张佩江,王忠义,盛梦园,赵玉梅,王兵营

(1.河南中医药大学信息技术学院,河南 郑州 450046; 2.郑州大学信息工程学院,河南 郑州 450003;3.河南中医药大学第三附属医院,河南 郑州 450046)

0 引 言

中医是中国文化的国粹之一,而人体经络穴位是中医最具特色的内容。但人体经络穴位数目庞大,在学习实践中难于记忆。为此,中医学者们制作了人体穴位的模拟实物及挂图,准确标出穴位的位置和名称,这样对记忆起到了一定辅助作用,但由于较为枯燥,还是存在学习难、记忆难问题。随着计算机、三维仿真技术的发展[1],相关专业人员不断地研究,试图制作出更具形象化的经络穴位人体模型。

相关学者提出将数字化引入针灸学领域,使针灸学三维立体表达模式历经数代得以实现[2]。并以此为平台,促进针灸学在经络、腧穴实质研究,使得针灸治疗机理探讨及临床教学方面有新的突破[3]。

郑绍华等人[4]通过样条曲线在计算机中拟合了人体经络线,并利用VC++和OpenGL(Open Graphics Library)三维图形库,设计了一种在三维环境下人机交互式的操作来引导经络循行动画,达到实时仿真的效果,但只是对人体经络线进行了三维仿真。黄咏等人[5]将经络研究成果与图形学结合,使用Maya软件和微软工具包,构建了动态演示的三维虚拟人体模型。该模型具有良好的视觉效果,为经络和针灸的教学演示提供帮助。类似地,杨宇航等人[6]将虚拟现实应用于针灸的教学与训练,他们使用三维扫描和逆向工程方法,建立三维人体模型VRML文件,然后建立VRML格式小球表示模型上的穴位点,最后将人体模型、穴位小球、经络线以及穴位说明文件整合,实现了针灸教学辅助系统。

现有虚拟人体技术反映了解剖学上的细节,但未能对经络和中医人体穴位解剖进行描述。针对该问题,罗群芳等人[7]以人体穴位真实标本为基础,用3DMAX技术建立穴位定位及针刺方向描述模型,以及层次型文本知识体系解释模型。类似地,在三维人体模型数据的读取、显示、穴位信息显示,皮肤变形仿真及虚拟针灸过程仿真设计方面,相关学者[8-9]进行了深入研究与探索。陈沁[8]把中医经络和计算机可视化技术相结合,开发了三维人体经络可视化展示系统,并将模型显示、经络显示等功能移植到移动设备。毛烨[9]结合图形学和三维动画技术,在虚拟人体经络系统中对针灸操作过程进行仿真,尤其是通过皮肤变形效果来模拟针灸过程中力的作用。长期以来,在中医经络腧穴学实验教学中,所用挂图和模型缺乏交互性,孙杰等人[10]针对该问题,采用三维虚拟场景描述的VRML语言,开发了可直观、形象、多视角展示的人体经络腧穴系统。最近,张季等人[11]在Unity3D平台上设计了数字人体腧穴教学信息系统,为经络、腧穴教学提供了新的方法和手段,也为中医针刺知识普及提供了新的途径。

利用信息技术对人体经络穴位的研究属于交叉学科研究领域,也是近年来研究的热点。但总结上述成果发现:1)现有的虚拟人体经络模型主要用于教学,经络和穴位都是以明文的方式在模型表面显示,较少模型具有穴位测试与练习功能。2)模型较少具有交互功能,目前,随着触控一体机、展示机等触摸式设备的普及,如果模型能够运行在大型的触摸展示设备,并具有较好的人机交互功能,则将有较高的应用和推广价值。

针对上述存在问题,本文基于OpenGL和MFC(Microsoft Foundation Classes)技术,设计开发可交互式的虚拟人体经络穴位模型。首先采用3DMAX建立人体模型以及穴位点、经络线段,然后利用OpenGL结合MFC类库开发,对模型、穴位点、经络线加载和渲染,并部署运行到触摸式一体机上。并且详细阐述系统实现的框架和流程,以及在开发过程中涉及的关键技术,如使用动态方向调整来显示穴位点名称,使用全局函数传递消息来提高模型加载响应的效率,给出触摸点坐标快速获取的方法。模型具有动态人机交互功能,用手指触摸能够实现模型的放大、缩小、旋转、定穴、经络循环等操作。模型具有穴位测试功能,该功能下所有穴位信息在人体表面均不显示,当手指触发到正确的穴位位置时,其名称才显示并播放穴位信息。模型系统具有较好的交互性,能够帮助针灸专业学生、医疗人员学习和测试经络穴位信息。

1 研究理论与基础

1.1 经络穴位的定位

在对经络穴位定位时,选取标准亚洲男性作为基础模型,依据“同身寸”概念建立与基础模型密切相关的三维坐标[12]。该坐标系是一个绝对坐标系,它与实际尺寸的对应关系与三维数据分辨率有关,与图像的具体内容无关。同时,严格依照经络腧穴的国家标准,对经络和穴位进行定位及标注[13-14]。

1.2 MFC框架和OpenGL

MFC是微软的类库,以C++类形式封装了Windows的API,且包含应用程序框架,减少开发人员的工作量。它包含大量Windows句柄封装类、内建控件和组件封装类[15]。让用户容易地使用微软专业的SDK来进行应用程序开发,同时又集成了C++运行高效的优势。因此,本文采用MFC类库开发用户交互界面模块,并利用函数回调机制实现模块间的通信,相关实例证明该方法可有效提高软件的效率和稳定性[16]。

但是,仅有界面交互模块不能满足三维人体模型的动态渲染,本文采用OpenGL来实现模型的渲染。OpenGL是一个跨编程语言、跨平台的编程接口,也是一个功能强大、调用方便的底层图形库[17-18]。它可以与Visual C++紧密对接,保证算法的正确性和可靠性。它能实现点、线、复杂的三维物体建模,也可以实现平移、旋转等变换,其变换方法有利于减少算法的运行时间,提高三维图形的显示速度。

因此,本文在Visual Studio开发环境下,利用OpenGL和MFC优势互补实现人体模型的构建和交互,仿真实现三维人体模型并高效加载渲染模型以及动态人机交互的目的。

2 仿真方法与实现过程

2.1 建立三维人体模型

建立初始模型是一个三维的亚洲裸体男性,使用3DMAX建立初始人体模型,人体模型的表面光滑如图1所示。注意初始模型表面没有穴位点等任何信息。

图1 三维人体模型图

2.2 建立穴位点

在中医腧穴专业教师的指导下,依据经络穴位国家标准[12],利用Maya软件建立穴位点和经络线段,建立方法如下:

1)导入人体基础模型,建立穴位点—打开场景—找到文件people模型,选中人物模型,激活选定对象,如图2所示。

图2 激活选定对象

2)点击菜单栏—创建—多边形基本体—球体,如图3所示(注意:交互式创建处于勾选状态)。

图3 创建多边形球体

3)调整球体大小,按下鼠标左键进行拖拽,调整球体(即穴位点)大小至合适为止,如图4所示。操作快捷键分别为q选择目标、w移动目标、e旋转目标、r调整目标大小。

图4 调整穴位点大小及位置

穴位点圆球和角色为父子关系,即身体变大穴位球会跟着变大。

2.3 建立经络线段

1)点击菜单栏—创建—多边形基本体—圆柱体,如图5所示(注意:交互式创建选项为不勾选状态)。

图5 创建圆柱体的经络线段

2)用工具架的缩放工具对圆柱体缩小到适合的大小,用移动工具移动到合适的位置,如图6所示。

图6 调整经络线段位置和大小

3)对线段分片,即调整细分数。在工作区通道栏—输入—polyCylinder1—将高度细分数调大到8或10,如图7所示。

图7 调整高度细分数

4)将经络线调整弯曲,以便紧贴在人体模型皮肤的表面。选择圆柱体模型—点击鼠标右键—选择顶点,如图8所示。

5)用移动工具和旋转工具分别调整每一圈的顶点使其与皮肤表面贴合,如图9所示。

图9 调整每一圈顶点

6)在圆柱体上鼠标右键切换到对象模式,如图10所示。

图10 切换到对象模式

7)在圆柱体选中状态下,执行菜单栏—法线—软化边。圆柱体形状会更加平滑,如图11所示。

图11 软化边

依上述方法,建立其他穴位点之间的经络线段。需要注意的是,在创建穴位点时需勾选“交互式创建”选框,但创建经络线段时,不需勾选该项。

基于中医经络穴位理论和国家标准[14],按照上述方法创建人体模型、所有穴位点、穴位点之间线段等基础工作后,分别将其导出为obj格式文件,供后期程序调用。共创建1个人体模型(body.obj)和12条经络,每条经络中包含若干个穴位点、点间线段。每个经络包含的所有文件存到一个文件夹中,命名为该经络的拼音首字母,如图12所示,其中1_styfj文件夹存储的是手太阴肺经穴所包含的所有穴位点、线段、录音文件。打开手太阴肺经文件夹,其包含的穴位点、经络线段如图13所示,其中point是穴位点、segment是线段、wav文件是对应穴位点的语音,用于点击穴位点时播放该穴位信息。

图12 创建的人体经穴模型文件夹

图13 手太阴肺经穴位点和经络线模型文件

2.4 基于MFC和OpenGL仿真实现方法

三维人体经络穴位模型采用MFC和OpenGL进行实现。在VS工程中创建以下几个类:类CBodyRenderDlg实现整个模型的调用及框架,是工程功能的主要文件;类CObjLoadModel实现模型的加载功能;类CObjModelRender实现模型的渲染及处理,是显示模型的具体方法;类CControlPanelDlg实现不同功能之间切换。

穴位显示功能实现过程为:程序运行时,初始化InitInstance()函数,创建CBodyRenderDlg类实例dlg。

1)类CBodyRenderDlg是工程实现功能的主要实现文件,进入类的构造函数。构造时分别构造类CObjModelRende实例m_openglRender,类CObjLoadModel实例m_model,类CControlPanelDlg实例m_ctrlPanelDlg。

2)依次进入上述实例的构造函数,上述全部初始化完成,返回类CBodyRenderDlg中,进入OnInitDialog()函数,在此函数中调用OnPaint()函数。

3)然后执行m_openglRender.Render,即调用类CObjModelRender中的Render函数。其功能是渲染模型,依据传递的模型和功能选择值,调用OpenGL函数渲染显示模型,默认功能值是穴位显示功能。

4)渲染模型和穴位,进入穴位显示功能。

穴位记忆功能实现方法:系统运行时默认进入穴位显示功能。

1)点击穴位记忆功能时,类CControlPanelDlg中的函数OnBnClickedAcupointsLearnBtn()被响应。

2)::PostMessageW(GetParent()->GetSafeHwnd(), WM_ACUPOINT_LEARN, 0, 0)函数被调用,功能是向窗体BodyRenderDlg发送消息,到CBodyRenderDlg类中的OnAcupointsLearn函数,实现具体功能。

3)然后进入类CBodyRenderDlg中的OnAcupointsLearn()函数,修改功能参数为记忆功能。

4)调用m_openglRender.Render()函数。渲染、传递模型obj和rp.DisplayModel值,依据DisplayMode值进行功能选择。在Render函数中调用CObjModelRender::DisplayAcupoints()函数。

5)进入DisplayAcupoints()函数,它是显示穴位最底层的实现函数。注意,它可在各种功能下被调用,依据rp.nDisplayModel的值来判断具体某个功能。

6)切换到穴位记忆功能结束,屏幕上只显示穴位点,不显示穴位名称。

在穴位记忆功能中,当点击穴位点时该穴位名称即被显示出来,具体实现过程如下。

7)点击穴位点时,函数OnLButtonDown()被响应,发现m_renderParam.nDisplayModel的值为穴位记忆功能,即在此功能下,调用获取指针光标的函数CObjModelRender::DisplayNameAccordCoor(),判断点击的光标是否在穴位点上。

8)CObjModelRender::DisplayNameAccordCoor()函数被执行,确定光标在穴位点上,然后调用Render(pObj, rp)函数,OpenGL渲染。

9)进入函数Render()实现渲染。判断在穴位记忆功能下,调用函数DisplayAcupoints(),显示该穴位的名称,实现功能。

经络学习功能的实现过程与上述2个功能类似,在此不再详述。

2.5 实现的关键技术

在模型仿真实现过程中,遇到诸多问题和困难,通过对问题分析研究,本文采用一些关键技术来解决遇到的问题,主要有以下3个方面。

技术1解决穴位名显示问题。现有实体模型在显示穴位名时,都直接显示于模型皮肤表面。本文的三维虚拟人体经络穴位模型在初始版本中,将穴位名字显示于模型表面。但是,由于模型具有放大、缩小功能,且模型表面不平整,存在起伏,使得穴位名称在显示时,出现重叠、显示不完整、部分文字内嵌到皮肤内等问题。

为解决该问题,本文使用延长线动态调整方法来显示穴位名称,使得在不同视角下,穴位名称都能完整正常地显示。具体算法如算法1所示。

算法1

输入:人体模型和穴位点模型

输出:穴位点延长线及穴位名

1 定义穴位点的6种显示方向,分别为前、后、左、右、上、下

2 For当前视角中,计算视角度数及包括的穴位点

3 For每一个穴位点

4 计算穴位点视角与当前屏幕视角的差异

5 If视角方向差异同向

6 延长线显示穴位名

7 调整显示方向为上下

8 If视角方向差异为垂直

9 延长线显示穴位名

10 调整显示方向为左右

11 If视角方向差异为逆向

12 延长线显示穴位名

13 调整显示方向为前后

14 End

15 End

技术2穴位、经络线段数量较大。不包含奇穴,人体共有14经脉361穴位,即建立了361个穴位点模型,约350个点间线段模型,上述每个模型都是一个用文本存储的obj文件,存储了模型的顶点、法线、纹理坐标和材质信息,系统需要对所有的模型进行加载渲染。

在加载渲染时,全部使用指针、指针数组、指针向量来操作,提高加载运行的效率。特别是在功能切换时,为提高加载速度,使用全局函数来传递消息。如::PostMessageW(GetParent()->GetSafeHwnd(),WM_ACUPOINT_L, 0, 0)。WM_ACUPOINT_L是功能的选项值。

技术3触摸响应的实现方法。触摸屏为42吋以上的大屏幕。触摸控制的实现见图14~图15。当在电极施加电压时,导电层会形成均匀的电压分布。计算触摸点的X轴、Y轴坐标的方法如下:若在X方向的电极对上施加电压,而Y方向电极对不加电压,在X平行电压场中,触点处电压值可在Y+(或Y-)电极上得出,测量Y+电极对地的电压值,便可得触点的X坐标值。同理,当在Y电极对上施加电压,X电极对上不施加电压,测量X+电极电压,可得知触点的Y坐标。测量原理如图16~图17所示。

图14 触摸控制实现电路图

图15 触摸点示意图

图16 触摸点X坐标值

图17 触摸点Y坐标值

依据图16~图17,使用以下公式计算出其坐标值,计算X坐标值如式(1)所示:

(1)

计算Y坐标值如式(2)所示:

(2)

取得X和Y的坐标值以后,交由消息响应函数,根据功能需要来进行下一步处理。

3 系统功能演示

如前所述,本仿真人体模型系统主要有3个功能,详见图18所示。

图18 模型系统功能模块

1)穴位显示功能。点击该功能,人体模型表面显示所有穴位点,同时显示穴位名称,模型能够放大、缩小、旋转,如图19所示。

图19 穴位显示功能

2)穴位记忆功能。该功能的模型表面只显示穴位点,不显示穴位名称。当点击某个穴位点时,屏幕上会显示出该穴位的名称、位置信息,并播放该穴位录音。如图20所示。

3)经络学习功能。选择该功能时,系统给出所有经络的名称和颜色(类似于地铁售票时所有站点展示),用户选择某一个经络时,模型表面仅仅显示出该经络的所有穴位,并且从该经络的初始穴位开始,逐一连线动画显示每个穴位点和穴位名,直到最后的穴位被显示,同时播放经络介绍的录音,如图21所示。

图21 经络学习功能

系统的所有功能,都能够实现对模型的旋转、放大、缩小、移动等操作。系统能够安装在立式一体机中,实现用手指完全触控屏幕操作,具有良好的交互性和展示效果,目前该系统产品已经开发完成,且在河南中医药大学第三附属医院内部的展览馆投入使用,现处于商业推广阶段。系统的动态展示视频见网址www.xuyulong.com页面最底部,点击成果展示视频。

4 结束语

本文介绍了交互式三维虚拟人体经络穴位模型系统的实现方法。首先建立人体模型以及穴位点、经络线段,然后利用MFC和OpenGL对模型、穴位点、经络线加载和渲染,并部署到触摸式一体机上。并且,详细阐述了系统实现的框架和流程,以及在开发过程中涉及的关键技术,如使用动态方向调整来显示穴位点名称、使用全局函数传递消息来提高模型加载响应的效率、给出触摸点坐标快速获取的方法。模型系统具有动态人机交互功能,用手指触摸能够实现模型的放大、缩小、旋转、定穴、经络循环等操作。模型系统较好的交互性能帮助针灸师学习和测试穴位掌握情况,也为穴位爱好者提供较真实的穴位知识。

目前该系统产品第一个版本已经开发完成。下一步将继续完善修复系统存在的漏洞,以及加快推广到实际有需求的部门。

[1] 张伟江. 人体经络、数学建模与仿真研究[J]. 自然杂志, 1992(9):643-646.

[2] 毕思文,吴广林. 数字人体与中医药现代化[J]. 中医药学刊, 2004,10(z1):584-588.

[3] 肖田元. 仿真是信息时代认识与改造世界的第三种方法吗[C]//中国系统仿真学会2007年仿真科学技术发展及应用研讨会论文集, 2007.

[4] 郑绍华,陈国栋,林伟明,等. 人体经络循经感传的三维虚拟仿真研究与实现[J]. 计算机仿真, 2008,25(11):251-255.

[5] 黄咏,李建微,郑绍华,等. 计算机三维人体经络模型构建研究[J]. 计算机与数字工程, 2007,35(11):33-35.

[6] 杨宇航,李志忠,任晓丹,等. 基于虚拟现实技术的中医针灸教学系统[J]. 系统仿真学报, 2007,19(10):2379-2383.

[7] 罗群芳,卢林潇,方慧,等. 3DMAX在虚拟人穴位模型三维重建中的应用[J]. 计算机时代, 2012(5):16-17.

[8] 陈沁. 基于3D人体模型的中医经络可视化展示系统[D]. 广州:华南理工大学, 2012.

[9] 毛烨. 基于OpenGL虚拟针灸的三维仿真设计与实现[D]. 成都:电子科技大学, 2012.

[10] 孙杰,吴春雨. 基于Web的经络腧穴学三维虚拟实验设计与开发[J]. 中国医学教育技术, 2016,30(3):277-281.

[11] 张季,张宏如,董海艳,等. 基于Unity3D技术的数字人体腧穴教学信息系统的设计与实现[J]. 中国医学教育技术, 2014(2):139-142.

[12] 方进,邱峰朝. 人体腧穴体表定位比例尺的研制和应用[J]. 上海针灸杂志, 2014(12):1183-1184.

[13] 侯书伟,马祖彬,李永春. 论腧穴分类教学:《经络腧穴学》腧穴规范化教学方法探讨[J]. 中国针灸, 2010,30(10):865-869.

[14] GB/T 12346-2006, 腧穴名称与定位[S].

[15] 范志先,孙殿柱,李延瑞,等. 采用MFC开发用户交互界面的新方法[J]. 工程图学学报, 2008,29(4):160-163.

[16] 刘军,金耀. 基于VC 6.0和OpenGL的三维试衣系统研究[J]. 计算机应用研究, 2008,25(12):3824-3825.

[17] 吕珍,谢倩,祝双武,等. OpenGL导入3DS模型模拟服装试穿[J]. 西安工程大学学报, 2014(4):440-444.

[18] 李素芳,谷林. 基于3DS与OpenGL的三维人体模型构建方法[J]. 软件导刊, 2013(12):158-160.

猜你喜欢

人体模型经络线段
画出线段图来比较
关于经络是一种细胞外基质通道的假说
怎样画线段图
我们一起数线段
4个表现自测经络是否畅通
数线段
基于乘员体型的车辆安全性研究
Family makes 45—foot icicle in front yard
体验创新:3D人体扫描仪测三围
经络考证