游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1945|回复: 3

蒙皮动画的问题

[复制链接]

3

主题

16

帖子

16

积分

新手上路

Rank: 1

积分
16
发表于 2010-9-8 17:00:00 | 显示全部楼层 |阅读模式
我看了这本书<DirectX高级动画制作>但是里面的源码已经很旧了。很多借口也换了。我改了一下老是不对,很郁闷。。
这是我改的解析x文件的源码,麻烦大侠帮我看看那里错了好吗?


  1. BOOL SkinParser::ParseObject(ID3DXFileData *pDataObj,
  2. ID3DXFileData *pParentDataObj, DWORD depth, void ** ppData, BOOL reference)
  3. {
  4.     HRESULT hr;
  5.     GUID Type;

  6.     hr = pDataObj->GetType(&Type);
  7.     if(FAILED(hr))
  8.     {
  9.         ::MessageBoxA(NULL, "GetGUID failed!", "error", 0);
  10.         return hr;
  11.     }

  12.     if(Type == TID_D3DRMFrame && m_Flags & 2 && reference == FALSE)
  13.     {
  14.         XFrame_EX* pFrame = new XFrame_EX;

  15.         pFrame->Name = GetObjectName(pDataObj);

  16.         if(ppData == NULL)
  17.         {
  18.             // Link as sibling of root
  19.             pFrame->pFrameSibling = m_RootFrame;
  20.             m_RootFrame = pFrame;  pFrame = NULL;
  21.             ppData = (void**)&m_RootFrame;
  22.         }
  23.         else
  24.         {
  25.             // Link as child of supplied frame
  26.             XFrame_EX *pFramePtr = (XFrame_EX*)*ppData;
  27.             pFrame->pFrameSibling = pFramePtr->pFrameFirstChild;
  28.             pFramePtr->pFrameFirstChild = pFrame;  pFrame = NULL;
  29.             ppData = (void**)&pFramePtr->pFrameFirstChild;
  30.         }
  31.     }


  32.     if(Type == TID_D3DRMFrameTransformMatrix && reference == FALSE && m_Flags & 2 && ppData)
  33.     {
  34.         XFrame_EX *Frame = (XFrame_EX*)*ppData;
  35.         if(Frame)
  36.         {
  37.             SIZE_T dataSize;

  38.             LPCVOID buffer = NULL;
  39.             hr = pDataObj->Lock( &dataSize, &buffer );
  40.             if( FAILED( hr ) )
  41.                 return false;
  42.             // 拷贝数据
  43.             if( dataSize == sizeof( D3DXMATRIX ) )
  44.             {
  45.                 /*char test[20];
  46.                 sprintf(test, "%d", dataSize);
  47.                 ::MessageBox(NULL, test, "a" , 0);*/

  48.                 memcpy( &Frame->TransformationMatrix, buffer, dataSize );
  49.                 pDataObj->Unlock();
  50.                 Frame->matOriginal = Frame->TransformationMatrix;
  51.             }
  52.         }
  53.     }


  54.     if(Type == TID_D3DRMMesh && m_Flags & 1) {

  55.         // Only load non-referenced skin meshes into memory
  56.         if(reference == FALSE) {

  57.             // Load the mesh using the data object load method
  58.             MeshContainer_EX *pMesh = NULL;
  59.             LoadMesh(pDataObj, m_pD3DDevice, &pMesh, m_TexturePath, m_NewFVF);

  60.             // Link mesh to head of list of meshes
  61.             if(pMesh)
  62.             {
  63.                 pMesh->pNextMeshContainer = m_RootMesh;
  64.                 m_RootMesh = pMesh; pMesh = NULL;

  65.                 // Link mesh to frame if needed
  66.                 if(ppData)
  67.                 {
  68.                     XFrame_EX *pFrame = (XFrame_EX*)*ppData;
  69.                     if(m_Flags & 2 && pFrame)
  70.                         pFrame->pMeshContainer = m_RootMesh;
  71.                 }
  72.             }
  73.         }
  74.         else
  75.         {
  76.             // If referenced, then check if wanting to link to frame
  77.             if(ppData) {
  78.                 XFrame_EX *pFrame = (XFrame_EX*)*ppData;
  79.                 if(m_Flags & 2 && m_RootMesh && pFrame) {

  80.                     // Get name of mesh reference to link to
  81.                     char *tempName = GetObjectName(pDataObj);
  82.                     if(tempName) {
  83.                         // Find matching mesh by name and store result
  84.                         pFrame->pMeshContainer = m_RootMesh->Find(tempName);

  85.                         // Clear name
  86.                         delete [] tempName; tempName = NULL;
  87.                     }
  88.                 }
  89.             }
  90.         }
  91.     }

  92.     SIZE_T childNum;
  93.     pDataObj->GetChildren(&childNum);

  94.     if(childNum == 0)
  95.         return TRUE;

  96.     ID3DXFileData* pSubData;
  97.     for(DWORD i = 0; i != childNum; i++)
  98.     {
  99.         pDataObj->GetChild(i, &pSubData);
  100.         ParseObject(pSubData, pParentDataObj, depth, ppData, pSubData->IsReference());
  101.     }
  102.     return TRUE;
  103. }
复制代码


没有ParserChildObject了,就是重复调用ParserObject.原来的源码的ParserChildObject只是多了QueryInterface不加有关系吗?还有就是为什么书上说如果Frame是引用就直接跳过?不需要连接到框架中吗?麻烦帮我看一下勒。谢谢啊。

我的运行结果是这样的。不知道哪里错了。麻烦指点一下。

3

主题

16

帖子

16

积分

新手上路

Rank: 1

积分
16
 楼主| 发表于 2010-9-9 18:54:00 | 显示全部楼层

Re:蒙皮动画的问题

求助

3

主题

16

帖子

16

积分

新手上路

Rank: 1

积分
16
 楼主| 发表于 2010-9-10 09:45:00 | 显示全部楼层

Re:蒙皮动画的问题

悲剧了吗

10

主题

15

帖子

24

积分

注册会员

Rank: 2

积分
24
发表于 2010-9-28 17:14:00 | 显示全部楼层

Re:蒙皮动画的问题

改Type 的值
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-6 11:43

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表