`
jgsj
  • 浏览: 960757 次
文章分类
社区版块
存档分类
最新评论

图形学 Direct3D中手动创建3D模型

 
阅读更多

手动写一个模型是非常麻烦的,这就是为什么需要美工来做3D模型,美工利用各种可视化的软件如:3DSmax, maya, Blender等等,那样方便做出各种3d模型。如果手工设置,直接编程出来的话,工作量会相当大,甚至不一定能做出我们想要的模型,但是理论上这是可能的,所以我们看看如何做。

属性表

当模型的mesh被优化,那么它会如下排序:

属性表就是一个D3DXATTRIBUTERANGE的数组:

typedef struct _D3DXATTRIBUTERANGE {
    DWORD  AttribId;
    DWORD  FaceStart;
    DWORD  FaceCount;
    DWORD  VertexStart;
    DWORD  VertexCount;
} D3DXATTRIBUTERANGE;

Cloning

拷贝一个模型mesh到另外一个模型mesh中:

HRESULT ID3DXMesh::CloneMesh(
      DWORD Options,
      const D3DVERTEXELEMENT9 *pDeclaration,
      LPDIRECT3DDEVICE9 pDevice,
      LPD3DXMESH *ppCloneMesh
);

如下,拷贝meshSys到temp容器。

D3DVERTEXELEMENT9 elements[] =
{
{0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0},
{0, 12, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL, 0},
{0, 24, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0},
D3DDECL_END()
};

ID3DXMesh* temp = 0;
HR(meshSys->CloneMesh(D3DXMESH_SYSTEMMEM,
     elements, gd3dDevice, &temp));

手动创建一个空的Mesh (DSDXCreateMesh)

如下:但是那么需要手动来填写相关属性,会非常麻烦;这就是为什么需要可视化工具来做3d模型。

HRESULT WINAPI D3DXCreateMesh(
      DWORD NumFaces,
      DWORD NumVertices,
      DWORD Options,
      const LPD3DVERTEXELEMENT9 *pDeclaration,
      LPDIRECT3DDEVICE9 pD3DDevice,
      LPD3DXMESH *ppMesh
);

使用范例:

D3DVERTEXELEMENT9 elements[] =
{
{0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0},
{0, 12, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL, 0},
{0, 24, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0},
D3DDECL_END()
};

ID3DXMesh* mesh = 0;
HR(D3DXCreateMesh(12, 24, D3DXMESH_MANAGED, elements,
     gd3dDevice, &mesh));//创建一个空的3D模型。
 


然后手动填写其中相关的属性,那么理论上就可以做出各种3D模型。当然只是理论上罢了。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics