Add-In by VC

默认分类   2008-03-19 10:33   阅读16   评论0  
字号:    

 

 

 成都游戏学院 http://www.cdgamecollege.org 电话:028-85586115 

 

首先,美术建模完成一个标准姿势的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的界面

评论(?)
阅读(?)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
网易公司版权所有 ©1997-2009