骨骼蒙皮动画(SkinnedMesh)的原理解析(一)

合集下载

骨骼蒙皮原理

骨骼蒙皮原理

骨骼蒙皮原理骨骼蒙皮原理是计算机图形学中的一种技术,用于模拟和呈现角色的动画效果。

它是一种将角色模型的骨骼结构与外部表面(皮肤)相结合的方法,通过对骨骼的控制,使皮肤模型产生动态变化,从而实现真实的动画效果。

骨骼蒙皮原理的核心思想是将角色模型分为两部分:骨骼和皮肤。

骨骼是由一系列的骨头(或节点)组成的层次结构,每个骨头都可以控制一部分皮肤的变形。

而皮肤则是角色模型的外部表面,它可以根据骨骼的变化而进行相应的形变。

在骨骼蒙皮原理中,首先需要建立一个角色模型的骨骼结构。

这个骨骼结构可以由多个骨头组成,每个骨头都有一个初始的位置和旋转角度。

然后,将皮肤模型与骨骼进行绑定,使得皮肤模型能够跟随骨骼的变化而进行形变。

当骨骼发生变化时,皮肤模型也会相应地进行形变。

这是通过对皮肤模型的顶点进行变换来实现的。

每个顶点都与一个或多个骨头关联,当骨骼发生变化时,与之关联的顶点也会进行相应的变换。

这样,整个皮肤模型就会根据骨骼的变化而产生动态效果。

为了实现骨骼蒙皮原理,通常会使用一种称为“蒙皮权重”的技术。

蒙皮权重用于确定每个顶点与骨骼的关联程度。

每个顶点可以与一个或多个骨头关联,而蒙皮权重则定义了这些关联的权重值。

权重值越大,表示该顶点与骨骼的关联程度越高,形变效果也就越显著。

在实际应用中,骨骼蒙皮原理被广泛应用于计算机游戏、动画电影等领域。

通过对角色模型的骨骼进行控制,可以实现各种各样的动画效果,使角色动作看起来更加自然和流畅。

然而,骨骼蒙皮原理也存在一些挑战和限制。

首先,建立一个复杂的骨骼结构需要耗费大量的时间和精力。

其次,当角色进行复杂的动作时,需要对大量的顶点进行计算,这对计算机的性能要求较高。

此外,骨骼蒙皮原理还会出现一些不自然的形变效果,比如皮肤的拉伸和扭曲等。

为了解决这些问题,研究人员提出了许多改进和优化的方法。

例如,基于物理的仿真方法可以模拟真实的角色动作,使得形变效果更加自然和逼真。

此外,还有一些基于深度学习的方法,可以利用神经网络对角色动作进行预测和优化,进一步提高动画效果的质量。

骨骼动画具体解释

骨骼动画具体解释

⾻骼动画具体解释近期,再次研究其⾻骼动画,发现这篇⽂章讲的相当不错,通俗易懂,⾮常好的学习资源。

⾻骼蒙⽪动画(Skinned Mesh)的原理解析(⼀)⼀)3D模型动画基本原理和分类3D模型动画的基本原理是让模型中各顶点的位置随时间变化。

主要种类有Morph动画,关节动画和⾻骼蒙⽪动画(Skinned Mesh)。

从动画数据的⾓度来说,三者⼀般都採⽤关键帧技术,即仅仅给出关键帧的数据,其它帧的数据使⽤插值得到。

但因为这三种技术的不同,关键帧的数据是不⼀样的。

Morph(渐变,变形)动画是直接指定动画每⼀帧的顶点位置,其动画关键中存储的是Mesh全部顶点在关键帧相应时刻的位置。

关节动画的模型不是⼀个总体的Mesh,⽽是分成⾮常多部分(Mesh),通过⼀个⽗⼦层次结构将这些分散的Mesh组织在⼀起,⽗Mesh带动其下⼦Mesh的运动,各Mesh中的顶点坐标定义在⾃⼰的坐标系中,这样各个Mesh是作为⼀个总体參与运动的。

动画帧中设置各⼦Mesh相对于其⽗Mesh的变换(主要是旋转,当然也可包含移动和缩放),通过⼦到⽗,⼀级级的变换累加(当然从技术上,假设是矩阵操作是累乘)得到该Mesh在整个动画模型所在的坐标空间中的变换(从本⽂的视⾓来说就是世界坐标系了,下同),从⽽确定每⼀个Mesh在世界坐标系中的位置和⽅向,然后以Mesh为单位渲染就可以。

关节动画的问题是,各部分Mesh中的顶点是固定在其Mesh坐标系中的,这样在两个Mesh结合处就可能产⽣裂缝。

第三类就是⾻骼蒙⽪动画即Skinned Mesh了,⾻骼蒙⽪动画的出现攻克了关节动画的裂缝问题,并且效果很酷,发明这个算法的⼈⼀定是个天才,由于Skinned Mesh的原理简单的难以置信,⽽效果却那么好。

⾻骼动画的基本原理可概括为:在⾻骼控制下,通过顶点混合动态计算蒙⽪⽹格的顶点,⽽⾻骼的运动相对于其⽗⾻骼,并由动画关键帧数据驱动。

⼀个⾻骼动画通常包含⾻骼层次结构数据,⽹格(Mesh)数据,⽹格蒙⽪数据(skin info)和⾻骼的动画(关键帧)数据。

Unity面试题(一)

Unity面试题(一)

Unity⾯试题(⼀)第⼀部分1. 请简述值类型与引⽤类型的区别1. 值类型存储在内存栈中,引⽤类型数据存储在内存堆中,⽽内存单元中存放的是堆中存放的地址。

2. 值类型存取快,引⽤类型存取慢。

3. 值类型表⽰实际数据,引⽤类型表⽰指向存储在内存堆中的数据的指针和引⽤。

4. 栈的内存是⾃动释放的,堆内存是 .NET 中会由 GC 来⾃动释放。

5. 值类型继承⾃ System.ValueType, 引⽤类型继承⾃ System.Object 。

2.C# 中所有引⽤类型的基类是什么System.Object3. 请简述 ArrayList 和 List<Int> 的主要区别ArrayList,存在类型不安全问题,和装箱拆箱性能问题;类型不安全:ArrayList会把所有数据当做Object类型来处理,所以允许操作不同类型的数据;所以在运⾏时,可能会报类型不匹配的错误;装箱拆箱:例如需要将int-->object,object-->int;过程消耗性能;List<Int>:List是ArrayList的等效类;因为泛型避免了编译时输⼊不同类型;List将所有内容存储在T类数组中,没有装箱,但是数组是在堆上分配的。

所以避免了类型不安全和装箱拆箱问题;4. 请简述 GC (垃圾回收)产⽣的原因,并描述如何避免?原因:GC 回收堆上的内存避免: 1 )减少 new 产⽣对象的次数2 )使⽤公⽤的对象(静态成员)3 )将 String换为 StringBuilder5. 请描述 Interface 与 abstract类之间的不同⼀个类继承了某个抽象类表⽰它“是什么”,实现了某个接⼝表⽰它“有什么功能”或者“会做什么事”。

