建立自己的3D模型文件

建立自己的3D模型文件的目的和意義我就不羅嗦了。有一些方法可以實現這個目的,我使用了D3DSDK(2004summer)版本達到了這個目的,我的方法和思路如下:
1)將.x檔用D3DX的各個函數讀出,需要讀出的有Frame,FrameTransformMatrix,Mesh,AnimationSet,Animation,AnimationKey;
2)轉化爲自己需要的文件,這裏我建立了4個文件,包括.m檔(存放mesh),.f檔(存放Frame),.a檔(存放AnimationSet)和.z檔,存放上面3個文件的索引。這4個文件都可以修改部分屬性,以達到共享texture、animation等目的。
3)完成讀這4個文檔的代碼,並建立相應的列表、樹什麼的
4)Render讀出的模型

.m檔格式如下(最複雜的就是這個檔案):
Mesh個數
{//循環,Mesh個數
Name
NumMaterials
  {//循環,NumMaterials個數
      MatD3D
      TextureFilename
  }
FVF
NumFaces
NumVertices
NumBytesPerVertex
true/false //指明是否有SkinInfo
{
   NumBones
     {//NumBones
      BoneName
      NumBoneInfluences
      vertices
      weights
      BoneOffsetMatrix
     }
}
VertexBufferSize
VertexBuffer
IndexBufferSize
IndexBuffer

.f檔保存的是二叉樹,文件格式不是很好描述,但是將Frame的二叉樹結構和TransformationMatrix寫入就可以了。

.a檔格式如下:
AnimationSet數量
{//循環
  Name
  Length
  Animation數量
  {//循環
     Animation名字
     TranslationKeys  //每一個key都包含時間和轉換key
     ScaleKeys
     RotationKeys
     MatrixKeys
  }
}

首先要做的事情就是讀.x檔,僞代碼如下:
D3DXFileCreate
RegisterTemplates( D3DRM_XTEMPLATES, D3DRM_XTEMPLATE_BYTES )//變量在rmxfguid.h中有聲明
CreateEnumObject如果使用了UINCODE,第二個參數改成D3DXF_FILELOAD_FROMWFILE
pD3DXEnum->GetChildren( &dwDatas );
for( DWORD dw = 0; dw < dwDatas; dw ++ ) {
   pD3DXEnum->GetChild( dw, &pD3DXData );
   ParseObject( pD3DXData );
}
ParseObject(ID3DXFileData *pDataObj)
{
pDataObj->GetType( &Type );
if( Type == Frame ) {
// do something
}
else if( ... ) { ... }
}
ParseObject中有可能還有LoadMesh,這時候不用CreateTexture,只把Texture的文件名保存就可以了。Load完成之後別忘了將Mesh優化(OptimizeInplace)一下,使用D3DXMESHOPT_ATTRSORT參數。

由於文件的格式已經給出,其它的代碼其實就是文件的讀寫,這裏就不羅嗦了。Render部分的代碼不怎麼複雜,就是DrawIndexedPrimitive函數,這裏也不羅嗦了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章