- 浏览: 395027 次
- 性别:
- 来自: 上海
-
文章分类
最新评论
-
yanmie:
您的文章已被我们收录地址:http://www.airmyth ...
学习一下 Pixel Bender -
chaimzane:
我现在自己都有点看不懂了 实际上很简单, LocaleModu ...
Flex 优化技巧 -- 全局CSS样式模块实现RSLS 方式加载 -
muqingren:
以我现在对flex的了解,没看懂你说的........... ...
Flex 优化技巧 -- 全局CSS样式模块实现RSLS 方式加载 -
cony138:
卤煮碉堡了啊
A*寻路 -- 更加真实 的路径(一) -
jack_ye:
[/flash][/flash][/fl[u][u]ash][ ...
Alternativa3D 8 基础理论 / 概念
转自http://www.cppblog.com/liangairan/articles/105923.html
理解骨骼动画
骨骼动画是使用 ” 骨头 ” 来运动一个模型而不是通过手动编辑和移动每个顶点或面而实现的动画 . 每个顶点被附着到一根骨头 ( 或有时是多根骨头 ). 一根骨头或一个关节只是一组顶点的一个控制点 . 这些概念类似于我们身体里的关节 , 例如我们的膝关节或腕关节等 . 当骨头运动时 , 每个附着在它上的顶点也跟着运动 , 如图 5.2 显示的那样 . 甚至骨头自身的运动也会导致其它骨头的运动 . 这使得模型运动起来比较适当合理 , 因为在真实的生活中 , 身体的一部分运动会影响到身体的其它部分 . 所以 , 程序员需要能利用骨头来计算单个顶点的变换 . 虽然这会带来较多的工作量 , 可是结果证明这是值得的 .
图 5.2 顶点动画需要你移动每个顶点 , 而骨骼动画使你只需移动模型中的一根骨头 , 顶点将能随之而变 .
骨骼动画的优点
骨格动画比传统的顶点变换型动画有很多优点 , 正如你在前面章节里看到的那样 .
首先 , 也是对于玩家最直观的一点便是要增加真实感 . 基于骨骼运动的角色更趋于真实性 , 并常出现在比传统模型要求和周围事物有更强交互性的地方 . 要使模型更趋于运动真实性 , 则对基于骨骼的模型来说确是件简单的事 . 在传统的关键帧动画中 , 游戏会在两个位置中间进行线性插值 . 然而 , 在这种情况下 , 关节实际上并没有旋转 , 这对于生命体以旋转方式运动会有问题 .
这对用户而言 , 并不那么明显 , 但对程序员来说 , 那样的动画是否占用了较少的存储空间是非常重要的 . 用于代替为每帧动画都存储一组新的顶点 , 所有我们需要存储的只是骨头的旋转和平移信息 . 这可以节省巨大的存储空间 , 你仅仅只要加入 骨头 和顶点 — 骨头附着 信息 .
这因骨骼动画需要而多加的一点存储空间可以用于保存更细致的模型 , 加入额外的支运动帧 , 或甚至可经适当改进后 , 用于游戏的其它地方 . 你能够添加更多细节至游戏的世界中 , 改进 A.I. 来提供一个更刺激的游戏 , 或者加入一些很酷的东东或复活节彩蛋 , 而这些都是原来你很想加入却因涉及空间问题而不能加入的 .
而另一个优点表现在那些创建游戏 3D 内容的美工上 . 一个好的骨骼动画系统将缩减美工做模型动画的时间 . 几乎每一个好的动画程序都已使用骨骼动画来确保模型运动的过程从美工到程序员 , 再到游戏 , 最后到玩家的平滑过渡 . 这加速了游戏内容的创建过程 , 也确保了当模型被导出成游戏所使用的格式时没有动画或特征的失真 .
一个更长远的优点是对程序员的另一个好处 ( 这越来越好了 , 不是吗 ?). 因为骨骼的自由性 , 这使得你可以随心所欲地实时定位它们 , 也可以实现在运行时创建动画 . 就相当于提供了一个更多样化的动画库 . 你甚至能够让游戏控制当身体碰到一个物体时的动作 , 或从一个斜坡上滑下来 . 这种技术是在玩的时候即时产生的 ,Unreal Tournament 2003’s Physics 系统 (http://www.epicgames.com) 里就有这样一个值得注意的例子 . 角色和模型在环境里面真实交互 , 包括从斜坡上滑下和靠在上面徐徐移动 .
骨骼动画有一个缺点就是相对于传统的关键帧动画 , 它不容易被理解和实现 . 本章将帮助你缓解任何你对骨骼动画的担心 .
骨骼动画的原理
首先来看看你的手臂 . 将你的手臂在你胸前展开并观察它 . 你的手臂有许多骨头 , 两根主要的大骨头 (two main ones), 还有手掌 ( 译注 : 这里指腕关节到指尖的所有部分 , 下面说的手掌也一样 ) 和手指上的一些骨头 .
移动你的手指 , 是不是它们移动 ? 只移动你的手指 , 而你手臂上的其它部分并不会因此而移动 . 现在弯曲你的肘关节 , 不仅你的手臂移动了 , 而且你的手指和手掌也同样跟着移动了 . 如果不是这样的 , 那你的手臂和你的手掌及手指就变得断开了 , 且每部分都孤立得悬挂在空中 , 这可不太好 .
如何将这个手臂和骨骼动画关联在一起运动呢 ? 你的手臂代表了 3D 模型的一部分 , 你的手指 , 手掌 , 以及手臂的上下各部分都是这个模型的一部分 . 不同的关节和骨头贯穿了你的手臂 , 如肩关节 , 肘关节 , 腕关节 , 还有指关节 .
这就是说 , 当你移动手臂 ” 上游 ” 的一根骨头时 , 任何在这根骨头的下游部分也都会跟着移动 . 这就是骨骼动画最基本的概念 .
这样就有一个美妙之处是 : 它可以允许你移动模型上的任何一根骨头 , 并渗透到下面的移动 , 应用到以这个移动为原点的下面的任何事物 . 例如 , 这允许你只需移动角色的肩膀 , 不需担心肘和手的移动位置 , 因为它们会自动移到正确位置 . 你也能够通过复位以确保它们会被自动更新 . 图 5.3 显示了一个关节和附着在这些关节上的顶点的例子 .
图 5.3 当执行骨骼动画时 , 你不必担心关节 , 或骨头之间的结合点 . 每个顶点实际上是附着 ( 关联 ) 到关节点的 , 而不是骨头 .
根关节
根关节是一个模型中的终端关节 . 任何其它关节都以自己的路径最终关联到根关节 . 任何对根关节的操作 , 如不论是平移或是旋转 , 都会影响到模型中的每个顶点 . 你可以认为根关节是控制所有其它关节的关节 . 简单修改根关节 , 你能使角色直立行走 , 或旋转他以让他倒过来在天花板上行走 — 所做的只是一个简单的调用 .
在每个模型里只有一个根关节 , 它没有父关节 . 根关节通常是许多骨头连接的地方 , 而不是需要一个小动画的地方 . 例如包括中部和下后部 , 但没有明确要求根关节一定要在模型中的某个准确位置 . 只要你愿意 , 每个模型都可以不同 . 图 5.4 显示了当根节点的位置和朝向被修改后会发生的变化 .
图 5.4 旋转或平移根关节将影响模型中其他所有的关节和项点 .
父关节和子关节
一个关节可以有父关节和子关节 . 其父关节会影响到它做任何事情 . 父关节的旋转和平移会影响计算当前关节的新位置 . 再拿手臂的例子来说 , 肘关节是手掌的父关节 . 移动肘则影响手掌 . 在简单的骨骼动画里 , 每个关节只有一个父关节 , 如果有的话 .
但是 , 一个关节可以有许多子关节 . 子关节是相对于父关节来说的 . 任何你对父关节做的事都会渗透到子关节 . 换个角度来说就是 , 当前关节是所有在它下面的关节的父关节 .
图 5.5 父 - 子关节的关系
骨骼动画的关键帧
常规关键帧动画保存了多份顶点拷贝 , 骨骼动画系统也有关键帧 . 关键帧的再现是一个模型位置的瞬时状态 .
然而 , 不同于每个关键帧都包含其自身所有顶点的拷贝的方式 , 骨骼动画的关键帧或叫骨骼帧 (boneframe) 包含了旋转和平移的变换信息 , 一般平移是一个 X,Y,Z 值的形式 , 和三个分别包含了按 X,Y,Z 轴旋转的值 . 正如常规顶点关键帧一样 , 这些骨骼帧必须被插值来提供平滑的动画效果 .
位置或平移的值可以在两个之间进行线性插值 , 就像你在传统关键帧动画里对顶点的操作一样 . 但旋转则有问题 , 简单的在两个值之间进行平移那样的插值会产生奇怪的效果 . 旋转将不是平滑的 , 它可能会加速和减速 , 这依赖于其自身的位置 . 如果两个旋转信息之间的差异比较大 , 模型可能像胶在一起的方块那样出现 ” 渗出 (ooze)”. 这是因为使用线性插值 , 所有的东西都是沿着直线插值的 , 如果这用这种方式执行旋转就会产生奇怪的效果 , 因为旋转是沿着弧插值而不是直线 . 对弧形路径按两端点的直线方式而不是沿弧的路径方式就会产行 ” 渗出 ” 效果 .
解决这个问题的最好方法就是采用四元数 . 这你在第二章就学会过了 .” 介绍四元数 ”, 四元数最大的优点之一是他们可以容易地进行插值 . 不仅容易插值 , 而且能很容易地进行球面 线性插值 .
球面线性插值 在球面上的两点之前进行插值 . 然而 , 相对于在两点之间以直线方式逼近 , 球面线性插值是沿着球表面的曲面的 . 你可以设想捡起一只球 , 比如一个篮球 , 并在上面标上两点 , 然后 , 用你的手指找出这两点间最短的路径 . 因为你的手指不能进入球的内部 , 于是这条在两点间的路径将是一条弧 . 这就是 SLERP 的处理方式 . 使用 SLERP 函数 , 旋转就可以沿着弧进行插值 , 创建出一个比较平滑的 , 顺眼的效果 .
计算位置
利用你在上面己经阅读到的信息 , 你可能想尝试实现骨骼动画了 . 然而 , 你还没有学习关于父关节是如何影响子关节的具体内容 . 简单地使用关键帧将使每个关节独立地移动 , 很可能产生一个奇怪的 , 扭曲的网格 .
这部分内容将告诉你关于如何更改它以使关节之间能正常运动 . 首先你要做的就是 创建一个变换矩阵 , 该矩阵用于每一个使用了不同旋转和平移关键帧数据 的 ( 关键帧 ) 点 . 这个变换矩阵可以通过先生成三个旋转矩阵 ( 译注 :x,y,z 三个方向的旋转矩阵 ) 和平移矩阵 , 这在第一章已经学过了 , 再将这三个矩阵相乘就会生成了最终的变换矩阵 . 你也可以使用 matrix 类的 SetRotation 和 SetTranslation 函数来避免你自己做矩阵乘法 . 这个生成的矩阵叫做相对矩阵 (relative matrix).
下一步你需要计算出一个绝对矩阵 (absolute matrix). 绝对矩阵是关节的相对矩阵乘上它的父关节的绝对矩阵得到的 . 绝对矩阵告诉你关节的绝对变换 ( 译注 : 就是将关节的本地坐标变换为世界坐标 ). 这包括了自身的相对变换 , 除此之外 , 层次结构中所有在它之前的关节的变换都已计算完成 . 这允许其他关节的移动作为移动关节链上游关节的结果 . 细想一下 , 例如 , 当你移动肩膀时肘又是怎么移动的 , 这引出了一个问题 : 你如何计算最初的绝对矩阵 ? 记住 , 根关节是没有父关节的 , 因此 , 它的绝对矩阵就是它的相对矩阵 .
假如你以正确的顺序遍历了各关节 , 同时按此顺序计算出各个绝对矩阵 , 每个关节 ( 的绝对矩阵 ) 将会包含它父关节的变换 , 以及它父关节的父关节的变换等等 . 图 5.6 显示了当你变换一个关节前顾及所有先前 ( 关节 ) 的变换时发生的情况 .
图 5.6 遍历各关节 , 并顾及其所有前面的变换 . 注意哪怕只有一个关节要移动 , 在它下面的关节也得跟着移动 , 这很像移动你的臀部 , 则你的膝和踝也得跟着移动一样 .
你是否只存储了子关节的索引 , 而没有储存关节的父关节索引 ? 你立即要访问的索引集依赖于模型的格式 . 一些格式像 MS3D 同时给你每个关节的父关节索引 , 其它格式则可能给你子关节索引 . 使用子关节索引需要一个明显不同于使用父索引的方法 , 但一点都不会比后者难 . 你再次从根关节开始 , 在计算了根关节的变换矩阵之后 , 通过一个类似于 glPushMatrix 的命令将一个新的矩阵压入栈内 . 就创建了一个新的世界变换矩阵 (world matrix) 的拷贝 , 这个世界变换矩阵是在被显示前执行了所有的几何变换的矩阵 . 现在用你的新矩阵乘以根关节的本地矩阵 . 结果就是世界变换矩阵 , 它在下一个骨头被画出之前将所有事物放置到正确位置 , 父关节的变换也被考虑在内了 . 举个例子 , 角色的臀部的旋转可能是某些动作的总合 . 因为膝关节和踝关节是臀关节的子关节 , 它们也要被旋转 .
绘制函数像这样递归 , 它对自己的子关节继续调用绘制函数 , 每个子关节又对自己的子关节调用渲染函数 , 以此类推直到到达终端关节 ( 没有子关节的关节 ), 复位栈用一个 glPopMatrix 这样的命令 . 例如 , 当要绘制一个角色的一条腿时 , 新的矩阵被压入栈内用于计算膝关节 , 踝关节和脚关节 . 但是 , 如果要开始计算手臂时 , 你应该出格到处理腿之前的栈状态 , 否则 , 每当你移动腿时 , 手臂也将跟着移动了 .
图 5.7 显示了一个递归渲染函数 .
图 5.7 渲染用子索引代替父索引存储的关节
将网格 附着 到骨骼
当你的关节己能平滑运动的时候 , 也是该将网格附着到骨骼的时候 . 网格 (mesh) 组成了模型的形状 , 它是由一组使模型具有立体感和细节的顶点和三角形组成 , 没有网格 , 基于骨骼运动的模型只是一个简单的骨架 . 每个网格的顶点存储了一个指向关节数组的索引 , 用于指示它被附着到某根骨头 . 现在 , 存储关节的方式决定了这些顶点的变换和渲染的方法 .
如果每个关节存储时带有其父关节的索引 , 同时你已经遍历和计算了最终的绝对矩阵 , 那么附着网格是很简单的 . 确保变换后的顶点保存到一个专门的地方 , 不要覆盖原始的顶点 . 这是因为在绝大多数格式里 , 骨骼帧不会被累积 , 每帧保存了从起点起的特定关节的旋转和平移的信息 . 如果你不回退到原始顶点 , 那么当每次计算新顶点位置时 , 模型将会飘乎不定得运动 . 图 5.8 中可以看出每个顶点单独附着到一个关节是什么意思 .
图 5.8 顶点附着到关节
现在你很可能在对自己说 ,” 好的 , 我能运动一个模型的顶点 , 那三角形 , 法线 , 以及纹理坐标怎么处理呢 ”? 这也正是骨骼模型真正开始闪光的地方 . 每个模型包含了一个纹理坐标的集合和一个三角形信息的集合 . 仅因为顶点的位置变更并不意味着三角形顶点索引和纹理坐标也会变化 . 这意思是说 , 当你第一次设置好它们之后就根本不需要再担心它们 .
法线则是另一回事了 , 因为多边形的朝向和顶点的位置更改了 , 因此法线也相应更改了 . 如果你正在使用面法线 , 那么你在每一帧将他们传给渲染器之前都需要重新计算 . 然而 , 如果你一开始就计算了顶点法线 , 那么你很幸运 , 顶点法线不必在变换后都完全重新计算 , 它们能利用和顶点相同的变换矩阵来进行变换 . 唯一不同的是 , 你不需要考虑平移 . 使用 matrix 类的 Transform3() 函数将旋转你的顶点法向量 , 同时仍能保留其原始大小 .
如果关节保存了子关节的索引 , 并且你使用 glPushMatrix 将当前的变换矩阵压入栈内 , 那么渲染模型就会变得十分容易 . 对这种情况 , 没有必要在显示之前变换每个顶点 . 不管渲染任何东西都没有更改的必要 . 任何你要渲染的现在将被适当变换 , 甚至面法线 . 另一个需要考虑的问题是 , 顶点如何附着到多于一根的骨头 . 此时 , 每根骨头将被赋予一个权重 , 这个权重决定它影响关节点的比重 . 最终的变换是所有这些被附着的骨头的变换的加权平均 .
发表评论
-
Android 中调用 其他 app 的 url 协议
2014-09-05 00:17 1597// var url:String = "i ... -
blog
2014-01-21 13:37 900http://www.catalinzima.com/ -
在cocos2d-x中实践数据驱动的游戏开发
2014-01-21 09:33 3374from: http://elvisco.de/2013/0 ... -
Packed SWF. How to unpack?
2013-10-29 19:23 1618from:http://blog.codestage.ru/ ... -
Stage3D Upload Speed Tester
2013-08-11 04:23 1812from: http://jacksondunstan.co ... -
Speed Up Alpha Textures With Stage3D By 4x
2013-07-26 13:44 2175from: http://jacksondunstan.c ... -
Stage3D optimisation
2013-07-26 13:07 1295from: http://blog.bwhiting.co ... -
Make an AS3 Flash Component with Custom UI Controls
2013-06-28 22:24 2208from: http://studio.barliesqu ... -
AdobeMax: Deep Dive into Flash Player Rendering
2013-06-21 10:41 1566from http://www.developria.com ... -
Why Starling (or any other 2D framework on top of Stage3D)?
2013-06-18 11:00 1105from: http://blog.kaourantin.n ... -
Updated ‘Elastic Racetrack’ for Flash 9 and AVM2
2013-06-18 10:10 1233from: http://www.craftymind.co ... -
HDR&ToneMapping
2013-06-06 09:43 1179from: http://blog.csdn.net/cca ... -
HDR渲染器的实现(基于OpenGL)
2013-06-06 09:37 1965from: http://dev.gameres.com/P ... -
Alternativa3D 8 基础理论 / 概念
2013-06-05 16:31 4474from: http://blog.csdn.net/lim ... -
3D图形技术概念和渲染管线的处理
2013-05-31 01:32 7080from: http://psv.tgbus.com/ne ... -
深度测试与alpha混合
2013-05-31 01:22 1957from: http://www.opengpu.org/f ... -
深入探索3D拾取技术
2013-05-30 23:46 1184from: http://blog.csdn.net/pop ... -
Molehill / ND2D – speeding up the engine
2013-05-30 10:15 1682from: http://www.nulldesign.d ... -
Why Starling (or any other 2D framework on top of Stage3D)?
2013-05-28 00:54 864from:http://blog.kaourantin.ne ... -
Adobe Pixel Bender in Flash Player 10 Beta
2013-05-27 23:46 799from: http://www.kaourantin.n ...
相关推荐
通过深入理解骨骼动画的工作原理,开发者可以创造出更细腻、更生动的角色动画,提升作品的艺术表现力。同时,对骨骼动画的掌握也是提升游戏和影视制作水平的重要步骤。本资料中的“gugedonghua”文件,无疑为学习者...
首先,我们要理解骨骼动画的基本原理。骨骼动画是基于骨骼结构的,每个3D模型都有一个与之关联的骨骼系统。这些骨骼按照人体或动物解剖结构排列,形成一个层级结构,称为骨骼链。骨骼之间通过关节(也叫IK,Inverse ...
在VC++环境中,骨骼动画控制器程序是一个用于实现三...开发者需要理解骨骼动画的基本原理,掌握矩阵变换和图形API的使用,才能创建出流畅、逼真的动画效果。通过不断实践和学习,可以进一步提升程序的性能和用户体验。
首先,我们要理解骨骼动画的概念。骨骼动画是一种通过连接一系列图形(称为“皮肤”)到虚拟骨骼上的技术,使角色或物体能够实现流畅的运动。这种技术相比于逐帧动画更加高效,因为它只需要对每个动作的关键帧进行...
在此过程中,理论与实践应紧密结合,学习者可以通过分析现有动画案例,理解骨骼动画的实现逻辑,并尝试自己动手制作简单的动画来加深理解。 【骨骼动画的未来展望】 随着计算机硬件性能的不断提升和图形学算法的...
首先,我们来理解骨骼动画的基本概念。骨骼动画是通过为3D模型分配一个虚拟骨骼结构来实现的,每个模型的顶点都与骨骼系统中的一个或多个骨骼关联。通过改变这些骨骼的位置和旋转,可以影响模型表面的形状,从而实现...
通过分析和学习这个项目,我们可以深入理解骨骼动画在实际开发中的运用。 5. **优化与扩展**: - **骨骼压缩**:为了减少内存占用和提高性能,可以对骨骼树进行优化,例如删除对动画影响不大的骨骼,或者合并相近...
首先,我们要理解骨骼动画的基本原理。在3D模型中,每个模型都有一个骨架,由一系列互相连接的骨头(也称为关节或顶点)组成。每个骨头都有一个变换矩阵,用于定义其在3D空间中的位置和旋转。通过改变这些矩阵,可以...
首先,我们要理解骨骼动画的基本概念。在三维图形中,角色模型通常由复杂的网格模型表示,这个模型由大量的三角形面片组成,每个面片又由几个顶点定义。为了使这些静态的几何形状能够动起来,我们需要为模型添加骨骼...
首先,我们要理解骨骼动画的概念。在3D建模中,骨骼动画是通过将模型绑定到一个虚拟骨骼系统来实现的。每个骨骼都可以独立地进行旋转和平移,这样就可以控制模型的各个部分进行运动。在DirectX9中,我们可以使用...
通过掌握3DsMax SDK的使用,理解骨骼动画原理,以及遵循良好的编程实践,开发者能够创造出高度定制化、高性能的插件,极大地提升游戏开发和三维动画制作的效率与质量。希望本文的深入解析能够为所有寻求在该领域拓展...
首先,我们要理解骨骼动画的工作原理。骨骼动画是基于骨骼绑定(Skeleton Binding)的概念,通过为3D模型创建一个虚拟的骨骼系统,将模型的几何体与骨骼节点关联起来。每个骨骼都有自己的变换矩阵,用于控制与其关联...
在本例中,"骨骼动画例子"提供了源代码,使得学习者能够深入理解这一技术的实现细节。 骨骼动画的核心是将3D模型的各个部分与一个虚拟的骨骼结构关联起来。每个模型的几何形状部分都绑定到骨架的特定关节上,然后...
TweenMax是一款强大的JavaScript库,由...通过分析和理解代码,你不仅可以了解TweenMax的用法,还能深入理解骨骼动画的原理。在实际应用中,这样的技能对于创建互动式的网页游戏、教育应用或展示动画都非常有用。
骨骼动画是一种在计算机图形学和游戏开发中广泛使用的高级技术,它允许3D模型通过一组虚拟骨骼进行动态表现,如人物行走、跑步、攻击等复杂动作。在本篇详细解析中,我们将深入探讨.x骨骼动画格式,以及如何利用动作...
DirectX骨骼动画是一种在计算机图形学中用于游戏开发和3D建模的先进技术。...通过这个项目,开发者不仅可以深入理解骨骼动画的工作原理,还能锻炼DirectX编程技能,为创建更复杂的3D应用打下基础。
在本场景中,我们关注的是如何利用OpenGL实现骨骼动画。骨骼动画是一种将角色动作分解为一系列骨骼运动的技术,使得模型能够表现出更复杂的动态效果。 在OpenGL中实现骨骼动画,通常需要借助额外的库来辅助完成一些...
4. 文档或教程:可能包含有关如何使用源码和理解骨骼动画机制的文字说明或步骤指南。 通过研究Monkey_files中的源码,你可以了解如何创建骨骼,如何将图形元件与骨骼绑定,以及如何利用ActionScript(Flash的编程...
在本篇说明中,我们将深入探讨CocoStudio的骨骼动画API,帮助开发者更好地理解和利用这个功能来创建动态的游戏角色和效果。 骨骼动画是一种将模型的各个部位(如头部、四肢等)与虚拟骨骼关联的技术,通过移动这些...
首先,我们要理解什么是骨骼动画。骨骼动画与传统的帧动画不同,后者是通过绘制每一帧然后连续播放来实现动画效果。而骨骼动画则将图形元素(如角色的身体部位)绑定到虚拟骨骼上,通过移动和旋转这些骨骼来实现动画...