⽐如:燕⼦(具体类)是鸟(抽象类),会飞(接⼝)。

C#中不⽀持多继承,即燕⼦只能是鸟,不会是其他东西了;但可以有多个功能,做很多事,⽐如会飞(IFly),会吃(IEat)。

骨骼动画及微软示例:Skinned Mesh的解析

骨骼动画及微软示例:Skinned Mesh的解析

骨骼动画及微软示例:Skinned Mesh的解析骨骼动画是D3D的一个重要应用。

尽管微软DXSDK提供了示例Skinned Mesh,但由于涉及众多概念和技术局,顺利上手。

文中所述都是参照各种资料加上自己的理解,也有可能出些偏差,有则回贴拍砖,无则权当一笑一骨骼动画原理原理方面在网上资料比较多,大家都基本明白。

在此说一下重点:! |' s9 _9 L; M! x" _总体上,绝大部分动画实现原理一致,就是“提供一种机制,描述各顶点位置随时间的变化”。

有三种方法:1.1关节动画:由于大部分运动,都是皮肤随骨骼在动,皮肤相对于它的骨骼本身并没有发生运动,所以只要知,从子骨骼用矩阵乘法累积到最顶层根骨骼,就可以得到每个子骨骼相对于世界坐标系的转换矩阵。

这种动画,只须用普通Mesh保存最初始的各顶点坐标,以及一系列后续时刻所对应的各骨骼的运动矩阵。

不通过运算调节动作。

缺点是在两段骨骼交接处,容易产生裂缝,影响效果。

1.3骨骼蒙皮动画(skinned Mesh)/ A' R4 r5L; R4 C1.2渐变动画:通过保存一系列时刻的顶点坐标来完成动画。

虽然比较逼真,但占用大量空间,灵活性也不高$ T3 P# J, y4 F9 Q& r" C- R6 U相当于上面两方法的折中。

现在比较流行。

