蒙皮骨胳动画学习笔记

来源:互联网 发布: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;

 

 

向流水线中传递索引
 
       在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[] = 
{
    { 
00,  D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 },
    { 
012, D3DDECLTYPE_FLOAT1, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_BLENDWEIGHT, 0 },
    { 
016, D3DDECLTYPE_UBYTE4, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_BLENDINDICES, 0 },
    { 
020, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL, 0 },
    D3DDECL_END()
};

原创粉丝点击