2024年3月25日发(作者:苏从筠)
[骨骼动画]骨骼动画的原理与实现
篇一 : 骨骼动画的原理与实现
骨骼动画的原理与实现
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; // 骨骼相对于父
节点的坐标变换矩阵,就是一个matrix
Mesh mesh; // 骨骼的Mesh
}
typedef struct _D3DXFRAME
{
LPSTR Name; // 骨骼名称
D3DXMATRIX TransformationMatrix; // 相对与父节点的坐标
2024年3月25日发(作者:苏从筠)
[骨骼动画]骨骼动画的原理与实现
篇一 : 骨骼动画的原理与实现
骨骼动画的原理与实现
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; // 骨骼相对于父
节点的坐标变换矩阵,就是一个matrix
Mesh mesh; // 骨骼的Mesh
}
typedef struct _D3DXFRAME
{
LPSTR Name; // 骨骼名称
D3DXMATRIX TransformationMatrix; // 相对与父节点的坐标