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

这段代码展示了如何从3DXI文件中导出顶点的位置、法向量、纹理坐标和皮肤信息。通过遍历面和顶点,获取每个顶点的相关属性,并转换为所需格式。对于多纹理的情况,遍历所有纹理地图,计算每个纹理的坐标。同时处理skinned mesh,获取骨骼ID和权重。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值