人体三维骨骼运动仿真研究毕业设计文档格式.docx
《人体三维骨骼运动仿真研究毕业设计文档格式.docx》由会员分享,可在线阅读,更多相关《人体三维骨骼运动仿真研究毕业设计文档格式.docx(35页珍藏版)》请在冰豆网上搜索。
当用户想了解右大腿运动的具体细节时,通过键盘或鼠标操作使骨骼做抬右大腿运动。
10) 抬右小腿:
当用户想了解右小腿运动的具体细节时,通过键盘或鼠标操作使骨骼做抬右小腿运动。
11) 旋转:
当用户想了解旋转的具体细节时,通过键盘或鼠标操作使整个骨骼做旋转运动。
12) 走步:
当用户想了解走步的具体细节时,通过键盘操作使骨骼进行走步运动。
13) 放大:
当用户想了解放大的具体细节时,通过鼠标操作来放大骨骼。
2.1.2 侧顶视图
当用户想了解点头运动的具体细节时,通过键盘或鼠标操作能使骨骼做点头动作。
当用户想了解右臂运动的具体细节时,通过键盘或鼠标操作使骨骼做抬右臂运动。
2.2 性能需求分析
正确性:
根据人体骨骼系统的运动设计软件,运动中的每一个操作在系统中都必须有所体现,保证程序的正确性。
3 概要设计
3.1 模型格式选择
保存三维图形数据的方法多种多样,有参数曲线法、CSG描述法等等,但常用的保存三维模型的方法是多边形逼近法,即用许多小多边形拼出模型的外观,文件中保存这些多边形的信息。
由于OpenGL中提供了最基本的由多边形构造三维模型的方法,因此从三维图形数据文件中读取模型数据并在OpenGL中绘制就很容易。
3ds模型数据格式和obj模型数据格式都是三维图形数据格式,3ds模型数据格式是目前大多数图形数据素材库中保存三维图形数据的最常用格式。
3ds文件由许多块组成,每个块首先描述其后的信息类别,即该块是如何组成的,块的信息类别是用ID来标识的,块还包含了下一个块的相对位置信息,其具体信息附录A。
Wavefront的obj模型文件结构非常简单。
首先,它是由一些文本行组成的,每一行文本都是由一个关键字开头,紧跟着后面是该关键字所表示含义的具体参数,obj文件不仅可以定义多边形模型,也可以定义自由曲面模型。
多边形模型就是可以用点、线、面等基本元素构造的模型 ,而自由曲面模型是指使用参数曲面造型定义的模型。
Obj模型数据格式的详细信息见附录A。
本系统是采取Wavefront的obj格式。
3.2 模型选择
从Poser5.0中导出人体骨骼模型,有成人和小孩的骨骼模型,有男性和女性模型。
本系统采用的是成人男性的骨骼模型。
将其按3ds格式从Poser5.0中导出,然后通过三维软件quick3d将3ds格式转换为obj格式(三维软件quick3d的介绍和使用方法见附录B)。
3.3 单文档与控制台的选择
用控制台来编程需要使用OpenGL的辅助库函数,则其通用性较差且一些控制比较困难。
用单文档则很容易解决这些问题。
单文档下的OpenGL编程环境设置请见附录C.
3.4 菜单设计
菜单设计的好坏会直接影响到用户操作的难易程度,从而影响到软件的推广使用。
菜单设计的简单明了会受到用户的欢迎。
菜单中包括退出应用程序、开头侧顶视图、点头、摇头、抬手、抬腿、旋转等操作。
3.5 工具栏设计
制作工具栏的目的是:
通过单击就能访问常用命令,工具栏按钮是菜单命令的快捷方式,但是它也实现了菜单中没有的命令
3.6 状态栏设计
状态栏不仅能显示菜单操作命令的帮助信息,还可以划分为一个或多个区域,它们分别对应着窗格、面板或指示符。
可以单独设置每个窗格的文本,这样,一个窗格可以显示文档的当前行、页号,可以显示当前CapsLock和NumLock的状态,还可以包含进度控件,以显示如保存、加载文档等较长的操作中所完成任务的比例。
3.7 弹出菜单设计
弹出菜单是主菜单的快捷方式,可以很方便地进行操作,包括一些主要操作,如:
开关侧顶视图,播放等操作。
3.8 放大方式的选择
是用OpenGL中的选择与拾取机制进行局部放大,还是用OpenGL中的函数进行全体放大。
要使用OpenGL的选择与拾取机制,首先要将场景绘制到帧缓存中,然后进入选择模式并重新绘制场景。
进入选择模式后,帧缓存的内容将不会发生变化,直到退出该模式。
退出选择模式时,OpenGL将返回一系列与视景体相交的图元,与视景体相交的每个图元都将导致一次选择命中。
进行局部放大时会丧失人体骨骼的整体性。
进行全体放大时,需用到OpenGL中的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)右大腿骨骼(如图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 控制子菜单
控制子菜单由抬手子菜单,抬腿子菜单,头控制子菜单,旋转子菜单,移动子菜单,“播放”命令和“复原”命令组成。
a)抬手子菜单由“抬左手”和“抬右手”命令组成。
“抬左手”:
由小键盘的数字键1来控制抬左臂,按一下则左臂向上旋转一度,左肘也向上旋转一度,当到达45度时则从原路逐渐返回到正常状态。
“抬右手”:
由小键盘的数字键2来控制抬右臂,按一下则右臂向上旋转一度,左肘也向上旋转一度,当到到45度时则从原路逐渐返回到正常状态。
b)抬腿子菜单由“抬左腿”和“抬右腿”命令组成。
“抬左腿”:
由小键盘的数字键3来控制抬左腿,按一下则左大腿向上旋转一度,而左小腿向下旋转一度,当达到45度时则从原路逐渐返回到正常状态。
“抬右腿”:
由小键盘的数字键4来控制抬右腿,按一下则右大腿向上旋转一度,而右小腿向下旋转一度,当达到45度进则从原路逐渐返回到正常状态。
c)头控制子菜单由“点头”和“摇头”命令组成。
“点头”:
由小键盘的数字键5来控制点头,按一下则头向下旋转一度,当到达45度时则从原路逐渐返回到正常状态。
“摇头”:
由小键盘的数字键6来控制摇头,按一下则头向左或向右旋转一度,当向左或向右达45度时则从原路逐渐返回到正常状态。
d)旋转子菜单由“向左”、“向右”、“向上”和“向下”命令组成。
“向左”:
由向左方向键控制,按一下则整个人体骨骼向左旋转一度,为了更好的观察,没有对此度数设限制。
“向右”:
由向右方向键控制,按一下则整个人体骨骼向右旋转一度,为了更好的观察,没有对此度数设限制。
“向上”:
由向上方向键控制,按一下则整个人体骨骼向上旋转一度,为了更好的观察,没有对此度数设限制。
e)移动子菜单由“向左”、“向右”、“向上”和“向下”命令组成。
由字母“a”或“A”来控制,按一下则整个人体骨骼向左平移一段距离,当平移到一定程度时,人体骨骼会从原路逐渐返回到正常状态。
由字母“d”或“D“来控制,按一下则整个人体骨骼向右平移一段距离,当平移到一定程度时,人体骨骼会从原路逐渐返回到正常状态。
由字母“w”或“W”来控制,按一下则整个人体骨骼向上平移一段距离,当平移到一定程度时,人体骨骼会从原路逐渐返回到正常状态。
“向下”:
由字母“s”或“S”来控制,按一下则整个人体骨骼向下平移一段距离,当平移到一定程度时,人体骨骼会从原路逐渐返回到正常状态。
f)“播放”命令:
由“p”或“P”来控制,按一下则启动定时器进行人体骨骼的自动旋转运动,再按一下则关闭定时器,人体骨骼停止旋转。
g)“复原”命令:
由“r”或“R”来控制,按一下则恢复到刚启动时的最初状态。
4.2.3 窗口子菜单:
窗口子菜单有“开侧顶视图”命令,点击一下则打开侧视图,再点击一下则关闭侧顶视图。
4.2.4 帮助子菜单
帮助子菜单由“操作说明”和“关于毕业设计”命令组成。
a)“操作说明”:
介绍了一些基本操作,方便用户操作。
b)“关于毕业设计”:
介绍本应用程序的一些基本信息。
4.3 工具栏详细设计
工具栏主要由两个按钮组成:
“播放”和“?
”。
4.3.1 “播放”命令
4.3.2 “?
”命令
调用主菜单的帮助子菜单“操作说明”,介绍了一些基本操作,方便用户使用
4.4 状态栏详细设计
状态栏由三个窗格组成:
显示常用命令状态,显示大小写的状态,显示播放状态。
4.4.1 显示常用命令状态
当鼠标放在所要点击的命令上时,该窗格会显示这个命令的一些提示信息,用户根据这些提示信息能很快地熟悉本系统。
4.4.2 显示大小写状态
当大小写键处于开的状态时,则在该窗格上显示其状态;
处于关的状态时,则不显示。
4.4.3 显示播放状态
当处于播放状态时,在该窗格显示其播放状态;
处于暂停状态时则不显示其状态。
4.5 弹出菜单详细设计
弹出菜单由一般控制子菜单、开关侧顶视图子菜单、“复原”命令和“播放”命令组成。
4.5.1 一般控制子菜单
一般控制子菜单由抬手子菜单、抬腿子菜单、头控制子菜单、旋转子菜单和移动子菜单组成。
a) 抬手子菜单由“抬左手”命令、“抬右手”命令组成。
a1) “抬左手”命令:
由小键盘的数字键1来控制抬左臂,按一下则左臂向上旋转一度,左肘也向上旋转一度,当达到45度时则从原路逐渐返回。
a2) “抬右手”命令:
由小键盘的数字键2来控制抬右臂,按一下则右臂向上旋转一度,右肘也向上旋转一度,当达到45度时则从原路逐渐返回。
b) 抬腿子菜单由“抬左腿”命令、“抬右腿”命令组成。
b1) “抬左腿”命令:
由小键盘的数字键3来控制抬左腿,按一下则左大腿向上旋转度,而左小腿则向下旋转一度,当达到45度时则从原路逐渐返回。
b2) “抬右腿”命令:
由小键盘的数字键4来控制抬右腿,按一下则右大腿向上旋转一度,而右小腿则向下旋转一度,当达到45度时则从原路逐渐返回。
c) 头控制子菜单由“点头”命令和“摇头”组成。
c1) “点头”命令:
由小键盘的数字键5来控制点头,按一下则头向下旋转一度,当达到45度时则从原路逐渐返回。
c2) “摇头”命令:
由小键盘的数字键6来控制摇头,按一下则头向左或向右旋转一度,当向左或向右达到45度时则从原路返回。
d) 旋转子菜单由“向左”命令、“向右”命令、“向上”命令和“向下”命令组成。
d1) “向左”命令:
由向左方向键来控制向左转,按一下则人体骨骼以Z轴为对称轴向左旋转,为了更好的观察,对此命令度数没有限制。
d2) “向右”命令:
由向右方向键来控制向右转,按一下则人体骨骼以Z轴为对称轴向右旋转,为了更好的观察,对此命令度数没有限制。
d3) “向上”命令:
由向上方向键来控制向上转,按一下则人体骨骼以X轴为对称轴向上旋转,为了更好的观察,对此命令度数没有限制。
d4) “向下”命令:
由向下方向键来控制向下转,按一下则人体骨骼能X轴为对称轴向下旋转,为了更好的观察,对此命令度数没有限制。
e) 移动子菜单由“向左”命令、“向右”命令、“向上”命令和“向下”命令组成。
e1) “向左”命令:
由“a”或“A”来控制向左平移,按一下则整个人体骨骼向左平移一定的距离。
当到达一定的次数时,人体骨骼会恢复到开始状态。
e2) “向右”命令:
由“d”或“D”来控制向右平移,按一下则人体骨骼向右平移一定的距离。
当到过一定次数时,人体骨骼会恢复到开始状态。
e3) “向上”命令:
由“w”或“W”来控制向上平移,按一下则人体骨骼向上平移一定的距离。
当达到一定次数时,人体骨骼会恢复到开始状态。
e4) “向下”命令:
由“s”或“S”来控制向下平移,按一下则人体骨骼向下平移一定的距离。
4.5.2 开关侧顶视图子菜单
开关侧顶视图子菜单由“开侧顶视图”命令和“关侧顶视图”命令组成。
a) “开侧顶视图”命令:
打开侧顶视图,能让用户能比较清楚地知道人体骨骼的状态。
如图4.15所示。
b) “关侧顶视图”命令:
关闭侧顶视图,让用户能在此视图下进行放大、平移操作,比较直观。
如图4.16所示。
图4.16开侧顶视图
图4.15关侧顶视图
4.5.3 “播放”命令
当点击“播放”命令时,启动定时器进行人体骨骼以Z轴为对称轴进行旋转,产生动画效果。
当再次点击“播放”命令时,关闭定时器,人体骨骼停止旋转。
4.5.4 “复原”命令
当点击“复原”命令时,则将人体骨骼模型的状态设为启动的最初状态。
不会对侧顶视图状态产生影响。
最初状态:
头、腿、手、旋转、移动等都设为起始状态。
4.6 放大操作
使用glScaled()对模型进行整体放大,使放大后的模型具有整体感,点击鼠标左键一次,整个模型就在原来的基础上放大2倍,当放大到8倍后,再将模型还原为起始状态。
如图4.17和图4.18
图4.18放大后状态
图4.17起始状态
当放大后的人体骨骼超出屏幕显示范围,可以使用平移来调整模型的位置,使用户清楚地观察到想要显示的位置。
为了放大后的观察效果,只能在全景视图下进行放大操作,而不能在侧顶视图下进行放大操作。
图4.19是在全景视图下的放大图像;
图4.20是在侧顶视图下的放大图像。
图4.20侧顶视图下放大
图4.19全景视图下放大
由上可知在全景视图下的放大的图像比较美观,而在侧顶视图下的放大的图像则很不美观,所以不在侧顶视图下进行放大操作。
4.7 全局坐标系与局部坐标系变换
在全局坐标系中考虑问题,矩阵乘法将以与指定顺序相反的顺序进行。
另一种看待矩阵乘法的方法是,将要变换的模型所在的全局坐标系抛到一边,设想有一个与要绘制的物体捆绑在一起的局部坐标系,所有变换都将导致该坐标系发生变化。
采用这种方式看待变换时,代码中矩阵乘法的顺序将是自然顺序。
本系统中所采用的是局部坐标系的观点。
关于全局坐标系与局部坐标系变换的详细信息见附录D。
4.8 基本控制的数据选择
基本控制的数据是从obj文件中搜索出来的。
根据找出来的数据进行控制,有时并不是很准确的
4.8.1 头与身体数据选择
从头模型的obj文件中搜索出数据是0.603228,这样可以看出当点头时明显发生了头骨骼与身体骨骼部分的分离。
因为从头骨骼模型中找出来的数据是相对于头而言的最小的Z值,而身体骨骼部分最大的Z值是高于头骨骼的最小的Z值,当旋转时会以头的最小的Z值为对称轴进行旋转,从而产生骨骼之间的脱节。
头与身体之间的接合点是身体的最大的Z值,所以应从身体模型的obj文件中搜索最大的Z值(0.619229)。
4.8.2 左臂与身体数据选择
当控制左臂的上抬动作时,须找到左臂与身体部分的接合点。
从左臂模型的obj文件中搜索出来的左臂的最大的Z值为0.563242,当以此数据来控制左臂的运动时,会使左臂与身体之间发生脱离。
这是因为左臂模型的最大Z值不是左臂旋转的数据。
经过不断的测试,得到旋转的接近的Z值为0.5575,当以此数据来控制左臂的旋转还不能产生令人满意的结果。
这是因为在Y方向上产生的偏移导致骨骼运动脱节,经不断测试,得出Y值为0.05时,能产生较为满意的结果。
4.8.3 左肘与左臂数据选择
当控制左肘的上抬运动时,须找到左肘与左臂的接合部分的数据,从左肘模型的obj文件中搜索出的左肘的最大的Z值为0.481069,当以此数据来控制左肘的运动时,会使左肘与左臂之间发生脱离。
这是因为左肘模型的最大Z值不是左肘旋转的数据。
经过不断的测试,得到旋转的接近的Z值为0.5575,当以此数据来控制左肘的旋转还不能产生令人满意的结果。
4.8.4 右臂与身体数据选择
当控制右臂的上抬动作时,须找到右臂与身体部分的接合点。
从右臂模型的obj文件中搜索出来的右臂的最大的Z值为0.563242,当以此数据来控制右臂的运动时,会使右臂与身体之间发生脱离。
这是因为右臂模型的最大Z值不是右臂旋转的数据。
经过不断的测试,得到旋转的接近的Z值为0.5575,当以此数据来控制右臂的旋转还不能产生令人满意的结果。
4.8.5 右肘与右臂数据选择
当控制右肘的上抬运动时,须找到右肘与右臂的接合部分的数据,从右肘模型的obj文件中搜索出的右肘的最大的Z值为0.481069,当以此数据来控制右肘的运动时,会使右肘与右臂之间发生脱离。
这是因为右肘模型的最大Z值不是右肘旋转的数据。
经过不断的测试,得到旋转的接近的Z值为0.5575,当以此数据来控制右肘的旋转还不能产生令人满意的结果。
4.8.6 左大腿与身体数据选择
当控制左大腿的上抬动作时,须找到左大腿与身体部分的接合点。
从左大腿模型的obj文件中搜索出来的左大腿的最大的Z值为0.377953,当以此数据来控制左大腿的运动时,会使左大腿与身体之间发生脱离。
这是因为在X方向上产生的偏移导致骨骼运动脱节,经不断测试,得出X值为0.12时,能产生较为满意的结果。
4.8.7 左小腿与左大腿数据选择
当控制左小腿的上抬动作时,须找到左小腿与左大腿部分的接合点。
从左小腿模型的obj文件中搜索出来的左小腿的最大的Z值为0.200885,当以此数据来控制左大腿的运动时,会使左小腿与左大腿之间发生脱离。
这是因为在X方向上产生的偏移导致骨骼运动脱节,经不断测试,得出X值为-0.164时,能产生较为满意的结果。
4.8.8 右大腿与身体数据选择
当控制右大腿的上抬动作时,须找到右大腿与身体部分的接合点。
从右大腿模型的obj文件中搜索出来的右大腿的最大的Z值为0.377953,当以此数据来控制右大腿的运动时,会使右大腿与身体之间发生脱离。
4.8.9 右小腿与右大腿数据选择
当控制右小腿的上抬动作时,须找到右小腿与右大腿部分的接合点。
从右小腿模型的obj文件中搜索出来的右小腿的最大的Z值为0.200885,当以此数据来控制右大腿的运动时,会使右小腿和右大腿之间发生脱离。
4.9 走步运动的详细设计
通过走步运动方案的设计,能更好地展示人体骨骼之间的协调性。
4.9.1 走步运动场景的设置
当选择进入走步运动时,就会在屏幕上显示一条道路,以蓝色为路面的颜色。
该路是一个矩形进行适当的旋转绘制而成的。
为路设置一个无穷远的光源,使走步时更具有真实感。
4.9.2 走步运动控制
本系统模仿的是正常人的走路:
左臂向前摆动时,右臂向后摆动,左腿向后摆动,右腿向前摆动;
左臂向后摆动时,右臂向前摆动,左腿向前摆动,右腿向后摆动。
a) 左臂摆动:
左臂摆动时,左臂的旋转幅度一般不大于左肘的旋转角度且左臂与竖直向下的方向的夹角不能大于45度。
向前摆动时,左臂与左肘的夹角度数不能低于120度;
向后摆动时,左臂与左肘的夹角度数不能高于180度。
b) 右臂摆动:
右臂摆动时,右臂的旋转幅度一般不大于右肘的旋转角度且右臂与竖直向下的方向的夹角