骨骼蒙皮动画(Skinned Mesh)的原理解析(二)

骨骼蒙皮动画(Skinned Mesh)的原理解析(二)

DX技术 2009-09-06 14:56:06 阅读211 评论1 字号:

骨骼蒙皮动画(Skinned Mesh)的原理解析(二) 

 

2)蒙皮信息和蒙皮过程

 

2-1Skin info的定义

上文曾讨论过,Skinned Mesh中Mesh是作为皮肤使用,蒙在骨骼之上的。为了让普通的Mesh具有蒙皮的功能,必须添加蒙皮信息,即Skin info。我们知道Mesh是由顶点构成的,建模时顶点是定义在模型自身坐标系的,即相对于Mesh原点的,而骨骼动画中决定模型顶点最终世界坐标的是骨骼,所以要让骨骼决定顶点的世界坐标,这就要将顶点和骨骼联系起来,Skin info正是起了这个作用。下面是DEMO中顶点类的定义的代码片段:

 

#define MAX_BONE_PER_VERTEX 4

class Vertex

{

    float m_x, m_y, m_z; //local pos in mesh space

    float m_wX, m_wY, m_wZ;//blended vertex pos, in world space

 

    //skin info

    int m_boneNum;

    Bone* m_bones[MAX_BONE_PER_VERTEX];

    float m_boneWeights[MAX_BONE_PER_VERTEX];

};

 

顶点的Skin info包含影响该顶点的骨骼数目,指向这些骨骼的指针,这些骨骼作用于该顶点的权重(Skin weight)。由于只是一个简单的例子,这儿没有考虑优化,所以用静态数组存放骨骼指针和权重,且实际引擎中Skin info的定义方式不一定是这样的,但基本原理一致。

MAX_BONE_PER_VERTEX在这儿用来设置可同时影响顶点的最大骨骼数,实际上由于这个DEMO是手工进行Vertex Blending并且也没用硬件加速,可影响顶点的骨骼数量并没有限制,只是恰好需要一个常量来定义数组,所以定义了一下。在实际引擎中由于要使用硬件加速,以及为了确保速度,一般会定义最大骨骼数。另外在本DEMO中,Skin info是手工设定的,而在实际项目中,一般是在建模软件中生成这些信息并导出。

 

Skin info的作用是使用各个骨骼的变换矩阵对顶点进行变换并乘以权重,这样某

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SkinnedMesh的实现原理是通过将Mesh中的顶点与骨骼进行绑定来实现动画效果。SkinnedMesh由两个部分组成:骨骼(Bone)和蒙皮Skinned Mesh)\[3\]。 在SkinnedMesh中,Mesh是一个整体,只有一个Mesh,而不像关节动画中使用多个分散的Mesh\[3\]。为了让骨骼决定顶点的世界坐标,需要将顶点和骨骼联系起来,这就是通过添加蒙皮信息(Skin info)来实现的\[2\]。 蒙皮是指将Mesh中的顶点附着(绑定)在骨骼之上,每个顶点可以被多个骨骼所控制\[3\]。顶点的蒙皮数据包括顶点受哪些骨骼影响以及这些骨骼对该顶点的权重\[3\]。此外,每块骨骼还需要骨骼偏移矩阵(BoneOffsetMatrix)用来将顶点从Mesh空间变换到骨骼空间\[3\]。 在动画中,每个关键帧包含时间和骨骼的运动信息,可以用矩阵或四元数来表示骨骼的变换\[3\]。这些运动信息可以是预先编辑好的动画帧数据,也可以是通过物理计算实时控制骨骼的运动\[3\]。 通过将顶点与骨骼绑定并根据骨骼的运动信息进行变换,SkinnedMesh实现了模型的动画效果,并消除了在关节处产生裂缝的问题\[1\]。 综上所述,SkinnedMesh的实现原理是通过将Mesh中的顶点与骨骼进行绑定,并根据骨骼的运动信息对顶点进行变换,从而实现模型的动画效果。 #### 引用[.reference_title] - *1* *2* *3* [Skinned Mesh原理解析和一个最简单的实现示例](https://blog.csdn.net/n5/article/details/3105872)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值