人体骨骼模型(人体骨骼模型 全身及名称)

更新时间:2023-02-28 21:47:40 阅读: 评论:0

人体骨骼模型的人体骨骼尺寸

人体骨骼尺寸规格尺寸:有170cm 130cm 85cm 65cm 45cm 20cm的。各种规格的人体骨骼模型不只是比例的区别,如85cm的就有硬脊椎的和软脊椎的,130cm和170cm的骨骼模型显示神经分支、脊椎动脉和腰椎间盘等。头颅含可活动的下巴、可移动的头颅盖、骨缝线和3颗可取下的下牙。
170公分高的人体骨骼模型有些附带内脏、血管、神经、动静脉等,可以真实地演示人体骨骼模型的构造。
人体骨骼模型与人体躯干模型同样属于医学教学模型。试用于中专、医学院等在讲解人体解剖时使用,直观性强。

人体骨骼模型有国产人体骨骼和国外进口人体骨骼模型。
人体骨骼模型170CM,手臂和腿部可拆下供研究。显示神经分支、脊椎动脉和腰椎间盘等。铁制底座 ,架子和五金配件全部采用不锈钢 .用PVC制成.
尺寸: 170CM

人体骨骼模型85cm,模拟人体运动,直观性强。它让孩子们有兴趣学习骨头的名称,使学生、医生和其他对模型感兴趣者感到满意。头颅盖可取下。安放在铁座上。尺寸:85CM 。

人体骨骼带分椎间盘模型85CM,这款贵重的教学模型显示脊椎、神经根、脊椎动脉、分椎间盘、用绿色加深的胸部软骨、可分成3件的头颅和手足。这款精确的模型包含成人的200块骨头,四肢可弯曲到任何自然的状态,除手足外全部用关节连接。这款受欢迎的案头模型适用于康复治疗、理疗和运动医学专业使用。铁质座。尺寸:85CM。

人体骨骼散骨模型(游离骨),材质PVC。


买人体骨骼模型有用吗

买人体骨骼模型用处不大,想要加深记忆,多去几次实验室就行,你也可以买些图册什么的来看,一本是人体实用彩图,一本是标本的实物图。 而且,各人认为,看模型远没有看真实的骨骼标本有意义,因为不同人之间是有很大差异的,骨头也是,比如说骶骨,五合一,我见的那个标本是六合一。

人体骨骼和人体骨骼模型用英语怎么说?骨骼要加复数吗?

人体骨骼 Human Skeleton
人体骨骼模型 Artificial Human Skeleton
作为人体骨骼的整体概念而言不用加复数,如果强调是多种骨骼可以加复数.
bone 如果是指多个骨头的话就必须加复数