在关节动画的基础上,利用顶点混合(Vertex Blend)技术,对于关节附近的顶点,由影响这些顶点的两段(或裂缝问题。

+ r2 E/ c+ O+ R:o这里,引入一个D3D技术概念:“Vertex Blending”---顶点混合技术。

比如说,你肯定用过SetTransform个问题后文会讲到。

你也可以在微软的DXSDK的帮助文件中搜索“GeometryBlending”主题,有裂缝及其二X文件如何保存骨骼动画理解X文件格式,对用好相关的DX函数是非常重要的。

不含动画的普通X文件,有一个Mesh单元,保存了各顶点信息、各三角面的索引信息、材质种类及定义等。

游戏开发进阶Unity网格(Mesh动态合批骨骼动画蒙皮)

游戏开发进阶Unity网格(Mesh动态合批骨骼动画蒙皮)
[RequiredByNativeCode] // MeshFilter is used in the VR Splash screen. private void DontStripMeshFilter() {} extern public Mesh sharedMesh { get; set; } extern public Mesh mesh {[NativeName("GetInstantiatedMeshFromScript")] get; [NativeName("SetInstantiatedMesh")] set; } }
一、前言 二、Hello Mesh 三、萌新初识Mesh
1、引擎内置的Mesh 2、Mesh是什么 三、Mesh的创建方式 1、第三方建模软件 2、Unity建模插件:ProBuilder 3、程序动态生成网格 四、Unity中如何显示网格 1、MeshFilter:网格过滤器 2、MeshRenderer:网格渲染器 3、SkinnedMeshRenderer:蒙皮网格渲染器
MeshRenderer,顾名思义,网格渲染器。我们依旧先来看看官方手册的介绍:
翻译过来就是MeshRenderer会从MeshFilter那里拿到网格数据并在所在物体的位置处将其渲染出来。 如果没有MeshRenderer,我们就看不见网格了,如下
另外,我们还需要在MeshRenderer的Materials中指定一个材质球,这样才能正常显示,否则模型表面就是紫色的。
public class MeshFilter ... { ... private Mesh _mesh; public Mesh mesh {
get { if (_mesh == null) {

帧动画和骨骼动画

帧动画和骨骼动画

帧动画原理
帧动画 序列(Sequence)表 帧表 所有帧的数组
序列 序列名 开始帧 延续帧数

顶点 纹理坐标 其他 用于渲染
帧动画实现:MD2
研究MD2能发现很多“旧社会”的痕迹。 帧动画的原理很简单,但是MD2却比较复杂,这中 间主要是因为MD2的数据组织带有很浓烈的 Quake2时代气息,而对于现在新的硬件技术,这种 气息无疑有些过时。 但作为最经典的帧动画格式之一,MD2相对而言还 是比较具有代表性的。
骨骼动画实现:MDL
MDL是比较经典的骨骼动画格式,由于CS的成功而 被追捧。 但是,平心而论,MDL并不是一个易于理解和编码 的文件格式,比起MD2来,MDL的格式更为棘手, 带有相当明显的OpenGL社群印记和明显的软件TnL 时代(通过软件计算光照)印记。换句话,充斥着大 量不必要的信息。
平移(10,10)。 如果A以自身坐标系旋转30度,1同样应该以此骨 头的自身坐标系旋转30度。
1 A 1 A A 1 A 1
骨骼动画原理:算法
那么实际上,每根骨头最终将被换算成一个矩阵, 这个矩阵记录了旋转,平移信息,我们用这个矩阵来 对蒙皮顶点进行影响。 在骨头中,一般使用四元数来获得旋转时的精确性, 这样,骨头一般记录表示旋转的四元数和表示位移 的一个矢量,最后,将四元数和矢量换算成骨头的 矩阵,并用顶点与这个矩阵乘法以进行影响。

骨骼动画原理:骨骼 (SKELETON)
骨骼是一种抽象的概念,在最终的渲染结果中,它不可见。 类如人体骨骼、骨骼是若干骨头(Bone)成树状的集合 体,而每块骨头又分别与若干数量的蒙皮顶点关联。

当骨头运动的时候,与之关联的所有蒙皮顶点也会受骨骼 的影响而运动。

3d动画 蒙皮原理

3d动画 蒙皮原理

3d动画蒙皮原理3D动画蒙皮原理引言在现代电影、游戏和动画制作中,3D技术的应用越来越广泛。

其中,人物角色的逼真表现是一个非常重要的方面。

而实现人物角色的逼真表现离不开蒙皮技术。

本文将介绍3D动画中的蒙皮原理及其应用。

一、蒙皮的定义和作用蒙皮是指将一个模型表面的点与骨骼关联起来,使得模型在经过骨骼动作时能够自然地变形。

通过蒙皮技术,可以使得3D模型在动作过程中具有生动、逼真的效果,让观众产生身临其境的感觉。

二、蒙皮的基本原理1. 骨骼系统蒙皮的基础是骨骼系统。

骨骼系统由多个骨骼节点组成,每个节点都有自己的位置和旋转信息。

通过控制骨骼节点的位置和旋转,可以实现对模型的变形。

2. 权重绑定在蒙皮过程中,需要将模型表面的点与骨骼关联起来。

这就需要为每个模型点分配一个或多个骨骼节点,并给予它们不同的权重。

权重的大小决定了该点受到该骨骼节点影响的程度。

通常,靠近骨骼节点的点受到的权重更大,而远离骨骼节点的点受到的权重较小。

3. 蒙皮变形一旦完成了权重绑定,模型在经过骨骼动作时,每个点会根据骨骼节点的位置和权重进行变形。

通过对骨骼节点的控制,可以实现模型的各种动作,如弯曲、伸展、扭转等。

三、蒙皮的实现方法1. 线性插值线性插值是一种常见的蒙皮实现方法。

它将每个模型点的位置通过线性插值计算得到。

线性插值的优点是计算简单,适用于简单的模型和动作。

但是,线性插值的缺点是在某些情况下会导致模型的形变不够平滑,出现锯齿状的效果。

2. 皮肤变形皮肤变形是一种更加高级的蒙皮实现方法。

它通过对模型表面进行细分,将模型表面划分为多个小区域,并对每个小区域进行变形。

皮肤变形的优点是可以实现更加精细的模型形变,使得动画效果更加逼真。

但是,皮肤变形的缺点是计算复杂,对计算资源要求较高。

四、蒙皮的应用领域蒙皮技术在现代电影、游戏和动画制作中得到广泛应用。

通过蒙皮技术,可以实现各种各样的角色形象,包括人类、动物、怪物等。

蒙皮技术不仅可以用于角色模型,还可以用于物体模型的变形。

3D游戏角色动画

3D游戏角色动画

3D游戏角色动画摘要:本文主要描述了3D游戏角色动画的原理及应用,从介绍微软的X文件到最为广泛应用的骨骼蒙皮动画,另外简要的介绍了下渐变动画的原理。

关键词:Role Animation Skeletal Animation Morphing Animation Skinned MeshAbstract:Introduce 3D Game Role Animation, for example Skeletal Animation and Skinned Mesh etc.目录:一概述3D角色动画的应用二3D游戏动画基础------基于时间的运动三3D游戏角色动画1 介绍微软的X文件2 骨骼蒙皮动画的原理与实现3 增加场景数据4 简介渐变动画四结束语正文:一概述3D角色动画的应用3D角色动画是计算机动画技术的一个重要组成部分,也是计算机图形学的一个分支。

无论是在离线渲染环境下,还是在实时渲染环境下,3D角色动画都得到了广泛的应用。

在离线渲染环境下,主要应用于动画电影制作和各类广告制作。

动画电影制作中所使用的3D 角色动画技术的一个重要特点是动画数据量大,渲染需要耗费大量时间,因此动画作品必须预先制作,渲染,然后转化成视频文件播放。

在实时渲染环境下,主要应用于虚拟现实,视频游戏,甚至是建模软件,动画制作软件。

现在,随着计算机硬件技术的发展,特别是带有硬件加速功能的显卡性能的提高,很多曾经只能在离线环境下应用的技术,都转移到实时渲染环境中来。

其中,实时渲染的角色动画技术得到了发展且被广泛的应用。

目前,实时角色动画技术大体可分为三种类型。

第一类是关节动画(Skeletal Animation)。

关节动画中的角色由若干独立的部分组成。

每一个部分对应着一个独立的网格模型,不同的部分按照角色的特点组织成一个层次结构。

比如说,一个人体模型可以由头,上身,左上臂,左前臂,左手,右上臂,右前臂,右手,左大腿,左小腿,左脚,右大腿,右小腿,右脚等各部分组成。

动画技术

动画技术


12.2 刚体动画 12.2.2 动画信息
1.动画序列 既然骨骼的的状态是由自身的变换矩阵决定的,那么要实现骨骼动画,只 要不断改变这个变换矩阵(通过2各关键帧之间的插值计算获得),并且不断 的进行渲染。 每个关键帧存储各个骨骼的状态信息,它可以是一系列数组。 数组元素包含:状态信息(位移、缩放和旋转角度)和时间。每个骨骼的 状态信息都是相对于父节点的信息,因此,每个骨骼的运动信息可以根据实际 帧数单独存储。每个骨骼对应一个数组。
?骨骼动画也是利用类似传统2维动画关键桢实现的由于一个模型的皮肤顶点数据量庞大所以不可能记录每桢皮肤顶点的坐标信息所以我们存储的是数量较少的骨骼的每桢的顶点变化信息播放时让每个骨骼按照记录的状态切换到相应的位置再去用某种方式再去影响皮肤位置就能模拟动物运动了
第12章 动画技术
骨骼动画基础 刚体动画 蒙皮动画
12.1 骨骼动画基础 12.1.1 顶点混合概念
3.在DirectX中使用顶点混合 3)顶点定义。
顶点应该包含每个矩阵的权重信息,用于指定顶点混合系数。 权重的格式:D3DFVF_XYZB1、D3DFVF_XYZB2或D3DFVF_XYZB3 。
#define D3DFVF_BLENDVERTEX (D3DFVF_XYZB3|D3DFVF_NORMAL|D3DFVF_TEX1) struct BLENDVERTEX { D3DXVECTOR3 v; //位置 FLOAT blend1; //权重1 FLOAT blend2; //权重2 FLOAT blend3; //权重3 D3DXVECTOR3 n; //法线 FLOAT tu, tv; //纹理坐标 };
12.2 刚体动画 12.2.1 骨骼模型的构成
3.骨骼的数学模型

骨骼动画的原理与实现

骨骼动画的原理与实现

1)首先确定该时刻之前和之后的两个关键帧,然后按照该时刻与前后两个关键帧时刻的时间值插值计算出该时刻该骨骼相对于父骨骼的新变换矩阵,这个变换矩阵往往代表旋转变换,放缩变换也能接受,如果是平移变换矩阵,很容易将Mesh四分五裂。

2)对于皮肤网格中的每一个顶点,计算它在世界坐标中新的位置和朝向。

首先找到影响该顶点的所有骨骼。

然后计算每一骨骼对该顶点的影响。

也就时说,计算在该骨骼独立作用下顶点的新位置。

计算按照如下公式:顶点的新位置= 最初状态顶点的位置* 最初状态骨骼世界变换矩阵的逆矩阵* 骨骼的新变换矩阵(I)然后将所有这些新位置按照每一骨骼的影响权重加权求和。

注意所有权重的和应该恰好为1。

在公式(I)中,最初状态顶点的位置为什么首先要与最初状态骨骼世界变矩阵的逆矩阵相乘呢?前面说过,骨骼的新变换矩阵是相对于父骨骼变换的,另一方面这个新变换矩阵是世界变换矩阵,它的任何变换是相对于世界坐标系原点的。

因此需要把最初状态顶点移动到相当于父骨骼节点是原点的位置上,再进行矩阵变换。

3)根据网格模型顶点的新位置和朝向绘制角色网格。

下面我们结合具体的图形API环境(Direct3D)来进一步介绍骨骼动画。

第一,了解骨骼结构(Skeletal Structures)和骨层级(Bone Hierarchies):骨骼结构就是连续很多的骨头(Bone)相结合,形成的骨层级。

第一个骨头叫做根骨(root bone),是形成骨骼结构的关键点。

其它所有的骨骼作为孩子骨(child bone)或者兄弟骨(sibling bone)附加在根骨之上。

所谓的“骨”用一个帧(frame)对象表示。

在Directx中,用一个D3DXFRAME结构或者X文件中的Frame template来表示帧对象。

下面看一下Frame template和D3DXFRAME结构的定义:template Frame{< 3D82AB46-62DA-11cf-AB39-0020AF71E433 >FrameTransformMatrix frameTransformMatrix; // 骨骼相对于父节点的坐标变换矩阵,就是一个matrixMesh mesh; // 骨骼的Mesh}typedef struct _D3DXFRAME{LPSTR Name; // 骨骼名称D3DXMATRIX TransformationMatrix; // 相对与父节点的坐标变换矩阵LPD3DXMESHCONTAINER pMeshContainer; // LPD3DXMESHCONTAINER对象,//用来加载MESH,还有一些附加属性,见SDKstruct _D3DXFRAME *pFrameSibling; // 兄弟节点指针,和下面的子节点指针// 一块作用构成骨骼的层次结构。

骨骼蒙皮2d算法

骨骼蒙皮2d算法

骨骼蒙皮2D算法简介骨骼蒙皮2D算法是一种用于实现2D角色动画的技术。

它通过将角色的骨骼与皮肤进行绑定,实现角色的自然变形和动作表现。

本文将介绍骨骼蒙皮2D算法的基本原理、实现方式以及应用场景。

基本原理骨骼蒙皮2D算法基于骨骼动画的原理,将角色划分为多个骨骼节点,并在每个节点上绑定一个或多个皮肤。

每个骨骼节点都有一个变换矩阵,用于控制皮肤的位置、旋转和缩放。

通过对骨骼节点的变换矩阵进行操作,可以实现角色的自由变形和动作表现。

骨骼蒙皮2D算法的核心是通过权重和插值来计算每个像素点受到哪些骨骼节点的影响。

对于每个像素点,通过计算其与骨骼节点的距离和权重,可以得到该像素点受到骨骼节点影响的程度。

通过对所有受影响的骨骼节点进行插值,可以得到最终的像素点位置。

实现方式骨骼蒙皮2D算法的实现可以分为以下几个步骤:1.创建骨骼:将角色划分为多个骨骼节点,并构建它们之间的层次关系。

每个骨骼节点都有一个变换矩阵,用于控制皮肤的变形。

2.绑定皮肤:将每个骨骼节点与相应的皮肤进行绑定。

皮肤可以是角色的各个身体部位,如头、手、脚等。

每个皮肤都有一个初始的顶点位置。

3.计算权重:对于每个像素点,计算其与各个骨骼节点的距离,并根据距离计算权重。

距离越近,权重越大。

4.插值计算:根据权重和骨骼节点的变换矩阵,对每个像素点的位置进行插值计算。

通过插值,可以得到最终的像素点位置。

5.渲染:将计算得到的像素点位置应用到皮肤上,实现角色的变形和动作表现。

应用场景骨骼蒙皮2D算法在游戏开发中有广泛的应用场景,特别是在2D角色动画方面。

1.角色动画:通过骨骼蒙皮2D算法,可以实现角色的自由变形和动作表现。

角色可以根据骨骼节点的变换矩阵进行各种动作,如走、跑、跳等,实现更加生动的角色动画效果。

2.物理模拟:骨骼蒙皮2D算法可以与物理引擎结合使用,实现更加真实的物理模拟效果。

通过对骨骼节点施加力或碰撞检测,可以实现角色的受力和碰撞反应。

3.角色定制化:通过骨骼蒙皮2D算法,可以实现角色的定制化。

3D Max角色动画制作原理与技巧:学习角色动画的关键概念

3D Max角色动画制作原理与技巧:学习角色动画的关键概念

3D Max角色动画制作原理与技巧:学习角色动画的关键概念3D Max是一款常用的三维建模和动画制作软件,广泛应用于影视、游戏等领域。

在使用3D Max进行角色动画制作时,理解一些关键概念是非常重要的。

本文将介绍3D Max角色动画制作的原理与技巧,帮助读者更好地掌握这一领域的知识。

一、关键概念的理解1. 动画骨骼:动画骨骼是角色模型中的骨骼系统,用于控制角色的姿态和动作。

在3D Max中,动画骨骼可以模拟人体骨骼结构,具有层级关系,可以对各个骨骼进行编辑和调整。

2. 关键帧:关键帧是指动画中的关键时刻,通过设定关键帧可以控制角色在特定时间点的姿态或动作。

在关键帧之间的过渡则由3D Max自动插值完成。

3. 插值:插值是指通过计算两个关键帧之间的差值,以实现平滑的动画过渡效果。

在3D Max中,插值可以根据关键帧的设定方式进行线性插值、样条插值等操作。

4. 蒙皮:蒙皮是将动画骨骼与角色模型表面相连的过程,通过蒙皮可以实现角色模型的骨骼动画效果。

在3D Max中,可以使用蒙皮工具对模型进行蒙皮操作,并调整权重值以精确控制角色动画效果。

二、步骤与技巧1. 准备工作在进行角色动画制作前,需要先准备好角色模型。

可以使用3D Max自带的模型库中的角色模型,也可以导入其他格式的角色模型。

确保模型的拓扑结构清晰并适合进行动画制作。

2. 创建骨骼系统在3D Max中,选中角色模型,进入“创建”菜单,选择“骨骼”选项。

通过多次点击模型的关键点,创建出完整的骨骼系统。

可以通过调整骨骼的大小和角度来适应角色模型的尺寸和形态。

3. 调整关键帧进入“动画”模式,设置帧范围和帧率。

选中骨骼系统,进入“动画参数”窗口,可以对关键帧进行编辑和调整。

通过设定不同时间点的关键帧,可以实现角色的姿态和动作转变。

4. 插值和平滑在设定关键帧后,系统会自动进行插值计算并生成中间帧。

可以通过逐帧预览功能来查看动画效果,并根据需要调整关键帧之间的插值方式,实现动画过渡的平滑效果。

3DMAX中的蒙皮和骨骼动画技术

 3DMAX中的蒙皮和骨骼动画技术

3DMAX中的蒙皮和骨骼动画技术在3DMAX中的蒙皮和骨骼动画技术3DMAX是一款被广泛应用于三维建模和动画制作的软件。

在三维模型的制作过程中,蒙皮和骨骼动画技术是非常重要的环节。

本文将深入探讨3DMAX中的蒙皮和骨骼动画技术,以及它们在三维建模和动画制作中的应用。

一、蒙皮技术蒙皮是将骨骼系统和三维模型相结合的过程。

通过给模型的顶点分配骨骼的权重值,可以实现模型在骨骼动画的驱动下产生相应的形变效果。

在3DMAX中,蒙皮可以通过"Skin"工具来完成。

1. 蒙皮的建立在3DMAX中,首先需要在模型上创建骨骼系统。

骨骼系统应该根据模型的结构来设计,并灵活地设置骨骼关节。

然后,选择模型和骨骼系统,使用"Skin"工具将它们关联起来。

这样,模型的顶点就可以通过骨骼的运动来驱动。

2. 权重的调整在蒙皮建立之后,需要对模型上的顶点进行权重的调整。

权重值决定了一个顶点受到骨骼影响的程度。

通常情况下,接近骨骼的顶点受骨骼影响较大,远离骨骼的顶点受骨骼影响较小。

在3DMAX中,可以通过"Vertex Weight Table"进行权重的调整,通过不断调整权重值,使得模型在运动时呈现出更加自然的形变效果。

3. 蒙皮的优化在进行蒙皮时,可能会出现一些不理想的形变效果。

为了解决这些问题,可以使用3DMAX中的一些蒙皮工具进行优化。

比如,可以使用"Paint Weights"工具对模型的顶点进行手动调整,也可以使用"Weighted Vertex Proximity"工具将模型的顶点与骨骼之间的关系进行自动调整。

二、骨骼动画技术骨骼动画技术是通过对骨骼系统进行运动控制,使模型产生相应的动画效果。

在3DMAX中,可以通过设置关键帧来控制骨骼的运动。

1. 关键帧的设置在骨骼动画中,关键帧是非常重要的概念。

通过设置关键帧,可以确定某一时刻骨骼的位置、旋转等参数。

基于VC的3D角色动画的实现

基于VC的3D角色动画的实现

第8卷 第12期 中 国 水 运 Vol.8 No.12 2008年 12月 China Water Transport December 2008收稿日期:2008-10-30 作者简介:张俊文(1974-),男,黄冈师范学院物理系教师。

基于VC 的3D 角色动画的实现张俊文(黄冈师范学院,湖北 黄冈 438000)摘 要:本文主要描述了基于VC 的3D 角色动画的原理及应用,先从介绍微软公司的Direct3D 中的X 文件入手,再到现在角色动画中被最为广泛应用的骨骼蒙皮动画来逐步讨论用VC 使3D 角色动画实现。

关键词:VC;Direct3D;X 文件;骨骼网格中图分类号:TP311 文献标识码:A 文章编号:1006-7973(2008)12-0107-02一、概述3D 角色动画的应用3D 角色动画是计算机动画技术的一个重要组成部分,也是计算机图形学的一个分支。

无论是在离线渲染环境下,还是在实时渲染环境下,3D 角色动画都得到了广泛的应用。

目前,实时角色动画技术大体可分为三种类型。

第一类是关节动画,关节动画中的角色由若干独立的部分组成。

每一个部分对应着一个独立的网格模型,不同的部分按照角色的特点组织成一个层次结构。

第二类是渐变动画(Morphing Animation)。

这种动画中的角色由一系列的渐变网格模型构成。

在动画序列的关键帧中记录着组成网格的各个顶点的新位置或者是相对于原位置的改变量。

通过在相邻关键帧之间插值来直接改变该网格模型中各个顶点的位置就可以实现动画效果。

第三类是骨骼蒙皮动画(Skinned Mesh)。

骨骼蒙皮动画可以看作是关节动画和渐变动画的结合。

他同时兼有关节动画的灵活和渐变动画的逼真。

后面将详细介绍骨骼蒙皮动画的技术细节。

二、微软的X 文件简介制作3D 游戏角色动画需要与之相关的“动画容器”。

这个“容器”中储存着动画的数据。

微软的X 文件正是这样的一种容器。

.X 文件是由模板(template)驱动的,模板定义了如何存储一个数据对象,这样用户方便可以自己定义具体的格式。

[骨骼动画]骨骼动画的原理与实现

[骨骼动画]骨骼动画的原理与实现

[骨骼动画]骨骼动画的原理与实现篇一: 骨骼动画的原理与实现骨骼动画的原理与实现2008-05-28 14:04:10 阅读176 评论0 订阅这里的骨骼蒙皮动画特指skinnd mesh,也叫骨骼动画。

首先确定该时刻之前和之后的两个关键帧,然后按照该时刻与前后两个关键帧时刻的时间值插值计算出该时刻该骨骼相对于父骨骼的新变换矩阵,这个变换矩阵往往代表旋转变换,放缩变换也能接受,如果是平移变换矩阵,很容易将Mesh四分五裂。

[)2)对于皮肤网格中的每一个顶点,计算它在世界坐标中新的位置和朝向。

首先找到影响该顶点的所有骨骼。

然后计算每一骨骼对该顶点的影响。

也就时说,计算在该骨骼独立作用下顶点的新位置。

计算按照如下公式:顶点的新位置= 最初状态顶点的位置* 最初状态骨骼世界变换矩阵的逆矩阵* 骨骼的新变换矩阵然后将所有这些新位置按照每一骨骼的影响权重加权求和。

注意所有权重的和应该恰好为1。

在公式中,最初状态顶点的位置为什么首先要与最初状态骨骼世界变矩阵的逆矩阵相乘呢?前面说过,骨骼的新变换矩阵是相对于父骨骼变换的,另一方面这个新变换矩阵是世界变换矩阵,它的任何变换是相对于世界坐标系原点的。

因此需要把最初状态顶点移动到相当于父骨骼节点是原点的位置上,再进行矩阵变换。

3)根据网格模型顶点的新位置和朝向绘制角色网格。

