手动写一个模型是非常麻烦的,这就是为什么需要美工来做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模型。当然只是理论上罢了。
本文介绍了手动创建3D模型的基本方法,包括属性表、模型克隆及使用D3DXCreateMesh函数创建空模型的过程。文章指出手动创建模型虽然理论上可行,但实际操作复杂繁琐,因此通常采用3D建模软件辅助。
3094

被折叠的 条评论
为什么被折叠?



