用3DXI匯出頂點資料的程式碼片段

來源:互聯網
上載者:User

 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);
   }
  }
 }

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.