template Header {
<3D82AB43-62DA-11cf-AB39-0020AF71E433>
WORD major;
WORD minor;
DWORD flags;
}
template Vector {
<3D82AB5E-62DA-11cf-AB39-0020AF71E433>
FLOAT x;
FLOAT y;
FLOAT z;
}
template Coords2d {
<F6F23F44-7686-11cf-8F52-0040333594A3>
FLOAT u;
FLOAT v;
}
.......
==================================================
Mesh Body1 {
303; //下面点(r,g,b)的个数
0.000000;-0.061426;0.938846;,
-0.049693;0.200773;0.692165;,
.....
599; //下面点的个数,奇怪的是为什么这里是599 不是303?难道是有些点vertice 没有material
3;300,301,302;,
3;299,300,302;,
3;298,300,299;,
}
*******由于迷惑不解我就去查了一下,原来我完全理解错了。303是顶点个数 599是面数。303下面的是顶点坐标根本不是rgb
599下面是前面303个顶点的索引*******
这里讲的很详细了
MeshMaterialList {
1;
1;
0;;
Material {
0.694118;0.694118;0.694118;1.000000;;//face color
50.000000; //power
1.000000;1.000000;1.000000;; //specular color
0.000000;0.000000;0.000000;; //emissive color
TextureFilename {
"tiger.bmp";
}
}
}
MeshTextureCoords {
303; //下面点(u,v)的个数
0.190860;-0.544059;,
0.272086;-0.355992;,
0.077337;-0.522561;,
}
===========================================
开始是一堆类型定义
之后是一堆数据
mesh body 就是material 和 vertice 两部分(我猜的)猜错了。。。
mesh body是点和面
MeshMaterialList是material
MeshTextureCoords就是顶点的uv坐标了
我产生这种错觉是因为
render mesh的时候的代码 看起来都没有画vertices的
VOID Render()
{
// Clear the backbuffer and the zbuffer
g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,
D3DCOLOR_XRGB( 0, 0, 255 ), 1.0f, 0 );
// Begin the scene
if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
{
// Setup the world, view, and projection matrices
SetupMatrices();
// Meshes are divided into subsets, one for each material. Render them in
// a loop
for( DWORD i = 0; i < g_dwNumMaterials; i++ )
{
// Set the material and texture for this subset
g_pd3dDevice->SetMaterial( &g_pMeshMaterials[i] );
g_pd3dDevice->SetTexture( 0, g_pMeshTextures[i] );
// Draw the mesh subset
g_pMesh->DrawSubset( i );
}
// End the scene
g_pd3dDevice->EndScene();
}
找来找去 既然setMaterial 和setTexture都是字面的意思
那就只能是DrawSubset做得了
跟进去看的时候 发现一个interface的实现
mesh material drawsubset什么的都用到了这个方法
#define DECLARE_INTERFACE_(iface, baseiface) interface DECLSPEC_NOVTABLE iface : public baseiface
DECLARE_INTERFACE_(ID3DXMesh, ID3DXBaseMesh)
{
// IUnknown
STDMETHOD(QueryInterface)(THIS_ REFIID iid, LPVOID *ppv) PURE;
STDMETHOD_(ULONG, AddRef)(THIS) PURE;
STDMETHOD_(ULONG, Release)(THIS) PURE;
#define STDMETHOD(method) virtual COM_DECLSPEC_NOTHROW HRESULT STDMETHODCALLTYPE method
这样写读起来还真麻烦,一堆宏的缩写。
翻译过来其实就是
interface DECLSPEC_NOVTABLE ID3DXMesh :public ID3DxBaseMesh
{
virtual COM_DECLSPEC_NOTHROW HRESULT STDMETHODCALLTYPE QueryInterface(THIS_ REFIID iid, LPVOID *ppv) PURE;
这个继承实现的是interface的功能。。。。。除了翻译这些里面还有一堆宏。。。。
总之g_pMesh->DrawSubset( i );这个句画出了模型。。dx不开源