毕业论文人体三维骨骼运动仿真研究.doc

上传人:文库蛋蛋多 文档编号:3972303 上传时间:2023-03-30 格式:DOC 页数:35 大小:524KB
返回 下载 相关 举报
毕业论文人体三维骨骼运动仿真研究.doc_第1页
第1页 / 共35页
毕业论文人体三维骨骼运动仿真研究.doc_第2页
第2页 / 共35页
毕业论文人体三维骨骼运动仿真研究.doc_第3页
第3页 / 共35页
毕业论文人体三维骨骼运动仿真研究.doc_第4页
第4页 / 共35页
毕业论文人体三维骨骼运动仿真研究.doc_第5页
第5页 / 共35页
点击查看更多>>
资源描述

《毕业论文人体三维骨骼运动仿真研究.doc》由会员分享,可在线阅读,更多相关《毕业论文人体三维骨骼运动仿真研究.doc(35页珍藏版)》请在三一办公上搜索。

1、1 引言OpenGL作为一种三维工具软件包,在交互式三维图形建模能力和编程方面具有无可比拟的优越性。OpenGL是SGI公司开发的,可独立?操作系统和硬件环境的三维图形库,已在各种工作站和高档微机中运行,由于其强大的图形功能和跨平台的能力,已成为事实上的图形标准,被人们广泛应用于科学可视化、实体造型、CAD/CAM、模拟仿真等诸多领域。在医学应用中,人体骨骼的使用能使医生和病人之间有一个良好的沟通,使病人能知道自己的病情,能很好的配合医生进行有效的治疗;在实践教学中,通过对人体骨骼的展示,教师能很好的讲解各个骨骼关节之间的运动关系,从而使学生对骨骼和骨骼关节之间的运动关系有更深刻的理解。课题来

2、源于徐州翰林高科技公司,该公司主要从事医学图像处理软件研究与开发。课题“人体三维骨骼运动仿真研究”的目的是利用三维仿真技术,利用骨骼模型进行编程和控制展示人体骨骼及运动,主要包括三维建模技术及实现,人体运动方式设计等.课题是以visual C+和OpenGL为编程环境来仿真人体骨骼运动,通过对人体主要骨骼和骨骼之间的运动关系来展示人体的奇妙之处。2 需求分析2.1功能需求分析本设计是根据徐州翰林软件公司的要求,整理出人体骨骼的运动过程,并对该过程进行了细心的分析得出了如下的需求分析。 通过对徐州翰林软件公司的要求分析,得出系统应具有的功能如下:2.1.1全景视图1)点头:当用户想了解点头的具体

3、细节时,通过键盘或鼠标操作能使骨骼做点头动作。2)摇头:当用户想了解摇头运动的具体细节时,通过键盘或鼠标操作使骨骼做摇头运动。3)抬左臂:当用户想了解左臂运动的具体细节时,通过键盘或鼠标操作使骨骼做抬左臂运动。4)抬左肘:当用户想了解左肘运动的具体细节时,通过键盘或鼠标操作使骨骼做抬左肘运动。5)抬右臂:当用户想了解右臂的具体细节时,通过键盘或鼠标操作使骨骼做抬右臂运动。6)抬右肘:当用户想了解右肘运动的具体细节时,通过键盘或鼠标操作使骨骼做抬右肘运动。7)抬左大腿:当用户想了解左大腿运动的具体细节时,通过键盘或鼠标操作使骨骼做抬左大腿运动。8)抬左小腿:当用户想了解左小腿运动的具体细节时,通

4、过键盘或鼠标操作使骨骼做抬左小腿运动。9)抬右大腿:当用户想了解右大腿运动的具体细节时,通过键盘或鼠标操作使骨骼做抬右大腿运动。10)抬右小腿:当用户想了解右小腿运动的具体细节时,通过键盘或鼠标操作使骨骼做抬右小腿运动。11)旋转:当用户想了解旋转的具体细节时,通过键盘或鼠标操作使整个骨骼做旋转运动。12)走步:当用户想了解走步的具体细节时,通过键盘操作使骨骼进行走步运动。13)放大:当用户想了解放大的具体细节时,通过鼠标操作来放大骨骼。2.1.2侧顶视图1)点头:当用户想了解点头运动的具体细节时,通过键盘或鼠标操作能使骨骼做点头动作。2)摇头:当用户想了解摇头运动的具体细节时,通过键盘或鼠标

5、操作使骨骼做摇头运动。3)抬左臂:当用户想了解左臂运动的具体细节时,通过键盘或鼠标操作使骨骼做抬左臂运动。4)抬左肘:当用户想了解左肘运动的具体细节时,通过键盘或鼠标操作使骨骼做抬左肘运动。5)抬右臂:当用户想了解右臂运动的具体细节时,通过键盘或鼠标操作使骨骼做抬右臂运动。6)抬右肘:当用户想了解右肘运动的具体细节时,通过键盘或鼠标操作使骨骼做抬右肘运动。7)抬左大腿:当用户想了解左大腿运动的具体细节时,通过键盘或鼠标操作使骨骼做抬左大腿运动。8)抬左小腿:当用户想了解左小腿运动的具体细节时,通过键盘或鼠标操作使骨骼做抬左小腿运动。9)抬右大腿:当用户想了解右大腿运动的具体细节时,通过键盘或鼠

6、标操作使骨骼做抬右大腿运动。10)抬右小腿:当用户想了解右小腿运动的具体细节时,通过键盘或鼠标操作使骨骼做抬右小腿运动。11)旋转:当用户想了解旋转的具体细节时,通过键盘或鼠标操作使整个骨骼做旋转运动。2.2性能需求分析 正确性:根据人体骨骼系统的运动设计软件,运动中的每一个操作在系统中都必须有所体现,保证程序的正确性。3概要设计3.1模型格式选择保存三维图形数据的方法多种多样,有参数曲线法、CSG描述法等等,但常用的保存三维模型的方法是多边形逼近法,即用许多小多边形拼出模型的外观,文件中保存这些多边形的信息。由于OpenGL中提供了最基本的由多边形构造三维模型的方法,因此从三维图形数据文件中

7、读取模型数据并在OpenGL中绘制就很容易。3ds模型数据格式和obj模型数据格式都是三维图形数据格式,3ds模型数据格式是目前大多数图形数据素材库中保存三维图形数据的最常用格式。3ds文件由许多块组成,每个块首先描述其后的信息类别,即该块是如何组成的,块的信息类别是用ID来标识的,块还包含了下一个块的相对位置信息,其具体信息附录A。 Wavefront 的obj模型文件结构非常简单。首先,它是由一些文本行组成的,每一行文本都是由一个关键字开头,紧跟着后面是该关键字所表示含义的具体参数,obj文件不仅可以定义多边形模型,也可以定义自由曲面模型。多边形模型就是可以用点、线、面等基本元素构造的模型

8、,而自由曲面模型是指使用参数曲面造型定义的模型。Obj模型数据格式的详细信息见附录A。 本系统是采取Wavefront的obj格式。 3.2模型选择 从Poser 5.0中导出人体骨骼模型,有成人和小孩的骨骼模型,有男性和女性模型。本系统采用的是成人男性的骨骼模型。将其按3ds格式从Poser 5.0中导出,然后通过三维软件quick3d将3ds格式转换为obj格式(三维软件quick3d的介绍和使用方法见附录B)。3.3单文档与控制台的选择 用控制台来编程需要使用OpenGL的辅助库函数,则其通用性较差且一些控制比较困难。用单文档则很容易解决这些问题。单文档下的OpenGL编程环境设置请见附

9、录C.3.4菜单设计菜单设计的好坏会直接影响到用户操作的难易程度,从而影响到软件的推广使用。菜单设计的简单明了会受到用户的欢迎。菜单中包括退出应用程序、开头侧顶视图、点头、摇头、抬手、抬腿、旋转等操作。3.5工具栏设计 制作工具栏的目的是:通过单击就能访问常用命令,工具栏按钮是菜单命令的快捷方式,但是它也实现了菜单中没有的命令3.6状态栏设计 状态栏不仅能显示菜单操作命令的帮助信息,还可以划分为一个或多个区域,它们分别对应着窗格、面板或指示符。可以单独设置每个窗格的文本,这样,一个窗格可以显示文档的当前行、页号,可以显示当前Caps Lock和Num Lock的状态,还可以包含进度控件,以显示

10、如保存、加载文档等较长的操作中所完成任务的比例。3.7弹出菜单设计 弹出菜单是主菜单的快捷方式,可以很方便地进行操作,包括一些主要操作,如:开关侧顶视图,播放等操作。3.8放大方式的选择 是用OpenGL中的选择与拾取机制进行局部放大,还是用OpenGL中的函数进行全体放大。要使用OpenGL的选择与拾取机制,首先要将场景绘制到帧缓存中,然后进入选择模式并重新绘制场景。进入选择模式后,帧缓存的内容将不会发生变化,直到退出该模式。退出选择模式时,OpenGL将返回一系列与视景体相交的图元,与视景体相交的每个图元都将导致一次选择命中。进行局部放大时会丧失人体骨骼的整体性。进行全体放大时,需用到Op

