蒙皮骨胳动画学习笔记
来源:互联网 发布:cn域名续费 编辑:程序博客网 时间:2024/05/17 08:54
蒙皮骨胳动画的相关知识点:
蒙皮(skinning)是一种动画技法,他通过骨架结构的变换不断的影响附着在上面的mesh顶点,使mesh顶点在一个或者多个骨的共同影响下产生形变,形成动画效果。这种动画方式能够比骨骼动画和形变动画具有更加平滑的表面和更合理的形变。
(以下总结自DX9 sdk doc Geometry Blending)
顶点混合(Vertex Blending):
一个顶点的最终空间位置同时由多个变换的影响,其计算过程就是顶点混合。
混合权重(Blending Weight):
顶点混合中,每一个变换对顶点的影响程度称之为混合权重(Blending Weight),同其他权重一样,所有混合权重的和为1,若权重=1.0f,说明顶点完全受该变换影响。
顶点混合公式:
vBlend代表顶点最终的变换结果,v为最初顶点在其中一个变换的影响下的结果,w表示混合权重。
在D3D中的顶点混合机制:
1. 在固定定点格式FVF中,允许顶点定义5个混合权重,但是其中只用最多3个能在D3D9种发挥作用(原因见下面)。
2. 方法可以用来设置变换,常用它来设置的世界变换只有一种,即D3DTS_WORLD,实际上在D3D9中是可以设置最多256个世界变换矩阵的,这些矩阵是由D3D9负责管理,其设置方法是SetTransform(D3DTS_WORLDn , &m);SetTransform()
3. 在设置渲染状态时,SetRenderState(D3DRS_VERTEXBLEND,XXXX)就设置了顶点混合渲染方式。
索引的顶点混合(Indexed Vertex Blending):
D3D9提供空间管理256个变换矩阵,可供顶点混合使用,顶点可通过索引方式像使用数组一样使用这些矩阵,这就叫做索引的顶点混合。
索引的顶点混合原理:
索引共32位,每8位表示一个矩阵的索引[0-255],从高到低分别对应index3,index2,index1,index0。D3D9至多只能关联4个矩阵(也就是一个顶点只需要记录3个权重的原因,第4权重个是可以求得的)。
更详细的例子:
计算公式:
使用索引的顶点混合:
看看D3D9的代码实现:
//填充混合矩阵
D3DMATRIX matBlend1;
D3DXMatrixIdentity( &matBlend1 );
m_pD3DDevice->SetTransform( D3DTS_WORLDMATRIX(0), &matBlend );
// 开启索引的顶点混合
m_pD3DDevice->SetRenderState( D3DRS_INDEXEDVERTEXBLENDENABLE, TRUE );
// 顶点混合可以使用最多3个权重
m_pD3DDevice->SetRenderState( D3DRS_VERTEXBLEND, D3DVBF_3WEIGHTS );
// 顶点混合无效
m_pD3DDevice->SetRenderState( D3DRS_VERTEXBLEND, D3DRS_DISABLE );
// 检查设备支持的最大混和矩阵数量
D3DCAPS9 d3dCaps;
m_pD3DDevice->GetDeviceCaps( &d3dCaps );
IndexedMatrixMaxSize = d3dCaps.MaxVertexBlendMatrixIndex;
D3DMATRIX matBlend1;
D3DXMatrixIdentity( &matBlend1 );
m_pD3DDevice->SetTransform( D3DTS_WORLDMATRIX(0), &matBlend );
// 开启索引的顶点混合
m_pD3DDevice->SetRenderState( D3DRS_INDEXEDVERTEXBLENDENABLE, TRUE );
// 顶点混合可以使用最多3个权重
m_pD3DDevice->SetRenderState( D3DRS_VERTEXBLEND, D3DVBF_3WEIGHTS );
// 顶点混合无效
m_pD3DDevice->SetRenderState( D3DRS_VERTEXBLEND, D3DRS_DISABLE );
// 检查设备支持的最大混和矩阵数量
D3DCAPS9 d3dCaps;
m_pD3DDevice->GetDeviceCaps( &d3dCaps );
IndexedMatrixMaxSize = d3dCaps.MaxVertexBlendMatrixIndex;
向流水线中传递索引:
在D3D9中的实现:
// 结构
struct VERTEX
{
float x,y,z;
float weight;
DWORD matrixIndices;
float normal[3];
};
// FVF 注意顺序
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZB2 | D3DFVF_LASTBETA_UBYTE4 | D3DFVF_NORMAL);
// 注册声明 注意其中用到了D3DDECLTYPE_UBYTE4作为类型描述
// Create the shader declaration.
D3DVERTEXELEMENT9 decl[] =
{
{ 0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 },
{ 0, 12, D3DDECLTYPE_FLOAT1, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_BLENDWEIGHT, 0 },
{ 0, 16, D3DDECLTYPE_UBYTE4, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_BLENDINDICES, 0 },
{ 0, 20, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL, 0 },
D3DDECL_END()
};
- 蒙皮骨胳动画学习笔记
- 骨骼蒙皮动画学习
- 【Direct3D游戏开发】——蒙皮骨骼动画学习笔记
- 骨骼蒙皮动画DEMO
- 蒙皮动画初步完成
- 蒙皮骨骼动画原理
- 蒙皮骨骼动画的理解
- 蒙皮骨骼动画的理解
- D3D9中的蒙皮骨骼动画
- 关键帧逐帧蒙皮动画原理
- Unity笔记 2D Best Practices (2D IK 骨骼动画 event 换装 蒙皮 排序)
- 蒙皮
- irrlicht引擎:硬件蒙皮骨骼动画
- 骨骼蒙皮动画的原理解析
- 骨骼蒙皮动画(SkinnedMesh Animation)的实现
- 骨骼蒙皮动画的原理解析
- 骨骼蒙皮动画(SkinnedMesh Animation)的实现
- 骨骼蒙皮动画(SkinnedMesh Animation)的实现
- .NET自动服务程序—C#(二)
- 测试度量指标
- xml架构与xml的关联
- 高效程序员应该养成的七个习惯
- 探讨微软ASP.NET AJAX控件开发技术
- 蒙皮骨胳动画学习笔记
- Error loading opeating system 加载系统错误处理方法
- 如何准备测试数据?
- 网上收藏的几个邹老大的分页存储过程
- 利用JNI监控CVS仓库变动,自动更新到相应目录——简化WEB小组开发(一、监控篇)
- 如何将Google搜索地址栏里的uft-8字符串转换为汉字
- 52个不得不知的生活小常识
- struts数据库连接池
- 程序调试指南1:使用CDB和NTSD进行调试