下面我们结合具体的图形API环境来进一步介绍骨骼动画。

第一,了解骨骼结构和骨层级:骨骼结构就是连续很多的骨头相结合,形成的骨层级。

第一个骨头叫做根骨,是形成骨骼结构的关键点。

其它所有的骨骼作为孩子骨或者兄弟骨附加在根骨之上。

所谓的“骨”用一个帧对象表示。

在Directx中,用一个D3DXFRAME结构或者X文件中的Frame template 来表示帧对象。

下面看一下Frame template和D3DXFRAME结构的定义:template Frame{FrameTransformMatrix frameTransformMatrix; // 骨骼相对于父节点的坐标变换矩阵,就是一个matrixMesh mesh; // 骨骼的Mesh}typedef struct _D3DXFRAME{LPSTR Name; // 骨骼名称D3DXMA TRIX TransformationMatrix; // 相对与父节点的坐标变换矩阵LPD3DXMESHCONTAINER pMeshContainer; // LPD3DXMESHCONTAINER对象,//用来加载MESH,还有一些附加属性,见SDKstruct _D3DXFRAME *pFrameSibling; // 兄弟节点指针,和下面的子节点指针// 一块作用构成骨骼的层次结构。

骨骼蒙皮原理

骨骼蒙皮原理

骨骼蒙皮原理骨骼蒙皮是计算机图形学中一种常用的技术,用于将三维模型的骨骼和皮肤进行绑定,使得模型的动作能够逼真地呈现出来。

它是通过对模型的顶点进行加权处理,将骨骼的动作应用到皮肤上,从而实现模型的动画效果。

本文将详细介绍骨骼蒙皮的原理和实现过程。

骨骼蒙皮的原理是基于骨骼动画的。

在三维模型中,骨骼由一系列的关节组成,每个关节都有一个旋转和平移变换矩阵。

这些关节通过骨骼层次结构连接在一起,形成一个骨骼链。

当我们对骨骼进行动作变换时,其子骨骼也会相应地进行变换,从而形成一个骨骼动画。

然而,骨骼动画只能改变模型的形状,而无法改变其表面的纹理。

为了实现皮肤的动画效果,我们需要将骨骼的动作应用到皮肤上。

这就是骨骼蒙皮的关键所在。

骨骼蒙皮的实现过程可以概括为以下几个步骤:1. 划分权重:首先,我们需要将模型的顶点划分到不同的骨骼上。

这个过程称为权重划分,其目的是确定每个顶点受到哪些骨骼的影响。

通常情况下,我们会根据顶点到骨骼的距离来计算权重值,距离越近的骨骼对该顶点的影响越大。

2. 顶点变换:一旦确定了顶点的权重,我们就可以根据骨骼的动作变换矩阵对顶点进行变换。

这个过程称为顶点变换。

对于每个顶点,我们会将其根据权重值进行插值,得到最终的变换位置。

3. 皮肤绑定:在顶点变换之后,我们需要将变换后的顶点与皮肤进行绑定。

这个过程称为皮肤绑定。

在绑定过程中,我们会将变换后的顶点与皮肤上对应的顶点进行匹配,从而实现皮肤的动画效果。

通常情况下,我们会使用线性插值或者矩阵插值的方法来进行匹配。

4. 顶点着色:最后,我们需要对绑定后的顶点进行着色。

这个过程可以通过使用纹理贴图或者顶点着色器来实现。

着色的目的是给模型的表面添加纹理或者颜色,使其更加逼真。

骨骼蒙皮的原理和实现过程在计算机图形学中被广泛应用。

它不仅可以用于游戏开发,还可以用于动画电影的制作和虚拟现实技术的实现。

通过对模型的骨骼和皮肤进行绑定,骨骼蒙皮能够使模型的动画效果更加逼真,给人一种身临其境的感觉。

骨骼动画貌似很简单的原理的理解

骨骼动画貌似很简单的原理的理解

骨骼动画貌似很简单的原理的理解先说一下我对骨骼动画貌似很简单的原理的理解。

下面的阐述也能看得出我对这些概念的把握其实很混乱,都是模模糊糊的。

骨骼像一棵树形结构那样,有父骨骼、子骨骼。

每个骨骼保存的都是相对于父骨骼的转换矩阵,因此他们的世界矩阵都需要把自己的矩阵乘上父骨骼的世界矩阵才能得到(这是在d3d 的情况。

opengl的程序往往是反过来的,父骨骼的世界矩阵乘上本骨骼的矩阵,好像跟opengl 使用矩阵的方式有关(压入堆栈))。

Mesh的每一个顶点都可以受多根骨骼的影响,使用权重值来决定影响的程度。

在程序里面,可以先对一个顶点使用骨骼转换到正确的动作姿态(这时仍然只是在模型空间),再用该游戏物体的世界矩阵转换到游戏世界的正确位置上现在先不考虑游戏物体的世界矩阵,只考虑模型空间。

这就有了一个问题:对顶点应当使用什么矩阵才能把它转换到正确的动作姿态上?想象一个简单的人物模型,裸模,身体各部位都是连贯的一个mesh。

那么这些顶点都是在模型空间里定义的,而每个骨骼的那些缩放、旋转和位置信息都是在父骨骼的空间里定义的,这就不能拿骨骼的世界矩阵直接转换顶点。

我认为,只有顶点是在骨骼的本地空间里定义的才可以使用骨骼的世界矩阵转换它。

确实,有一个bind pose的概念,它其实就是矩阵,是骨骼初始的世界矩阵。

矩阵是把坐标从空间A转换到空间B,那么这个矩阵的逆矩阵就能把坐标从空间B转换回空间A。

所以bind pose矩阵的逆矩阵就应当能把模型空间的顶点转换到骨骼的本地空间去,然后在某一时刻,使用骨骼的世界矩阵转换这些在骨骼空间中的顶点,应该就能把它们转换到正确的动作姿态了。

在3DSMAX导出插件,使用IGame。

如何得到各骨骼的bind pose呢?由于在游戏里,骨骼的空间信息仍然是相对于父骨骼定义的,所以这里求Bind pose,也是一样。

而且一般bind pose取第0帧时即可。

使用IGameNode::GetWorldTM()函数(参数应该传0,也就相当于第0帧了),得到一个GMatrix结构,在调用GMatrix的ExtractMatrix3()函数就能得到一个Matrix3结构(它是以列为主的,跟d3d不一样)tm,这就是该IGameNode在第0帧时的世界矩阵了。

3D游戏角色动画

3D游戏角色动画

3D游戏角色动画摘要:本文主要描述了3D游戏角色动画的原理及应用,从介绍微软的X文件到最为广泛应用的骨骼蒙皮动画,另外简要的介绍了下渐变动画的原理。

关键词:Role Animation Skeletal Animation Morphing Animation Skinned MeshAbstract:Introduce 3D Game Role Animation, for example Skeletal Animation and Skinned Mesh etc.目录:一概述3D角色动画的应用二 3D游戏动画基础------基于时间的运动三 3D游戏角色动画1 介绍微软的X文件2 骨骼蒙皮动画的原理与实现3 增加场景数据4 简介渐变动画四结束语正文:一概述3D角色动画的应用3D角色动画是计算机动画技术的一个重要组成部分,也是计算机图形学的一个分支。

无论是在离线渲染环境下,还是在实时渲染环境下,3D角色动画都得到了广泛的应用。

在离线渲染环境下,主要应用于动画电影制作和各类广告制作。

动画电影制作中所使用的3D 角色动画技术的一个重要特点是动画数据量大,渲染需要耗费大量时间,因此动画作品必须预先制作,渲染,然后转化成视频文件播放。

在实时渲染环境下,主要应用于虚拟现实,视频游戏,甚至是建模软件,动画制作软件。

现在,随着计算机硬件技术的发展,特别是带有硬件加速功能的显卡性能的提高,很多曾经只能在离线环境下应用的技术,都转移到实时渲染环境中来。

其中,实时渲染的角色动画技术得到了发展且被广泛的应用。

目前,实时角色动画技术大体可分为三种类型。

第一类是关节动画(Skeletal Animation)。

关节动画中的角色由若干独立的部分组成。

每一个部分对应着一个独立的网格模型,不同的部分按照角色的特点组织成一个层次结构。

比如说,一个人体模型可以由头,上身,左上臂,左前臂,左手,右上臂,右前臂,右手,左大腿,左小腿,左脚,右大腿,右小腿,右脚等各部分组成。

虚拟现实技术中基于DirectX的骨骼蒙皮技术

虚拟现实技术中基于DirectX的骨骼蒙皮技术

虚拟现实技术中基于DirectX的骨骼蒙皮技术发表时间:2010-01-26T09:52:27.153Z 来源:《中小企业管理与科技》2009年12月下旬刊供稿作者:田丽华姚鑫[导读] 虚拟现实(Virtual Reality,简称VR),是一种基于可计算信息的沉浸式交互环境田丽华姚鑫(吉林省长春理工大学光电信息学院)摘要:本论文研究的是基于DirectX技术的虚拟现实VR(Virtual Reality)技术。

使用骨骼蒙皮动画原理和结构分析,以VC++为开发工具,在关节动画的基础上,利用顶点混合(Vertex Blend)技术实现了一个小型3D模型的蒙皮。

关键词:虚拟现实技术基于DirectX 骨骼蒙皮1 虚拟现实基本概念:[1][2]虚拟现实(Virtual Reality,简称VR),是一种基于可计算信息的沉浸式交互环境。

具体地说,就是利用三维图形的生成技术、多传感的交互技术以及高分辨率的显示技术,生成三维逼真的视、听、触觉一体化的特定范围的虚拟环境。

使用者通过特殊的头盔、数据手套等传感设备,或利用键盘、鼠标等输入设施,便可以进入虚拟空间,成为虚拟环境中的一员,与虚拟环境进行实时交互、感知和操作虚拟世界中的各种对象,从而产生亲临等同真实环境的感受和体验。

一个完整的虚拟现实系统由下面三部分构成。

1.1 虚拟环境产生器。

一个能产生三维世界的软、硬件环境是VR 系统的核心部件。

它的主要功能是接收被试相关的运动信息(如头部、眼、手等),并融合成三维立体图像,同时进行三维声音合成和发出触觉、压力等反馈信号。

1.2 输入输出设备。

其目的是使被试能通过视觉、听觉和触觉等方式与虚拟环境实现信息的交互作用。

主要包括头盔显示器、操纵杆和数据手套等,它们是被试与虚拟环境建立联系的关键。

1.3 数据接口。

其作用是将虚拟环境产生器、输入输出设备以及被试等有机连接成一体,这不仅包括硬件协配问题,也包括软、硬件联调以及人机界面等技术内容。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

骨骼蒙皮动画(SkinnedMesh)的原理解析(一)一)3D模型动画基本原理和分类3D模型动画的基本原理是让模型中各顶点的位置随时间变化。

主要种类有Morph(变形)动画,关节动画和骨骼蒙皮动画(SkinnedMesh)。

从动画数据的角度来说,三者一般都采用关键帧技术,即只给出关键帧的数据,其他帧的数据使用插值得到。

但由于这三种技术的不同,关键帧的数据是不一样的。

Morph(渐变,变形)动画是直接指定动画每一帧的顶点位置,其动画关键中存储的是Mesh 所有顶点在关键帧对应时刻的位置。

关节动画的模型不是一个整体的Mesh,而是分成很多部分(Mesh),通过一个父子层次结构将这些分散的Mesh组织在一起,父Mesh带动其下子Mesh的运动,各Mesh中的顶点坐标定义在自己的坐标系中,这样各个Mesh是作为一个整体参与运动的。

动画帧中设置各子Mesh相对于其父Mesh的变换(主要是旋转,当然也可包括移动和缩放),通过子到父,一级级的变换累加(当然从技术上,如果是矩阵操作是累乘)得到该Mesh在整个动画模型所在的坐标空间中的变换(从本文的视角来说就是世界坐标系了,下同),从而确定每个Mesh在世界坐标系中的位置和方向,然后以Mesh为单位渲染即可。

关节动画的问题是,各部分Mesh中的顶点是固定在其Mesh坐标系中的,这样在两个Mesh结合处就可能产生裂缝。

