⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 facialanim.cpp

📁 用DirectX制作高级动画-[Advanced.Animation.with.DirectX]
💻 CPP
字号:
typedef struct {
  float x, y, z;
  float nz, ny, nz;
  float u, v;
} sMorphVertex;

#define MORPHFVF (D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1)

DWORD g_FacialMorphDecl[] =
{
    D3DVSD_STREAM(0),
    D3DVSD_REG(0, D3DVSDT_FLOAT3),   // Position
    D3DVSD_REG(1, D3DVSDT_FLOAT3),   // Normal
    D3DVSD_REG(2, D3DVSDT_FLOAT2),   // Texture
    D3DVSD_STREAM(1),
    D3DVSD_REG(3, D3DVSDT_FLOAT3),   // Position
    D3DVSD_REG(4, D3DVSDT_FLOAT3),   // Normal
    D3DVSD_REG(5, D3DVSDT_FLOAT2),   // Texture
    D3DVSD_STREAM(2),
    D3DVSD_REG(6, D3DVSDT_FLOAT3),   // Position
    D3DVSD_REG(7, D3DVSDT_FLOAT3),   // Normal
    D3DVSD_REG(8, D3DVSDT_FLOAT2),   // Texture
    D3DVSD_STREAM(3),
    D3DVSD_REG(9, D3DVSDT_FLOAT3),   // Position
    D3DVSD_REG(10, D3DVSDT_FLOAT3),  // Normal
    D3DVSD_REG(11, D3DVSDT_FLOAT2),  // Texture
    D3DVSD_STREAM(4),
    D3DVSD_REG(12, D3DVSDT_FLOAT3),  // Position
    D3DVSD_REG(13, D3DVSDT_FLOAT3),  // Normal
    D3DVSD_REG(14, D3DVSDT_FLOAT2),  // Texture
    D3DVSD_END()
};

class cBlendedMorphAnimationKey
{
  public:
    char  *m_MeshName;

    DWORD  m_StartTime,  m_EndTime;
    float  m_StartBlend, m_EndBlend;

    void  *m_MeshPtr;

  public:
    cBlendedMorphAnimationKey();
    ~cBlendedMorphAnimationKey();
};
 
class cBlendedMorphAnimation
{
  public:
    char                      *m_Name;        // Animation name

    DWORD                      m_Loop;
    DWORD                      m_ChannelNum;

    DWORD                      m_Length;      // Length of animation

    DWORD                      m_NumKeys;
    cBlendedMorphAnimationKey *m_Keys;

  public:
    cBlendedMorphAnimation();
    ~cBlendedMorphAnimation();
};

class cBlendedMorphAnimationSet
{
  public:
    char                   *m_Name;           // Animation set name

    cBlendedMorphAnimation *m_BaseMesh;       // Base mesh keys

    DWORD                   m_NumAnimations;  // # animations in set
    cBlendedMorphAnimation *m_Animations;     // Animations

  public:
    cBlendedMorphAnimationSet();
    ~cBlendedMorphAnimationSet();

    void Render(DWORD Time);
    void RenderMesh(void *Ptr);
}

class cFacialAnimation : cXParser
{
  protected:
    cVertexShaderLoader m_VSLoader;

    DWORD               m_NumMeshes;
    cMeshGroup          m_Meshes;

    // DirectShow interfaces for playing back voice track
    IGraphBuilder      *m_Graph;
    IMediaControl      *m_MediaControl;
    IMediaPosition     *m_MediaPosition;

  protected:
    // Parse an .X file for animation data
    BOOL ParseObject(IDirectXFileData *pDataObj,
                       IDirectXFileData *pParentDataObj,
                       DWORD Depth,
                       void **Data, BOOL Reference);

  public:
    cFacialAnimation();
    ~cFacialAnimation();

    void Init(IDirect3DDevice8 *pDevice);
    void Shutdown();

    BOOL LoadMesh(DWORD ID, char *Name,
                  IDirect3DDevice8 *pDevice,
                  char *Filename,
                  char *TexturePath=".\\",
                  DWORD NewFVF=0, 
                  DWORD LoadFlags = D3DXMESH_SYSTEM);
    void FreeMesh(DWORD ID);
    void FreeMesh(char *Name);
    void FreeAllMeshes();