11、enGL中的glScaled()函数,能较好的展示人体骨骼的完整性。本系统采用OpenGL中的glScaled()函数进行全体放大。3.9人体骨骼的基本控制 人体骨骼的基本控制包括点头、摇头、抬左手、抬右手、抬左腿、抬右腿等等。3.10人体骨骼走步运动 当进入走步模式时,为走步布置场景,并进行走步运动。3.11拖放操作 按住鼠标左键不放,拖动鼠标,人体骨骼则随着鼠标的移动进行相应的旋转。 4详细设计4.1各个骨骼部分介绍 a)头骨骼(如图4.1): 图4.2身体图4.1头 b) 左大腿骨骼(如图4.3)c) 左小腿骨骼(如图4.4) 图4.4左小腿图4.3左大腿d) 左脚骨骼(如图4.5)e)

12、 右大腿骨骼(如图4.6) 图4.6右大腿图4.5左脚f) 右小腿骨骼(如图4.7)g) 右脚骨骼(如图4.8)图4.7右小腿图4.8右脚 h) 左臂骨骼(如图4.9)i) 左肘骨骼(如图4.10)图4.10右小腿图4.9左臂 j) 左手骨骼(如图4.11)k) 右臂骨骼(如图4.12) 图4.12右臂图4.11左手l) 右肘骨骼(如图4.13)m) 右手骨骼(如图4.14) 图4.13右肘图4.14右手4.2菜单详细设计 主菜单分为:文件子菜单,控制子菜单,窗口子菜单,帮助子菜单。4.2.1文件子菜单文件子菜单有“退出”命令:关闭应用程序并释放绘图描述表。4.2.2控制子菜单控制子菜单由抬手

13、子菜单,抬腿子菜单,头控制子菜单,旋转子菜单,移动子菜单,“播放”命令和“复原”命令组成。a)抬手子菜单由“抬左手”和“抬右手”命令组成。“抬左手”:由小键盘的数字键1来控制抬左臂,按一下则左臂向上旋转一度,左肘也向上旋转一度,当到达45度时则从原路逐渐返回到正常状态。“抬右手”:由小键盘的数字键2来控制抬右臂,按一下则右臂向上旋转一度,左肘也向上旋转一度,当到到45度时则从原路逐渐返回到正常状态。b)抬腿子菜单由“抬左腿”和“抬右腿”命令组成。“抬左腿”:由小键盘的数字键3来控制抬左腿,按一下则左大腿向上旋转一度,而左小腿向下旋转一度,当达到45度时则从原路逐渐返回到正常状态。“抬右腿”:由

14、小键盘的数字键4来控制抬右腿,按一下则右大腿向上旋转一度,而右小腿向下旋转一度,当达到45度进则从原路逐渐返回到正常状态。c)头控制子菜单由“点头”和“摇头”命令组成。“点头”:由小键盘的数字键5来控制点头,按一下则头向下旋转一度,当到达45度时则从原路逐渐返回到正常状态。“摇头”:由小键盘的数字键6来控制摇头,按一下则头向左或向右旋转一度,当向左或向右达45度时则从原路逐渐返回到正常状态。d)旋转子菜单由“向左”、“向右”、“向上”和“向下”命令组成。“向左”:由向左方向键控制,按一下则整个人体骨骼向左旋转一度,为了更好的观察,没有对此度数设限制。“向右”:由向右方向键控制,按一下则整个人体

15、骨骼向右旋转一度,为了更好的观察,没有对此度数设限制。“向上”:由向上方向键控制,按一下则整个人体骨骼向上旋转一度,为了更好的观察,没有对此度数设限制。e)移动子菜单由“向左”、“向右”、“向上”和“向下”命令组成。“向左”:由字母“a”或“A”来控制,按一下则整个人体骨骼向左平移一段距离,当平移到一定程度时,人体骨骼会从原路逐渐返回到正常状态。“向右”:由字母“d”或“D“来控制,按一下则整个人体骨骼向右平移一段距离,当平移到一定程度时,人体骨骼会从原路逐渐返回到正常状态。“向上”:由字母“w”或“W”来控制,按一下则整个人体骨骼向上平移一段距离,当平移到一定程度时,人体骨骼会从原路逐渐返回

16、到正常状态。“向下”:由字母“s”或“S”来控制,按一下则整个人体骨骼向下平移一段距离,当平移到一定程度时,人体骨骼会从原路逐渐返回到正常状态。f)“播放”命令:由“p”或“P”来控制,按一下则启动定时器进行人体骨骼的自动旋转运动,再按一下则关闭定时器,人体骨骼停止旋转。g)“复原”命令:由“r”或“R”来控制,按一下则恢复到刚启动时的最初状态。4.2.3窗口子菜单:窗口子菜单有“开侧顶视图”命令,点击一下则打开侧视图,再点击一下则关闭侧顶视图。4.2.4帮助子菜单帮助子菜单由“操作说明”和“关于毕业设计”命令组成。a)“操作说明”:介绍了一些基本操作,方便用户操作。 b)“关于毕业设计”:介

17、绍本应用程序的一些基本信息。4.3工具栏详细设计工具栏主要由两个按钮组成:“播放”和“?”。4.3.1“播放”命令由“p”或“P”来控制,按一下则启动定时器进行人体骨骼的自动旋转运动,再按一下则关闭定时器,人体骨骼停止旋转。4.3.2 “?”命令调用主菜单的帮助子菜单“操作说明”,介绍了一些基本操作,方便用户使用4.4状态栏详细设计状态栏由三个窗格组成:显示常用命令状态,显示大小写的状态,显示播放状态。4.4.1显示常用命令状态当鼠标放在所要点击的命令上时,该窗格会显示这个命令的一些提示信息,用户根据这些提示信息能很快地熟悉本系统。4.4.2显示大小写状态当大小写键处于开的状态时,则在该窗格上

18、显示其状态;处于关的状态时,则不显示。4.4.3显示播放状态当处于播放状态时,在该窗格显示其播放状态;处于暂停状态时则不显示其状态。4.5弹出菜单详细设计弹出菜单由一般控制子菜单、开关侧顶视图子菜单、“复原”命令和“播放”命令组成。4.5.1一般控制子菜单一般控制子菜单由抬手子菜单、抬腿子菜单、头控制子菜单、旋转子菜单和移动子菜单组成。a)抬手子菜单由“抬左手”命令、“抬右手”命令组成。a1)“抬左手”命令:由小键盘的数字键1来控制抬左臂,按一下则左臂向上旋转一度,左肘也向上旋转一度,当达到45度时则从原路逐渐返回。a2)“抬右手”命令:由小键盘的数字键2来控制抬右臂,按一下则右臂向上旋转一度

19、,右肘也向上旋转一度,当达到45度时则从原路逐渐返回。b)抬腿子菜单由“抬左腿”命令、“抬右腿”命令组成。b1)“抬左腿”命令:由小键盘的数字键3来控制抬左腿,按一下则左大腿向上旋转度,而左小腿则向下旋转一度,当达到45度时则从原路逐渐返回。b2)“抬右腿”命令:由小键盘的数字键4来控制抬右腿,按一下则右大腿向上旋转一度,而右小腿则向下旋转一度,当达到45度时则从原路逐渐返回。c)头控制子菜单由“点头”命令和“摇头”组成。c1)“点头”命令:由小键盘的数字键5来控制点头,按一下则头向下旋转一度,当达到45度时则从原路逐渐返回。c2)“摇头”命令:由小键盘的数字键6来控制摇头,按一下则头向左或向

20、右旋转一度,当向左或向右达到45度时则从原路返回。d)旋转子菜单由“向左”命令、“向右”命令、“向上”命令和“向下”命令组成。d1)“向左”命令:由向左方向键来控制向左转,按一下则人体骨骼以Z轴为对称轴向左旋转,为了更好的观察,对此命令度数没有限制。d2)“向右”命令:由向右方向键来控制向右转,按一下则人体骨骼以Z轴为对称轴向右旋转,为了更好的观察,对此命令度数没有限制。d3)“向上”命令:由向上方向键来控制向上转,按一下则人体骨骼以X轴为对称轴向上旋转,为了更好的观察,对此命令度数没有限制。d4)“向下”命令:由向下方向键来控制向下转,按一下则人体骨骼能X轴为对称轴向下旋转,为了更好的观察,

21、对此命令度数没有限制。e)移动子菜单由“向左”命令、“向右”命令、“向上”命令和“向下”命令组成。e1)“向左”命令:由“a”或“A”来控制向左平移,按一下则整个人体骨骼向左平移一定的距离。当到达一定的次数时,人体骨骼会恢复到开始状态。e2)“向右”命令:由“d”或“D”来控制向右平移,按一下则人体骨骼向右平移一定的距离。当到过一定次数时,人体骨骼会恢复到开始状态。e3)“向上”命令:由“w”或“W”来控制向上平移,按一下则人体骨骼向上平移一定的距离。当达到一定次数时,人体骨骼会恢复到开始状态。e4)“向下”命令:由“s”或“S”来控制向下平移,按一下则人体骨骼向下平移一定的距离。当达到一定次

22、数时,人体骨骼会恢复到开始状态。4.5.2开关侧顶视图子菜单开关侧顶视图子菜单由“开侧顶视图”命令和“关侧顶视图”命令组成。a)“开侧顶视图”命令:打开侧顶视图,能让用户能比较清楚地知道人体骨骼的状态。如图4.15所示。b)“关侧顶视图”命令:关闭侧顶视图,让用户能在此视图下进行放大、平移操作,比较直观。如图4.16所示。图4.16开侧顶视图图4.15关侧顶视图4.5.3“播放”命令当点击 “播放”命令时,启动定时器进行人体骨骼以Z轴为对称轴进行旋转,产生动画效果。当再次点击“播放”命令时,关闭定时器,人体骨骼停止旋转。4.5.4“复原”命令当点击“复原”命令时,则将人体骨骼模型的状态设为启动

23、的最初状态。不会对侧顶视图状态产生影响。最初状态:头、腿、手、旋转、移动等都设为起始状态。4.6放大操作使用glScaled()对模型进行整体放大,使放大后的模型具有整体感,点击鼠标左键一次,整个模型就在原来的基础上放大2倍,当放大到8倍后,再将模型还原为起始状态。如图4.17和图4.18图4.18放大后状态图4.17起始状态当放大后的人体骨骼超出屏幕显示范围,可以使用平移来调整模型的位置,使用户清楚地观察到想要显示的位置。为了放大后的观察效果,只能在全景视图下进行放大操作,而不能在侧顶视图下进行放大操作。图4.19是在全景视图下的放大图像;图4.20是在侧顶视图下的放大图像。图4.20侧顶视

24、图下放大图4.19全景视图下放大由上可知在全景视图下的放大的图像比较美观,而在侧顶视图下的放大的图像则很不美观,所以不在侧顶视图下进行放大操作。4.7全局坐标系与局部坐标系变换在全局坐标系中考虑问题,矩阵乘法将以与指定顺序相反的顺序进行。另一种看待矩阵乘法的方法是,将要变换的模型所在的全局坐标系抛到一边,设想有一个与要绘制的物体捆绑在一起的局部坐标系,所有变换都将导致该坐标系发生变化。采用这种方式看待变换时,代码中矩阵乘法的顺序将是自然顺序。本系统中所采用的是局部坐标系的观点。关于全局坐标系与局部坐标系变换的详细信息见附录D。4.8基本控制的数据选择基本控制的数据是从obj文件中搜索出来的。根

25、据找出来的数据进行控制,有时并不是很准确的4.8.1头与身体数据选择从头模型的obj文件中搜索出数据是0.603228,这样可以看出当点头时明显发生了头骨骼与身体骨骼部分的分离。因为从头骨骼模型中找出来的数据是相对于头而言的最小的Z值,而身体骨骼部分最大的Z值是高于头骨骼的最小的Z值,当旋转时会以头的最小的Z值为对称轴进行旋转,从而产生骨骼之间的脱节。头与身体之间的接合点是身体的最大的Z值,所以应从身体模型的obj文件中搜索最大的Z值(0.619229)。4.8.2左臂与身体数据选择当控制左臂的上抬动作时,须找到左臂与身体部分的接合点。从左臂模型的obj文件中搜索出来的左臂的最大的Z值为0.5

26、63242,当以此数据来控制左臂的运动时,会使左臂与身体之间发生脱离。这是因为左臂模型的最大Z值不是左臂旋转的数据。经过不断的测试,得到旋转的接近的Z值为0.5575,当以此数据来控制左臂的旋转还不能产生令人满意的结果。这是因为在Y方向上产生的偏移导致骨骼运动脱节,经不断测试,得出Y值为0.05时,能产生较为满意的结果。4.8.3左肘与左臂数据选择当控制左肘的上抬运动时,须找到左肘与左臂的接合部分的数据,从左肘模型的obj文件中搜索出的左肘的最大的Z值为0.481069, 当以此数据来控制左肘的运动时,会使左肘与左臂之间发生脱离。这是因为左肘模型的最大Z值不是左肘旋转的数据。经过不断的测试,得

27、到旋转的接近的Z值为0.5575,当以此数据来控制左肘的旋转还不能产生令人满意的结果。这是因为在Y方向上产生的偏移导致骨骼运动脱节,经不断测试,得出Y值为0.05时,能产生较为满意的结果。4.8.4右臂与身体数据选择当控制右臂的上抬动作时,须找到右臂与身体部分的接合点。从右臂模型的obj文件中搜索出来的右臂的最大的Z值为0.563242,当以此数据来控制右臂的运动时,会使右臂与身体之间发生脱离。这是因为右臂模型的最大Z值不是右臂旋转的数据。经过不断的测试,得到旋转的接近的Z值为0.5575,当以此数据来控制右臂的旋转还不能产生令人满意的结果。这是因为在Y方向上产生的偏移导致骨骼运动脱节,经不断

28、测试,得出Y值为0.05时,能产生较为满意的结果。4.8.5右肘与右臂数据选择当控制右肘的上抬运动时,须找到右肘与右臂的接合部分的数据,从右肘模型的obj文件中搜索出的右肘的最大的Z值为0.481069, 当以此数据来控制右肘的运动时,会使右肘与右臂之间发生脱离。这是因为右肘模型的最大Z值不是右肘旋转的数据。经过不断的测试,得到旋转的接近的Z值为0.5575,当以此数据来控制右肘的旋转还不能产生令人满意的结果。这是因为在Y方向上产生的偏移导致骨骼运动脱节,经不断测试,得出Y值为0.05时,能产生较为满意的结果。4.8.6左大腿与身体数据选择当控制左大腿的上抬动作时,须找到左大腿与身体部分的接合

29、点。从左大腿模型的obj文件中搜索出来的左大腿的最大的Z值为0.377953,当以此数据来控制左大腿的运动时,会使左大腿与身体之间发生脱离。这是因为在X方向上产生的偏移导致骨骼运动脱节,经不断测试,得出X值为0.12时,能产生较为满意的结果。4.8.7左小腿与左大腿数据选择当控制左小腿的上抬动作时,须找到左小腿与左大腿部分的接合点。从左小腿模型的obj文件中搜索出来的左小腿的最大的Z值为0.200885,当以此数据来控制左大腿的运动时,会使左小腿与左大腿之间发生脱离。这是因为在X方向上产生的偏移导致骨骼运动脱节,经不断测试,得出X值为-0.164时,能产生较为满意的结果。4.8.8右大腿与身体

30、数据选择当控制右大腿的上抬动作时,须找到右大腿与身体部分的接合点。从右大腿模型的obj文件中搜索出来的右大腿的最大的Z值为0.377953,当以此数据来控制右大腿的运动时,会使右大腿与身体之间发生脱离。这是因为在X方向上产生的偏移导致骨骼运动脱节,经不断测试,得出X值为0.12时,能产生较为满意的结果。4.8.9右小腿与右大腿数据选择当控制右小腿的上抬动作时,须找到右小腿与右大腿部分的接合点。从右小腿模型的obj文件中搜索出来的右小腿的最大的Z值为0.200885,当以此数据来控制右大腿的运动时,会使右小腿和右大腿之间发生脱离。这是因为在X方向上产生的偏移导致骨骼运动脱节,经不断测试,得出X值

31、为-0.164时,能产生较为满意的结果。4.9走步运动的详细设计通过走步运动方案的设计,能更好地展示人体骨骼之间的协调性。4.9.1走步运动场景的设置当选择进入走步运动时,就会在屏幕上显示一条道路,以蓝色为路面的颜色。该路是一个矩形进行适当的旋转绘制而成的。为路设置一个无穷远的光源,使走步时更具有真实感。4.9.2走步运动控制本系统模仿的是正常人的走路:左臂向前摆动时,右臂向后摆动,左腿向后摆动,右腿向前摆动;左臂向后摆动时,右臂向前摆动,左腿向前摆动,右腿向后摆动。a)左臂摆动:左臂摆动时,左臂的旋转幅度一般不大于左肘的旋转角度且左臂与竖直向下的方向的夹角不能大于45度。向前摆动时,左臂与左

32、肘的夹角度数不能低于120度;向后摆动时,左臂与左肘的夹角度数不能高于180度。b)右臂摆动:右臂摆动时,右臂的旋转幅度一般不大于右肘的旋转角度且右臂与竖直向下的方向的夹角不能大于45度。向前摆动时,右臂与右肘的夹角度数不能低于120度;向后摆动时,右臂与右肘的夹角度数不能高于180度。c)左腿摆动:左腿摆动时,左大腿与竖直向下的方向的夹角不能大于45度。向前摆动时,左大腿与左小腿的夹角不能低于240度、高于270度;向后摆动时,左大腿与左小腿的夹角不能低于180度。d)右腿摆动:右腿摆动时,右大腿与竖直向下的方向的夹角不能大于45度。向前摆动时,右大腿与右小腿的夹角不能低于240度、高于27

33、0度;向后摆动时,右大腿与右小腿的夹角不能低于180度。走步运动控制的关键在于协调各骨骼关节之间的运动关系,控制好骨骼运动的角度。4.10拖放操作详细设计在正常模式下,按下鼠标左键并拖动,人体骨骼会根据鼠标移动的位移进行相应的旋转;在放大模式下,当人体骨骼处于起始状态时,点击字母“l”或“L”进入拖放操作。当按下鼠标左键时发送WM_MOUSEDOWN消息,并记录下鼠标此时的位置。移动鼠标时发送WM_MOUSEMOVE消息,用鼠标移动后的位置与左键按下时的位置相减,得到移动前后的偏移量,再用此偏移量除以一个合适的数就得到人体骨骼模型所要旋转的角度。当左键抬起时,清除鼠标位置,为下一次的拖放操作做

