没有合适的资源?快使用搜索试试~ 我知道了~
首页Morph和关节动画概述,骨骼蒙皮动画详解+代码
Morph和关节动画概述,骨骼蒙皮动画详解+代码
4星 · 超过85%的资源 需积分: 48 19 下载量 95 浏览量
更新于2023-03-16
评论 1
收藏 74KB DOCX 举报
讲述骨骼动画的资料很多,但大部分都是针对DX8或DX9的SkinnedMesh进行讲解。我觉得对于骨骼动画初学者增加了不必要的负担,还没有理解骨骼动画的实质就已被DX复杂的架构搞得晕头转向了。这篇文章把注意力集中在骨骼动画的基本组成结构和原理上,并实现了一个最简单纯手工的自定义骨骼动画例子帮助理解(使用最简单的OpenGL指令,甚至没有使用矩阵)。这篇文章在我学习理解骨骼动画的过程中逐步完善,是对这个技术的理解总结,属于学习笔记。
资源详情
资源评论
资源推荐
讲述骨骼动画的资料很多,但大部分都是针对 或 的
进行讲解。我觉得对于骨骼动画初学者增加了不必
要的负担,还没有理解骨骼动画的实质就已被 复杂的架构搞得
晕头转向了。这篇文章把注意力集中在骨骼动画的基本组成结构和
原理上,并实现了一个最简单纯手工的自定义骨骼动画例子帮助理
解(使用最简单的 指令,甚至没有使用矩阵)。这篇文章
在我学习理解骨骼动画的过程中逐步完善,是对这个技术的理解总
结,属于学习笔记。学习过程中参考了很多资料,其中给我启发最
大的是 写的”
!。由于本人自身也是初学者,所以错误和不
精 确 的 地 方 在 所 难 免 , 欢 迎 指 正 和 讨 论 , 请 发 邮 件 到
"#$"
或 加 入 " 邮 件 列 表 : %&&
"#''('&'"(( 。 另 外 文
本 不 涉 及 任 何 高 级 骨 骼 动 画 技 术 , 也 不 涉 及 架 构 的
技术和硬件加速,但本文中会引用
中 的 约 定 俗 成 的 名 词 , 如 )*+ , ,-
+ 等。
.
一) 模型动画基本原理和分类
.
模型动画的基本原理是让模型中各顶点的位置随时间变化。主要
种类有 动画,关节动画和骨骼蒙皮动画/0。
从动画数据的角度来说,三者一般都采用关键帧技术,即只给出关
键帧的数据,其他帧的数据使用插值得到。但由于这三种技术的不
同,关键帧的数据是不一样的。
.
(渐变,变形)动画是直接指定动画每一帧的顶点位置,其
动画关键中存储的是 所有顶点在关键帧对应时刻的位置。
.
关节动画的模型不是一个整体的 1而是分成很多部分/0,
通过一个父子层次结构将这些分散的 组织在一起,父
带动其下子 的运动,各 中的顶点坐标定义在自己的坐
标系中,这样各个 是作为一个整体参与运动的。动画帧中设
置各子 相对于其父 的变换(主要是旋转,当然也可包
括移动和缩放),通过子到父,一级级的变换累加(当然从技术上,
如果是矩阵操作是累乘)得到该 在整个动画模型所在的坐标
空间中的变换(从本文的视角来说就是世界坐标系了,下同),从
而确定每个 在世界坐标系中的位置和方向,然后以 为
单位渲染即可。关节动画的问题是,各部分 中的顶点是固定
在其 坐标系中的,这样在两个 结合处就可能产生裂缝。
.
第三类就是骨骼蒙皮动画即 了,骨骼蒙皮动画的出
现解决了关节动画的裂缝问题,而且效果非常酷,发明这个算法的
人一定是个天才,因为 的原理简单的难以置信,而
效果却那么好。骨骼动画的基本原理可概括为:在骨骼控制下,通
过顶点混合动态计算蒙皮网格的顶点,而骨骼的运动相对于其父骨
骼,并由动画关键帧数据驱动。一个骨骼动画通常包括骨骼层次结
构数据,网格/0数据,网格蒙皮数据/*0和骨骼的动画
/关键帧0数据。下面将具体分析。
.
二) 原理和结构分析
.
中文一般称作骨骼蒙皮动画,正如其名,这种动画
中包含骨骼(,)和蒙皮/0两个部分,, 的
层次结构和关节动画类似, 则和关节动画不同:关节动画中
是使用多个分散的 1而 中 是一个整体,
也就是说只有一个 1实际上如果没有骨骼让 运动变形,
就和静态模型一样了。 技术的精华在于蒙皮,
所谓的皮并不是模型的贴图(也许会有人这么想过吧),而是
本身,蒙皮是指将 中的顶点附着(绑定)在骨骼之上
而且每个顶点可以被多个骨骼所控制,这样在关节处的顶点由于同
时受到父子骨骼的拉扯而改变位置就消除了裂缝。
这个词从字面上理解似乎是有皮的模型,哦,如果贴图是皮,那么
普通静态模型不也都有吗?所以我觉得应该理解为具有蒙皮信息的
或可当做皮肤用的 ,这个皮肤就是 。而为了有皮
肤功能, 还需要蒙皮信息,即 数据,没有 数据就
是一个普通的静态 了。 数据决定顶点如何绑定到骨骼上。
顶点的 数据包括顶点受哪些骨骼影响以及这些骨骼影响该顶点
时 的 权 重 /'0 , 另 外 对 于 每 块 骨 骼 还 需 要 骨 骼 偏 移 矩 阵
/,-+0用来将顶点从 空间变换到骨骼空间。在
本文中,提到骨骼动画中的 特指这个皮肤 ,提到模型
是指骨骼动画模型整体。骨骼控制蒙皮运动,而骨骼本身的运动呢?
当然是动画数据了。每个关键帧中包含时间和骨骼运动信息,运动
信息可以用一个矩阵直接表示骨骼新的变换,也可用四元数表示骨
骼的旋转,也可以随便自己定义什么只要能让骨骼动就行。除了使
用编辑设定好的动画帧数据,也可以使用物理计算对骨骼进行实时
控制。
下面分别具体分析骨骼蒙皮动画中的结构部件。
.
2)理解骨骼和骨骼层次结构(,3")
.
首先要明确一个观念:骨骼决定了模型整体在世界坐标系中的位
置和朝向。
先看看静态模型吧,静态模型没有骨骼,我们在世界坐标系中放
置静态模型时,只要指定模型自身坐标系在世界坐标系中的位置
和朝向。在骨骼动画中,不是把 直接放到世界坐标系中,
只是作为 使用的,是依附于骨骼的,真正决定模型在
世界坐标系中的位置和朝向的是骨骼。在渲染静态模型时,由于
模型的顶点都是定义在模型坐标系中的,所以各顶点只要经过模
型坐标系到世界坐标系的变换后就可进行渲染。而对于骨骼动画,
我们设置模型的位置和朝向,实际是在设置根骨骼的位置和朝向,
然后根据骨骼层次结构中父子骨骼之间的变换关系计算出各个骨
骼的位置和朝向,然后根据骨骼对 中顶点的绑定计算出顶
点在世界坐标系中的坐标,从而对顶点进行渲染。要记住,在骨
骼动画中,骨骼才是模型主体, 不过是一层皮,一件衣服。
.
如何理解骨骼?请看第二个观念:骨骼可理解为一个坐标空间。
在一些文章中往往会提到关节和骨骼,那么关节是什么4骨骼又
是什么?下图是一个手臂的骨骼层次的示例。
.
骨骼只是一个形象的说法,实际上骨骼可理解为一个坐标空间,
关节可理解为骨骼坐标空间的原点。关节的位置由它在父骨骼坐
标空间中的位置描述。上图中有三块骨骼,分别是上臂,前臂和
两个手指。(5(/锁骨0是一个关节,它是上臂的原点,同样
肘关节/(670是前臂的原点,腕关节/0是手指骨骼
的原点。关节既决定了骨骼空间的位置,又是骨骼空间的旋转和
缩放中心。为什么用一个 88 矩阵就可以表达一个骨骼,因为
88 矩阵中含有的平移分量决定了关节的位置,旋转和缩放分量
决定了骨骼空间的旋转和缩放。我们来看前臂这个骨骼,其原点
位置是位于上臂上某处的,对于上臂来说,它知道自己的坐标空
间某处(即肘关节所在的位置)有一个子空间,那就是前臂,至
于前臂里面是啥就不考虑了。当前臂绕肘关节旋转时,实际是前
臂坐标空间在旋转,从而其中包含的子空间也在绕肘关节旋转,
在这个例子中是 #' 骨骼。和实际生物骨骼不同的是,我们这
里的骨骼并没有实质的骨头,所以前臂旋转时,他自己没啥可转
的,改变的只是坐标空间的朝向。你可以说上图的蓝线在转,但
实际蓝线并不存在,蓝线只是画上去表示骨骼之间关系的,真正
转的是骨骼空间,我们能看到在转的是 7,也就是两个
#' 骨骼的坐标空间,因为他们是子空间,会跟随父空间运动,
就好比人跟着地球转一样。
骨骼就是坐标空间,骨骼层次就是嵌套的坐标空间。关节只是描
述骨骼的位置即骨骼自己的坐标空间原点在其父空间中的位置,
绕关节旋转是指骨骼坐标空间(包括所有子空间)自身的旋转,
如此理解足矣。但还有两个可能的疑问,一是骨骼的长度问题,
由于骨骼是坐标空间,没有所谓的长度和宽度的限制,我们看到
的长度一方面是蒙皮后的结果,另一方面子骨骼的原点(也就是
关节)的位置往往决定了视觉上父骨骼的长度,比如这里
线段的长度实际是由 (67 的位置决定的。第二个问
题,手指的那个端点是啥啊?实际上在我们的例子中手指没有子
骨骼,所以那个端点并不存在:)那是为了方便演示画上去的。
实际问题中总有最下层的骨骼,他们不能决定其他骨骼了,他们
的作用只剩下控制 顶点。对了,那么手指的长度如何确定?
我们看到的长度应该是由手指部分的顶点和蒙皮决定的,也就是
由 中属于手指的那些点离腕关节的距离决定。
.
经过一段长篇大论,我们终于清楚骨骼和骨骼层次是啥了,但是
为什么要将骨骼组织成层次结构呢?答案是为了做动画方便,设
想如果只有一块骨骼,那么让他动起来就太简单了,动画每一帧
直接指定他的位置即可。如果是 块呢?通过组成一个层次结构,
就可以通过父骨骼控制子骨骼的运动,牵一发而动全身,改变某
骨骼时并不需要设置其下子骨骼的位置,子骨骼的位置会通过计
算自动得到。上文已经说过,父子骨骼之间的关系可以理解为,
子骨骼位于父骨骼的坐标系中。我们知道物体在坐标系中可以做
平移变换,以及自身的旋转和缩放变换。子骨骼在父骨骼的坐标
系中也可以做这些变换来改变自己在其父骨骼坐标系中的位置和
朝向等。那么如何表示呢?由于 88 矩阵可以同时表示上述三种
变换,所以一般描述骨骼在其父骨骼坐标系中的变换时使用一个
矩 阵 , 也 就 是 中 的
)*+。实际上这不是唯一的方法,但应该
是公认的方法,因为矩阵不光可以同时表示多种变换还可以方便
的通过连乘进行变换的组合,这在层次结构中非常方便。在本文
的例子9最简单的 实例中,我只演示了平移变换,
所以只用一个 坐标就可以表示子骨骼在父骨骼中的位置。下
面是 ,( 最初的定义:
(.,
:
6(%
.......;.<+1.<"1.<=>&&这个坐标是定义在父骨骼坐标系中的
?>
@1除了使用矩阵,坐标或某东西描述子骨骼的位置,我们的
,( 定义中还需要一些指针来建立层次结构,也就是说
我们要能通过父骨骼找到子骨骼或反之。问题是我们需要什么指
针呢?从父指向子还是反之?结论是看你需要怎么用了。如果使
用矩阵,需要将父子骨骼矩阵级联相乘,无论你的矩阵是左乘列
向量还是右乘行向量,从哪边开始乘不重要,只要乘法中父子矩
阵的左右位置正确,所以可以在骨骼中只存放指向父的指针,从
子到父每次得到父矩阵循环相乘。也可以像 中那样从根开始
相乘并递归。在文本的 A 中由于没用矩阵,直接使用坐标
相加计算坐标,所以要指定父的位置,然后计算出子的位置,那
么需要在 ,( 中加入子骨骼的指针,因为子骨骼有 个,
所以需要 个指针吗?不一定,看看 的做法,只需要两
个就搞定了,指向第一子的和指向兄弟骨骼的。这样事先就不需
要知道有多少子了。下面是修改后的 ,(:
.
(.,
剩余23页未读,继续阅读
ssdutabbot
- 粉丝: 5
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- stc12c5a60s2 例程
- Android通过全局变量传递数据
- c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf
- 建筑供配电系统相关课件.pptx
- 企业管理规章制度及管理模式.doc
- vb打开摄像头.doc
- 云计算-可信计算中认证协议改进方案.pdf
- [详细完整版]单片机编程4.ppt
- c语言常用算法.pdf
- c++经典程序代码大全.pdf
- 单片机数字时钟资料.doc
- 11项目管理前沿1.0.pptx
- 基于ssm的“魅力”繁峙宣传网站的设计与实现论文.doc
- 智慧交通综合解决方案.pptx
- 建筑防潮设计-PowerPointPresentati.pptx
- SPC统计过程控制程序.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论1