    BOOL LoadAnimation(char *Filename);
    void FreeAnimation();

    BOOL  LoadSound(char *Filename);
    void  FreeSound();
    void  PlaySound();
    void  StopSound();
    DWORD GetSoundPos();

    void Render(DWORD Time);
};

cBlendedMorphAnimationSet::Render(DWORD Time)
{
  // Go through all animations and render those between time
  for(DWORD i=0;i<m_NumAnimations;i++) {

    // Get a pointer to animation
    cBlendedMorphAnimation *Anim = m_Animations[i];

    // Bounds check time to length of animation
    DWORD KeyTime = Time % Anim->m_Length;

    // Go through each animation and examine keys
    for(DWORD j=0;j<Anim->m_NumKeys;j++) {

      // Get a pointer to key
      cBlendedMorphAnimationKey *Key = Anim->m_Keys[j];

      // Look for time match in keys
      if(KeyTime >= Key->m_StartBlend && KeyTime <= Key->m_EndTime) {

        // Got a match! Render it.

        // Go to next animation
        break;
      }
    }
  }
}







/*

// {C5D9F28D-F0AF-416c-94D7-755174D65DC9}
DEFINE_GUID(BlendedMorphAnimationKey,
            0xc5d9f28d, 0xf0af, 0x416c, 
            0x94, 0xd7, 0x75, 0x51, 
            0x74, 0xd6, 0x5d, 0xc9);

template BlendedMorphAnimationKey
{
  <C5D9F28D-F0AF-416c-94D7-755174D65DC9>
  <???????????????>
  DWORD  StartTime;
  DWORD  EndTime;
  STRING MeshName;
  FLOAT  StartBlend;
  FLOAT  EndBlend;
}

// {2816376D-E98A-46ac-8075-59CAF3528E9A}
DEFINE_GUID(BlendedMorphAnimation,
            0x2816376d, 0xe98a, 0x46ac, 
            0x80, 0x75, 0x59, 0xca, 
            0xf3, 0x52, 0x8e, 0x9a);

template BlendedMorphAnimation 
{
  <2816376D-E98A-46ac-8075-59CAF3528E9A>
  DWORD Loop;
  DWORD ChannelNum;
  DWORD NumKeys;
  array BlendedMorphAnimationKey Keys[NumKeys];
}

// {FE99245E-E782-43f7-9329-5E183003D85E}
DEFINE_GUID(BlendedMorphBaseMesh,
            0xfe99245e, 0xe782, 0x43f7, 
            0x93, 0x29, 0x5e, 0x18, 
            0x30, 0x3, 0xd8, 0x5e);

template BlendedMorphBaseMesh
{
  <FE99245E-E782-43f7-9329-5E183003D85E>
  DWORD NumKeys;
  array BlendedMorphAnimationKey Keys[NumKeys];
}

// {5A7A03DB-273D-4112-8825-CBC45EF7219C}
DEFINE_GUID(BlendedMorphAnimationSet,
            0x5a7a03db, 0x273d, 0x4112, 
            0x88, 0x25, 0xcb, 0xc4, 
            0x5e, 0xf7, 0x21, 0x9c);

template BlendedMorphAnimationSet
{
  <5A7A03DB-273D-4112-8825-CBC45EF7219C>
  [BlendedMorphBaseMesh]
  [...]
}
*/

/*
BlendedMorphAnimationSet TalkingToYou
{
  BlendedMorphBaseMesh
  {
    1;
    0, 10000, "FACE_NEUTRAL", 0.00000, 0.00000;;
  }

  BlendedMorphAnimation Blink
  {
    1;  // Loop 0=no, 1=yes
    0;  // Channel # to use
    2;  // # keys to follow
       0, 499, "FACE_BLINK", 0.00000, 1.00000;,
     500, 999, "FACE_BLINK", 1.00000, 0.00000;;
  }

  BlendedMorphAnimation Expressions
  {
    1;  // Loop
    1;  // Channel
    2;  // # keys to follow
       0, 4999, "FACE_SMILE", 0.00000, 1.00000;,
    5000, 9999, "FACE_SMILE", 1.00000, 0.00000;;
  }

  BlendedMorphAnimation Mouthing1
  {
    1;
    2;
  }
}
*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -