用3DXI导出顶点数据的代码段

 for each face....

  FaceEx *pFaceEx = pGameMesh->GetFace(faceId);

 // 得到位置
 int vertexId = pFaceEx->vert[faceVertexId];
 Point3 vertex;
 if( pGameMesh->GetVertex(vertexId, vertex) )
  pVertexData->m_position = vertex;

 // 得到法向量
 int normId = pFaceEx->norm[faceVertexId];
 Point3 normal;
 if( pGameMesh->GetNormal(normId, normal) )
  pVertexData->m_normal = normal;

 // 得到纹理坐标
 // mapchannel代表一层纹理坐标, 如果mapchannel个数为1,则直接使用GetTexVertex()函数
 // 否则就遍历所有的TextureMap,计算本TextureMap的纹理坐标
 if( pGameMesh->GetActiveMapChannelNum().Count() == 1 )
 {
  int texCoordId = pFaceEx->texCoord[faceVertexId];
  Point2 texCoord;
  if( pGameMesh->GetTexVertex(texCoordId, texCoord) )
   pVertexData->AddTextureCoordinate( texCoord.x, 1.f - texCoord.y );
 }
 else
 {
  IGameMaterial *pGameMaterial = pGameMesh->GetMaterialFromFace( pFaceEx );
  int iNumTexture = pGameMaterial->GetNumberOfTextureMaps();
  for( int i = 0; i < iNumTexture; ++i )
  {
   IGameTextureMap *pTexture = pGameMaterial->GetIGameTextureMap(i);
   TCHAR *tcName = pTexture->GetBitmapFileName();

   int iChannel = pTexture->GetMaxTexmap()->GetMapChannel();
   DWORD vertexId[3];
   Point3 uvVert;
   if( pGameMesh->GetMapFaceIndex(iChannel, faceId, vertexId) )
   {
    if( pGameMesh->GetMapVertex(iChannel, vertexId[faceVertexId], uvVert) )
    {
     IGameUVGen *pGameUVGen = pTexture->GetIGameUVGen();
     GMatrix gmUV = pGameUVGen->GetUVTransform();
     uvVert = uvVert * gmUV;

     pVertexData->AddTextureCoordinate( uvVert.x, 1.f - uvVert.y );
    }
   }
  }
 }

 // 得到skin信息
 if( pGameMesh->IsObjectSkinned() )
 {
  IGameSkin *pGameSkin = NULL;
  pGameSkin = pGameMesh->GetIGameSkin();

  int iBoneID;
  float fWeight;
  int type = pGameSkin->GetVertexType(vertexId);
  if(type==IGameSkin::IGAME_RIGID)
  {
   iBoneID = pGameSkin->GetBoneID(vertexId,0);
   IGameNode *pBoneNode = g_Exporter.GetIGameScene()->GetIGameNode(ULONG(iBoneID));
   TCHAR *chBoneName = pBoneNode->GetName();

   fWeight = 1.f;
   pVertexData->AddInfluence(iBoneID, fWeight);
  }
  else //blended
  {
   for(int b=0;b<pGameSkin->GetNumberOfBones(vertexId);++b)
   {
    iBoneID = pGameSkin->GetBoneID(vertexId,b);
    IGameNode *pBoneNode = g_Exporter.GetIGameScene()->GetIGameNode(ULONG(iBoneID));
    TCHAR *chBoneName = pBoneNode->GetName();

    fWeight = pGameSkin->GetWeight(vertexId,b);
    pVertexData->AddInfluence(iBoneID, fWeight);
   }
  }
 }

 

相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页