第三类就是骨骼蒙皮动画即SkinnedMesh了,骨骼蒙皮动画的出现解决了关节动画的裂缝问题,而且效果非常酷,发明这个算法的人一定是个天才,因为SkinnedMesh的原理简单的难以置信,而效果却那么好。

骨骼动画的基本原理可概括为:在骨骼控制下,通过顶点混合动态计算蒙皮网格的顶点,而骨骼的运动相对于其父骨骼,并由动画关键帧数据驱动。

一个骨骼动画通常包括骨骼层次结构数据,网格(Mesh)数据,网格蒙皮数据(skin info)和骨骼的动画(关键帧)数据。

下面将具体分析。

二)SkinnedMesh原理和结构分析SkinnedMesh中文一般称作骨骼蒙皮动画,正如其名,这种动画中包含骨骼(Bone)和蒙皮(Skinned Mesh)两个部分,Bone的层次结构和关节动画类似,Mesh则和关节动画不同:关节动画中是使用多个分散的Mesh,而Skinned Mesh中Mesh是一个整体,也就是说只有一个Mesh,实际上如果没有骨骼让Mesh运动变形,Mesh就和静态模型一样了。

Skinned Mesh技术的精华在于蒙皮,所谓的皮并不是模型的贴图(也许会有人这么想过吧),而是Mesh本身,蒙皮是指将Mesh中的顶点附着(绑定)在骨骼之上,而且每个顶点可以被多个骨骼所控制,这样在关节处的顶点由于同时受到父子骨骼的拉扯而改变位置就消除了裂缝。

Skinned Mesh这个词从字面上理解似乎是有皮的模型,哦,如果贴图是皮,那么普通静态模型不也都有吗?所以我觉得应该理解为具有蒙皮信息的Mesh或可当做皮肤用的Mesh,这个皮肤就是Mesh。

而为了有皮肤功能,Mesh还需要蒙皮信息,即Skin数据,没有Skin数据就是一个普通的静态Mesh了。

Skin数据决定顶点如何绑定到骨骼上。

顶点的Skin数据包括顶点受哪些骨骼影响以及这些骨骼影响该顶点时的权重(weight),另外对于每块骨骼还需要骨骼偏移矩阵(BoneOffsetMatrix)用来将顶点从Mesh空间变换到骨骼空间。

在本文中,提到骨骼动画中的Mesh特指这个皮肤Mesh,提到模型是指骨骼动画模型整体。

骨骼控制蒙皮运动,而骨骼本身的运动呢?当然是动画数据了。

每个关键帧中包含时间和骨骼运动信息,运动信息可以用一个矩阵直接表示骨骼新的变换,也可用四元数表示骨骼的旋转,也可以随便自己定义什么只要能让骨骼动就行。

除了使用编辑设定好的动画帧数据,也可以使用物理计算对骨骼进行实时控制。

下面分别具体分析骨骼蒙皮动画中的结构部件。

1)理解骨骼和骨骼层次结构(Bone Hierarchy)首先要明确一个观念:骨骼决定了模型整体在世界坐标系中的位置和朝向。

先看看静态模型吧,静态模型没有骨骼,我们在世界坐标系中放置静态模型时,只要指定模型自身坐标系在世界坐标系中的位置和朝向。

在骨骼动画中,不是把Mesh直接放到世界坐标系中,Mesh只是作为Skin使用的,是依附于骨骼的,真正决定模型在世界坐标系中的位置和朝向的是骨骼。