如何做人体骨架模型?

  本文提供一种将骨架动作矢量映射到人体骨架模型的一种方法,通过输入各个骨骼的当前方向,反馈给骨架模型,这样就实现了动画的效果。实验开发工具是VC6.0在OpenGL平台上开发完成。

  阅读对象:

  假定读者已经熟悉OpenGL编程,就算不熟悉,只要了解基本的旋转,平移,堆栈操作就好。
  假定读者已经了解基本的c++编程,其中需要了解递归的算法,递归的方法请参考一下数据结构吧。

  制作过程:

  第一步,3D模型准备

  这一步骤的目的是提供分解的骨骼模型,它需要导出多个组成身体结构的文件,模型可以不用自己制作,只要到网上找找吧,应该很多,最好是是人体模型,如果用动物的模型也可以,不过需要自己定义映射骨架了,比如图中的骷髅模型是我从人体动画软件por 5.0找到的。然后使用3d max 将身体的各个部位导出为3ds文件,这个步骤很简单,也不需要有什么3d max的基础。这里有一个小的技巧就是可以选中多个部分作为一个3ds模型导出,比如我需要将左右肩胛骨与脊椎骨肋骨作为同一个部分导出,这样可以将它命名为身体躯干(body)。这样我们就准备了各个3ds文件了,分别是:

  身体躯干 BODY.3DS
  头部 HEAD.3DS
  左臂 LSHOULDER.3DS
  右臂 RSHOULDER.3DS
  左小臂 LELBOW.3DS
  右小臂 RELBOW.3DS
  左大腿 LTHIGH.3DS
  右大腿 RTHIGH.3DS
  左小腿 LFEET.3DS
  右小腿 RFEET.3DS

  这样这些组成部分就可以灵活的拼接出一个人体来了。

  第二步,定义相关的核心数据结构

  为了得到运动的各个身体部分数据信息,我们需要存储一些运动信息,主要有:
  骨骼ID
  骨骼关节的当前位置;r_x,r_y,r_z
  骨骼之间的关系,例如手臂是躯干的延伸,而左小臂是左臂的延伸;PID,CID

  我们可以通过下图来了解骨骼之间的结构关系

  存放3ds文件位置;file_name_3ds
  3ds模型的初始化方向;这个是比较抽象一点的概念,它是指从父节点指向子节点的方向,例如左小臂的初始位置是平放向下,那么对应的矢量就是 (-0.2,-1,0)

  以下是数据结构部分:
  class bone
  {
  public:
  int y;
  int x;
  int r_z; //现实世界z坐标
  int r_y;
  int r_x;
  int rotated_X; //旋转后的坐标
  int rotated_Y;
  int is_marked; //是否已经标记
  int PID; //父节点
  int CID; //子节点,目前针对轴关节和膝盖有效
  float start_arc_x,end_arc_x; //相对父节点的x 左右方向转动角度限制
  float start_arc_y,end_arc_y; //相对父节点的y 上下方向转动角度限制
  float start_arc_z,end_arc_z; //相对父节点的z 前后方向转动角度限制
  double LengthRatio;
  char name[80]; //名称
  char file_name_3ds[180]; //3ds文件名称
  int ID;
  bone(int ID,char *name,int PID);
  virtual ~bone();
  float bone_init_x,bone_init_y,bone_init_z; //初始化骨骼的矢量方向,3d max 模型
  };

  第三步,初始化骨架结构

  在定义了bone的结构以后,我们定义一个skeleton类来在第一次初始化时加载这些结构,

  obone = bone (2,"head",1); //定义一个bone
  strcpy(obone.file_name_3ds,"head.3DS"); //设置它的3ds文件名
  obone.bone_init_x = 0; //初始化骨骼的矢量方向
  obone.bone_init_y = 1;
  obone.bone_init_z = 0;
  bonevec.push_back (obone); //放入vector结构,这里用到了STL编程技术中的vector

  以下是实现的部分代码:
  skelecton::skelecton()
  {
  float fy = 0.56f ;
  float ftx = 0.19f;
  float ffx = 0.08f;
  bone obone = bone (1,"neck",0);
  bonevec.push_back (obone);

  obone = bone (2,"head",1);
  strcpy(obone.file_name_3ds,"head.3DS");
  obone.bone_init_x = 0;
  obone.bone_init_y = 1;
  obone.bone_init_z = 0;
  bonevec.push_back (obone);

  obone = bone (3,"rShoulder",1);
  bonevec.push_back (obone);

  obone = bone (4,"lShoulder",1);
  bonevec.push_back (obone);

  obone = bone (5,"rElbow",3);
  strcpy(obone.file_name_3ds,"rShoulder.3DS");
  obone.bone_init_x = fy;
  obone.bone_init_y = -1;
  obone.bone_init_z = 0;
  obone.CID = 7;
  bonevec.push_back (obone);

  obone = bone (6,"lElbow",4);
  strcpy(obone.file_name_3ds,"lShoulder.3DS");
  obone.bone_init_x = -fy;
  obone.bone_init_y = -1;
  obone.bone_init_z = 0;
  obone.CID = 8;
  bonevec.push_back (obone);

  //.............太长只给出部分的代码..........................
  }

  第四步,学习3ds公共的类CLoad3DS,可以用来载入显示模型

  这个类是公用一个类,详细的类CLoad3DS的接口信息可以到一个open source项目里参考。http://scourge.sourceforge.net
  http://scourge.sourceforge.net/api/3ds_8h-source.html
  实际上在使用这个类时候,我做了一些修改,加了得到最大顶点的方法。这个在第五步会说明。

  我们定义一个OpenGL的类来做模型控制类,负责载入模型,

  CLoad3DS* m_3ds;

  int OpenGL::Load3DS(int ID, char *filename)
  {
  if(m_3ds!=NULL) m_3ds->Init(filename,ID);
  return 0;
  }

  然后在显示时候调用

  int OpenGL::show3ds(int ID)
  {
  m_3ds->show3ds(ID,0,0,0,2);
  return 0;
  }

  第五步,使用递归方法分层次载入模型

  这里是重点的内容了,让我们思考一些问题,实现骨骼会随着输入的方向而改变方向,需要做那些事情呢?

  首先针对一块骨骼来考虑:

  第一,我们需要让骨骼绕着它的节点旋转到输入的方向上

  第二,我们需要知道骨骼目前节点的位置,才能旋转。可是我们知道骨骼会跟着它的父骨骼转动的,例如左小臂会跟着左臂转动,当身体转动时左臂也会跟着身体转动的,这里看起来像是有一个父子连动的关系,所以当前节点的位置会与它的父骨骼有关,父骨骼转动的角度,子骨骼也必须转动,所以这里自然想到了递归模型了,至于如何存储这些转动过程呢,还好openGL提供了glPushMatrix();glPopMatrix();那么所有的子骨骼必须包含在父骨骼的glPushMatrix();glPopMatrix();好了,这个变成

  //递归实现3d现实
  int skelecton::Render_skeleton_3D(int ID)
  {

  glPushMatrix(); //开始记录堆栈
  joint_point = pgl->get_joint_point(ID); //找到节点位置
  glTranslatef(joint_point.x,joint_point.y,joint_point.z); //坐标移到节点位置
  pgl->rotate_bone (vt1,vt2,vto); //旋转骨骼到指定的方向
  glTranslatef(-joint_point.x,-joint_point.y,-joint_point.z);//坐标移回来
  pgl->show3ds(ID); //显示模型

  //遍历子节点
  for (theIterator = bonevec.begin(); theIterator != bonevec.end(); theIterator++)
  {
  pbone = theIterator;
  if((pbone->PID == ID) )
  {
  Render_skeleton_3D(pbone->ID); //递归调用
  }
  }

  glPopMatrix(); //退出记录堆栈
  }

  剩下需要解决的问题就是如何找到节点位置。
  寻找节点位置,我们看到上面代码 get_joint_point(ID)就是找到节点了,其实如果不追求高的准确度,我们可以假设每个模型的最高的点即为骨骼的节点,当然这个假设前提是人体模型是正面站立的,手臂自然垂下,这样可以近似认为每个模型的最高的点即为骨骼的节点,这样函数就很简单了,这个方法是修改了Cload3ds类的方法,如下:

  Vector3f CLoad3DS::get_joint_point(int j0)
  {
  CVector3 LastPoint;
  Vector3f vect;
  LastPoint.y = -1000 ;
  if(j0==2) LastPoint.y = 1000 ;//头部节点朝下

  // 遍历模型中所有的对象
  for(int l = 0; l < g_3DModel[j0].numOfObjects; l++)
  {
  if(g_3DModel[j0].pObject.size() <= 0) break;// 如果对象的大小小于0,则退出
  t3DObject *pObject = &g_3DModel[j0].pObject[l];// 获得当前显示的对象

  for(int j = 0; j < pObject->numOfFaces; j++) // 遍历所有的面
  {
  for(int tex = 0; tex < 3; tex++) // 遍历三角形的所有点
  {
  int index = pObject->pFaces[j].vertIndex[tex]; // 获得面对每个点的索引

  if(j0==2)
  {
  if(pObject->pVerts[index].y < LastPoint.y )
  LastPoint = pObject->pVerts[index];
  }
  el
  {
  if(pObject->pVerts[index].y > LastPoint.y )
  LastPoint = pObject->pVerts[index];
  }
  }
  }
  }
  vect.x = LastPoint.x ;
  vect.y = LastPoint.y ;
  vect.z = LastPoint.z ;
  return vect;
  }

  比较特殊的是头部节点是通过脖子连接的,所以它是取最低的点。

  现在解决最后的问题了,如何旋转了,具体来讲就是骨骼从原来自然的状态旋转到目前的方向,例如手臂从自然垂下变成抬起,垂下和抬起两个状态的矢量是不同的方向的,如何旋转呢? 这里就要用到了空间几何里的点积和叉积的概念了,简单来讲就是利用点积来求矢量夹角余弦,利用叉积来求两个矢量的法向量,如果你忘记了这些概念,可以回去参考一下高等数学书,这个连接也提供了一些资料,可以帮助理解http://www.gameres.com/Articles/Program/Visual/Other/shiliang.htm
  然后呢,我们知道了两个矢量的夹角与它们的法向量,下面的事情就变得简单了,我们让骨骼原来的矢量以法向量为旋转轴,旋转一定角度,这个角度就是两个矢量的夹角,这样问题就解决了,所以这里的代码如下:

  int OpenGL::rotate_bone(Vector3f vVector1, Vector3f vVector2, Vector3f vVectorOrgin)
  {
  Vector3f vt1 = Vector3f(vVector1.x,vVector1.y,vVector1.z);
  Vector3f vt2 = Vector3f(vVector2.x,vVector2.y,vVector2.z);
  Vector3f vt4 = vt2-vt1;

  double arc12 = AngleBetweenVectors(vVectorOrgin,vt4);
  double rarc12 = 180*arc12/pi;
  float len= Distance(vt1,vt2);
  Vector3f vt3 = Cross(vVectorOrgin,vt4);
  glRotatef ((float)rarc12,vt3.x,vt3.y,vt3.z);

  return 0;
  }

本文发布于:2023-02-28 18:58:00,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/zhishi/a/167759206048629.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:人体骨骼模型(人体骨骼模型 全身及名称).doc

本文 PDF 下载地址:人体骨骼模型(人体骨骼模型 全身及名称).pdf

标签:骨骼   模型   人体   全身   名称
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 实用文体写作网旗下知识大全大全栏目是一个全百科类宝库! 优秀范文|法律文书|专利查询|