34、准备。记录鼠标位置与开始按下时的位置进行相应变换就可得到人体骨骼的旋转角度。5 编码编码是根据详细设计阶段得到的流程图进行的代码书写,编码以部分界面的部分控件为例解释代码的设计时需要考虑的因素和设计思路以及设计方法。部分代码及解释如下:5.1设置像素格式要想在MFC的DC上绘图,必须为其设置正确的像素格式,其部分代码如下:int m_PixelFormat;m_PixelFormat = :ChoosePixelFormat( m_hDC, &pfd ); 为DC选择用户自己设置的pfd的像素格式,其中参数m_hDC为DC的句柄,pfd为PIXELFORMATDESCRIPTOR的对象。Set

35、PixelFormat(m_hDC, m_PixelFormat, &pfd );为设备描述表设置所选择的像素格式,为以下正确的创建绘图准备好必须的条件。5.2创建绘图描述表m_hRC = :wglCreateContext( m_hDC );在设备描述表上创建绘图描述表。m_hRC是绘图描述表的句柄。if( m_hRC = NULL )return false;判断绘图描述表是否创建成功,如果不成功,则返回false;if( wglMakeCurrent( m_hDC, m_hRC )=false)return false;将绘图描述表与设备描述表关联起来,如果关联不成功,则返回false;

36、5.3清除窗口闪烁问题OpenGL有自己刷新背景的函数glClear(),故而应禁止Windows刷新窗口背景。否则,当窗口需要重画时,Windows会自动先发送WM_ERASEBKGND,而缺省的处理函数使用白色的背景刷。当OpenGL使用的背景颜色不是白色时,作图时有一帧白色的闪烁。这种现象在自动旋转时特别明显。5.4销毁函数程序有了创建事件服务程序,就应该有销毁函数服务程序。在销毁函数中,将在创建函数中建立的像素格式和绘图描述表全部释放。程序部分代码如下:if( wglGetCurrentContext() != NULL )wglMakeCurrent( NULL, NULL );判断

37、当前绘图描述表是否为空,如果不为空,则清除当前绘图描述表。if( m_hRC )wglDeleteContext( m_hRC );m_hRC = NULL;判断绘图描述表是否为空,如果不为空,则删除绘图描述表并将绘图描述表句柄清空。5.5窗口大小改变事件响应函数当窗口大小改变时会调用窗口大小改变事件消息,窗口大小改变事件消息对应窗口大小改变事件响应函数。在窗口大小改变事件响应函数中设置视口和投影矩阵,程序的部分代码如下:glViewport( 0, 0, cx, cy );设置视区矩形,视区的左下角的坐标为(0,0),cx、cy分别为窗口的宽度和高度。视区的宽高比等于取景体积的宽高比。glM

38、atrixMode( GL_PROJECTION );glLoadIdentity();进入投影模式,将当前矩阵设为投影矩阵,使OpenGL函数影响投影矩阵,将当前矩阵清空,消除以前投影变换所产生的影响。if( w = h )glOrtho( -1.5, 1.5, -1.5*(GLdouble)h/(GLdouble)w, 1.5*(GLdouble)h/(GLdouble)w, -10.0, 10.0 );elseglOrtho( -1.5*(GLdouble)w/(GLdouble)h, 1.5*(GLdouble)w/(GLdouble)h, -1.5, 1.5, -10.0, 10.0

39、 );判断视区的宽高比,根据宽度比来设置正交平行取景体积,由正交平行取景体积来创建一个矩阵glMatrixMode( GL_MODELVIEW );glLoadIdentity();进入视图模式,将当前矩阵设为视图矩阵,使OpenGL函数影响视图矩阵,将当前矩阵清空,消除以前视图变换所产生的影响。5.6创建工具栏在CMainFrame类的OnCreate函数中创建工具栏,具体代码如下;if( !m_wndToolBar.Create( this ) )TRACE( FAILED TO CREATE THIS ); return -1;m_wndToolBar是一个工具栏句柄,如果创建不成功,则