在渲染静态模型时,由于模型的顶点都是定义在模型坐标系中的,所以各顶点只要经过模型坐标系到世界坐标系的变换后就可进行渲染。

而对于骨骼动画,我们设置模型的位置和朝向,实际是在设置根骨骼的位置和朝向,然后根据骨骼层次结构中父子骨骼之间的变换关系计算出各个骨骼的位置和朝向,然后根据骨骼对Mesh中顶点的绑定计算出顶点在世界坐标系中的坐标,从而对顶点进行渲染。

要记住,在骨骼动画中,骨骼才是模型主体,Mesh不过是一层皮,一件衣服。

如何理解骨骼?请看第二个观念:骨骼可理解为一个坐标空间。

在一些文章中往往会提到关节和骨骼,那么关节是什么?骨骼又是什么?下图是一个手臂的骨骼层次的示例。

骨骼只是一个形象的说法,实际上骨骼可理解为一个坐标空间,关节可理解为骨骼坐标空间的原点。

关节的位置由它在父骨骼坐标空间中的位置描述。

上图中有三块骨骼,分别是上臂,前臂和两个手指。

Clavicle(锁骨)是一个关节,它是上臂的原点,同样肘关节(elbow joint)是前臂的原点,腕关节(wrist)是手指骨骼的原点。

关节既决定了骨骼空间的位置,又是骨骼空间的旋转和缩放中心。

为什么用一个4X4矩阵就可以表达一个骨骼,因为4X4矩阵中含有的平移分量决定了关节的位置,旋转和缩放分量决定了骨骼空间的旋转和缩放。

我们来看前臂这个骨骼,其原点位置是位于上臂上某处的,对于上臂来说,它知道自己的坐标空间某处(即肘关节所在的位置)有一个子空间,那就是前臂,至于前臂里面是啥就不考虑了。

当前臂绕肘关节旋转时,实际是前臂坐标空间在旋转,从而其中包含的子空间也在绕肘关节旋转,在这个例子中是finger骨骼。

和实际生物骨骼不同的是,我们这里的骨骼并没有实质的骨头,所以前臂旋转时,他自己没啥可转的,改变的只是坐标空间的朝向。

你可以说上图的蓝线在转,但实际蓝线并不存在,蓝线只是画上去表示骨骼之间关系的,真正转的是骨骼空间,我们能看到在转的是wrist joint,也就是两个finger骨骼的坐标空间,因为他们是子空间,会跟随父空间运动,就好比人跟着地球转一样。

骨骼就是坐标空间,骨骼层次就是嵌套的坐标空间。

关节只是描述骨骼的位置即骨骼自己的坐标空间原点在其父空间中的位置,绕关节旋转是指骨骼坐标空间(包括所有子空间)自身的旋转,如此理解足矣。

但还有两个可能的疑问,一是骨骼的长度问题,由于骨骼是坐标空间,没有所谓的长度和宽度的限制,我们看到的长度一方面是蒙皮后的结果,另一方面子骨骼的原点(也就是关节)的位置往往决定了视觉上父骨骼的长度,比如这里upper arm线段的长度实际是由elbow joint的位置决定的。

第二个问题,手指的那个端点是啥啊?实际上在我们的例子中手指没有子骨骼,所以那个端点并不存在:)那是为了方便演示画上去的。

实际问题中总有最下层的骨骼,他们不能决定其他骨骼了,他们的作用只剩下控制Mesh顶点。

对了,那么手指的长度如何确定?我们看到的长度应该是由蒙皮决定的,也就是由Mesh 中属于手指的那些点离腕关节的距离决定。

经过一段长篇大论,我们终于清楚骨骼和骨骼层次是啥了,但是为什么要将骨骼组织成层次结构呢?答案是为了做动画方便,设想如果只有一块骨骼,那么让他动起来就太简单了,动画每一帧直接指定他的位置即可。

如果是n块呢?通过组成一个层次结构,就可以通过父骨骼控制子骨骼的运动,牵一发而动全身,改变某骨骼时并不需要设置其下子骨骼的位置,子骨骼的位置会通过计算自动得到。

上文已经说过,父子骨骼之间的关系可以理解为,子骨骼位于父骨骼的坐标系中。

我们知道物体在坐标系中可以做平移变换,以及自身的旋转和缩放变换。

子骨骼在父骨骼的坐标系中也可以做这些变换来改变自己在其父骨骼坐标系中的位置和朝向等。

那么如何表示呢?由于4X4矩阵可以同时表示上述三种变换,所以一般描述骨骼在其父骨骼坐标系中的变换时使用一个矩阵,也就是DirectXSkinned Mesh中的Frame TransformMatrix。

实际上这不是唯一的方法,但应该是公认的方法,因为矩阵不光可以同时表示多种变换还可以方便的通过连乘进行变换的组合,这在层次结构中非常方便。

在本文的例子-最简单的skinned mesh实例中,我只演示了平移变换,所以只用一个3d坐标就可以表示子骨骼在父骨骼中的位置。

下面是Bone Class最初的定义:classBone{public:floatm_x, m_y, m_z;//这个坐标是定义在父骨骼坐标系中的};OK,除了使用矩阵,坐标或某东西描述子骨骼的位置,我们的Bone Class定义中还需要一些指针来建立层次结构,也就是说我们要能通过父骨骼找到子骨骼或反之。

问题是我们需要什么指针呢?从父指向子还是反之?结论是看你需要怎么用了。

如果使用矩阵,需要将父子骨骼矩阵级联相乘,无论你的矩阵是左乘列向量还是右乘行向量,从哪边开始乘不重要,只要乘法中父子矩阵的左右位置正确,所以可以在骨骼中只存放指向父的指针,从子到父每次得到父矩阵循环相乘。

也可以像DX中那样从根开始相乘并递归。

在文本的DEMO中由于没用矩阵,直接使用坐标相加计算坐标,所以要指定父的位置,然后计算出子的位置,那么需要在Bone Class中加入子骨骼的指针,因为子骨骼有n个,所以需要n个指针吗?不一定,看看DirectX的做法,只需要两个就搞定了,指向第一子的和指向兄弟骨骼的。

这样事先就不需要知道有多少子了。

下面是修改后的Bone Class:classBone{Bone*m_pSibling;Bone*m_pFirstChild;floatm_x, m_y, m_z;//pos in its parent's spacefloatm_wx, m_wy, m_wz; //pos in world space};同时增加了一组坐标,存放计算好的世界坐标系坐标。

将各个骨骼相对于其父骨骼摆放好,就行成了一个骨骼层次结构的初始位置,所谓初始是指定义骨骼层次时,那后来呢?后来动画改变了骨骼的相对位置,准确的说一般是改变了骨骼自身的旋转而位置保持不变(特殊情况总是存在,比如雷曼,可以把拳头扔出去的那个家伙),总之骨骼动了,位置变化了。

初始位置很重要,因为通过初始位置骨骼层次间的变换,我们确定了骨骼之间的关系,然后在动画中你可以只用旋转。

相关文档
最新文档