1  /  1  页   1 跳转 查看:422

Add-In by VC

Add-In by VC

游戏学院 http://www.cdgamecollege.org
首先,美术建模完成一个标准姿势的3D模型,通常是双手沿着肩的方向伸展平放,双脚打开。所有的后继动作将由这个基础动作演变得到。在完成这个基准模型之后,再建一个骨骼结构,一系列相互关联的顶点,就像一个骨架一样,与人体模型各个关节匹配并且都会有一定数量的顶点与之关联。
之后,在我们想要完成的动画序列中,挑选一些关键帧,对每个关键帧,将骨骼的位置与关键帧匹配。
然后把这一系列的关键帧骨骼保存起来,除了骨骼的位置,同时保存的还有从基准位置变换到当前关键帧的旋转、平移、缩放或者一个混合的坐标变换矩阵。

在我们引擎中,首先根据当前时间查找这时候角色是处于哪两个关键帧中间。找到之后以时间为参数在关键帧的坐标变换矩阵之间求插值,用插值结果来决定骨骼当前的位置。骨骼位置求出来后,所有和骨骼关联的顶点的坐标也可以相应求出来了

代码如下:HRESULT RModel_Mesh::UpdateAnimation(LPRMANIMATION pAnimation,
                                          DWORD AnimationIndex,
                                          DWORD PlayMethod,
                                          float Time)
{
    if(!pAnimation)
        return S_OK;
    if((AnimationIndex<0)||(AnimationIndex>=pAnimation->m_dNumAnimation))
        return E_FAIL;

    RModel_Animation::LPANIMATION pAni = pAnimation->m_lpAnimations[AnimationIndex];
    int nFrame = 0;
    int nFrameTo = 0;
    float R = 0;
    pAnimation->GetFrame(&nFrame,&nFrameTo,&R,AnimationIndex,PlayMethod,Time);

    if(pAni==NULL) return E_FAIL;

    if(pAni->Type==ANIMATION_BONE)
    {
        int BoneIndex,Index;
        LPSTR Name;
        D3DXMATRIX MatA,MatB,mat,matScale;
        DWORD index,i_Socket;
        LPBONEINFO pInfo,pInfoParent;
        LPSOCKET pSocket;
        D3DXVECTOR3 A,B,C;
        float Sx,Sy,Sz;

        for(DWORD i_Bone=0;i_Bone<pAni->NumAnimatedBone;i_Bone++)
        {
              Name = pAni->AnimatedBoneName[i_Bone];
              BoneIndex = FindBone(Name);

              if( BoneIndex>=0)
              {
                  index = i_Bone*pAni->NumFrames;
                  MatA = pAni->AnimatedBoneMatrix[index + nFrame];
                  MatB = pAni->AnimatedBoneMatrix[index + nFrameTo];

                  pInfo = &m_lpBoneInfo[BoneIndex];
                  pInfo->CurMatrix = MatA*(1-R) + MatB*R;
              }
        }
        for(i_Socket=0;i_Socket<m_dwNumSocket;i_Socket++)
        {
              pSocket = &m_lpSockets[i_Socket];
              m_IndexParentBone[i_Socket] = Index = FindBone(pSocket->ParentBoneName);
              if(Index>=0)
              {
                  pInfoParent = &m_lpBoneInfo[Index];

                  D3DXMatrixMultiply(&pSocket->CurMatrix,
                      &pSocket->MatrixOffset,&pInfoParent->CurMatrix);
              }
        }
    }

    return S_OK;
}什么是Add-In
Add-In就是实现某些特定COM接口的组件对象.
例如:
Vc++ Add-In 它可以嵌入Developer Studio集成开发环境中,并提供一些命令用于实现自动化任务,或者简化程序编写过程等.       
它可以用于MS Office系列的工具软件中, 例如word, Excel等的插件.
实现Add-In的三种方法
•          1.利用ATL COM Wizard中的ATL对象 Add-in Object
•          2.用DevStudio Add-in Wizard
•          3.手工写所有的代码,实现IDSAddIn接口

使用接口
•          ATL实现Add-In依赖于_IDTExtensibility2来实现COM接口
•          用DevStudio Add-in Wizard来创建的Add-In工程直接使用com接口来实现. 主要接口: IDSAddIn
•          [diff mark]

Add-In的载入
•          一种是用户控制装载
•          一种是让程序启动自动装载
自动装载控制

•          HKCU
•          { 
•            Software
•            {
•              Microsoft
•              {
•                Office
•                {
•                  Word
•                  {
•                    Addins
•                    {
•                      'MyAddin.WordAddin'
•                      {
•                        val FriendlyName = s 'WORD Custom Addin'
•                        val Description = s 'Word Custom Addin'
•                        val LoadBehavior = d '00000003'
•                        val CommandLineSafe = d '00000001'
•                      }
•                    }
•                  }
•                }
•              }
•            }
•          }

•          LoadBehavior: 双字节类型,决定插件将以什么形式被装载。当其值为0x03时,为应用程序装载时被自动装载(一般使用此值)、当其值为0x08时,为用户控制激活装载
•          [Custom load Mark]
•          [example]

•          Add-In的优点
•          能直接在VC的IDE中完成Add-In的工作,而不需要借助外部工具
•          如: Add-In 例子: WndTabs, Visual Assist
•          Add-In的缺点
•          相对于脚本,Add-In显得复杂, 但是Add-In直接与API打交道使得它可以完成更为高级的功能
•          Add-In的实现,依赖微软专门提供的接口,因此有很多功能无法实现. 如: 个性化Add-In bar的界面,甚至IDE的界面。

文章来源:http://duwenquanoo.blog.163.com/blog/static/7026566520082191033749/

 

回复:Add-In by VC

自己顶顶!没人啊。。。
 
1  /  1  页   1 跳转

版权所有 游戏艺术工厂  GAME798  Sitemap

Powered by Discuz!NT 2.1.202    Copyright © 2001-2008 Comsenz Inc.
Processed in 0 second(s) (Cached). 沪ICP备06046807号
返顶部