40、提示错误信息。m_wndToolBar.LoadToolBar( IDR_TOOLBAR1 );载入工具栏资源IDRTOOLBAR1。m_wndToolBar.EnableDocking( CBRS_ALIGN_ANY );EnableDocking( CBRS_ALIGN_ANY );FloatControlBar( &m_wndToolBar, CPoint( 100, 100 );DockControlBar( &m_wndToolBar );设置工具栏的悬浮状态和大小。5.7创建状态栏在CMainFrame类的OnCreate()函数中创建状态栏,部分代码如下:if( !m_wndSt

41、atusBar.Create( this) )TRACE0( failed to create status bar );return -1;m_wndStatusBar是状态栏的句柄,如果创建不成功,则提示错误信息。m_wndStatusBar.SetIndicators(indicators,sizeof( indicators)/sizeof( UINT );设置状态栏的窗格数以及一些状态。m_wndStatusBar.MoveWindow( 0, rect.bottom-20, rect.right, 20 );将状态栏放于窗口的底部。5.8侧顶视图实现glEnable( GL_SCI

42、SSOR_TEST );启用裁剪测试,允许对绘图区进行裁剪。glScissor( 0, 0, w/2, h );设置裁剪后的绘图区的大小为整个绘图区的左半部分。glClearColor( 0.0, 0.0, 0.0, 1.0 );glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );用当前的清除色和深度值来清除绘图区的颜色缓存和深度缓存。glDisable( GL_SCISSOR_TEST );禁用裁剪测试。glViewport( 0, 0, w/2, h );设置裁剪后的视口大小。glMatrixMode( GL_PROJECTION );

43、glLoadIdentity();进入投影模式,将当前矩阵设为投影矩阵,使OpenGL函数影响投影矩阵,将当前矩阵清空,消除以前投影变换所产生的影响。if( (w/2) = h )glOrtho(-1.5,1.5,-1.5*(GLdouble)h/(GLdouble)(w/2), 1.5*(GLdouble)h/(GLdouble)(w/2), -10.0, 10.0 );elseglOrtho(-1.5*(GLdouble)(w/2)/(GLdouble)h,1.5*(GLdouble)(w/2)/(GLdouble)h, -1.5, 1.5, -10.0, 10.0 );判断视区的宽高比,

44、根据宽度比来设置正交平行取景体积,由正交平行取景体积来创建一个矩阵glMatrixMode( GL_MODELVIEW );glLoadIdentity();进入视图模式,将当前矩阵设为视图矩阵,使OpenGL函数影响视图矩阵,将当前矩阵清空,消除以前视图变换所产生的影响。5.9定时器定时器是每隔一段时间发送WM_TIMER消息,部分代码如下:SetTimer( 1, 500, NULL );每隔500毫秒发送WM_TIMER消息。KillTimer( 1 );取消定时器定时发送WM_TIMER消息。switch( nIDEvent )case 0:break;case 1:rotate_le

45、ft_right +=1; Invalidate(); break;default: CView:OnTimer(nIDEvent); WM_TIMER消息所对应的消息响应函数,当有WM_TIMER消息时,就会调用该代码执行以Z轴为对称轴的旋转运动。6测试6.1测试目的软件测试是软件代码生成后必不可少的一步,测试的目的是尽可能多的发现程序中的错误,通过测试使软件的错误减少,使系统的可靠性进一步提高。6.2软件测试6.2.1测试程序的正确运行。程序运行以来至今未出现令整个系统崩溃的致命错误,一切运行正常。6.2.2快捷键是否冲突经测试至今未发现快捷键有冲突。 6.2.3前后状态的一致性。在全景视

46、图下放大后的模型是否影响到到侧顶视图下的模型。正常情况下,在全景视图下放大后的模型不影响侧顶视图下的模型。经测试,在全景视图下放大后的模型不影响侧顶视图下的模型。在一般模式和放大模式下,放大操作、抬手、抬腿、点头、摇头、旋转是否影响到走步模式下人体骨骼模型状态。经测试,在一般模式和放大模式下,放大操作、抬手、抬腿、点头、摇头、旋转不影响到走步模式下人体骨骼模型状态。在走步模式下,走步运动的操作是否影响到一般模式和放大模式下的人体骨骼模型状态,经测试,在走步模式下的走步运动不影响一般模式和放大模式下的人体骨骼模型状态。结 论设计是针对医学应用和实践教学上人体骨骼的仿真运动而提出的。在医学应用上,人体骨骼的仿真运动能有效地增进医生和病人的沟通,医生可以快速方便的向病人介绍病情,病人可以快速的了解自己的病情;在实践教学中,人体骨骼的仿真运动能较好的体现骨骼关节之间的运动关系,教师可以清楚的向学生讲解人体骨骼的组成,学生可以快速的对骨骼的组成有一个清晰的了解,提高教学效果。以当今流行的Microsoft Visual C+为构建人体三维骨骼运

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 办公文档 > 其他范文


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号