1
可悲的是,this問題從來沒有回答..ASSIMP網格與DirectX9的
我試圖加載具有ASSIMP模型的.X文件[或真的任何其他。
這是我想要使用的代碼:
LPDIRECT3DVERTEXBUFFER9 vbuf;
IDirect3DDevice9* dev;
Assimp::Importer imp;
aiMesh* mm1;
struct CUSTOMVERTEX {
float x,y,z;
D3DVECTOR normal;
float tx,ty;
};
#define CUSTOMFVF (D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1)
void loadtextures() {
const aiScene* sc=imp.ReadFile("model1.x",aiProcess_Triangulate | aiProcess_ConvertToLeftHanded | aiProcess_ValidateDataStructure | aiProcess_FindInvalidData);
if (!sc) {
MessageBox(NULL,"critical error in loading model file. see next dialog for errcode.",0,0);
crash((char*) imp.GetErrorString());
}
if (!sc->HasMeshes()) {
crash("failed to load model, meshes missing");
}
mm1=sc->mMeshes[0];
if (!mm1) crash("no model found in file.");
ZeroMemory(&vbuf,sizeof(vbuf));
dev->CreateVertexBuffer(mm1->mNumVertices*sizeof(CUSTOMVERTEX),0,CUSTOMFVF,D3DPOOL_DEFAULT,&vbuf,NULL);
CUSTOMVERTEX* vptr[1024];
vbuf->Lock(0,0,(void**) &vptr,0);
for(unsigned int i=0;i<mm1->mNumVertices;i++) {
CUSTOMVERTEX* c=new CUSTOMVERTEX;
c->x=mm1->mVertices[i].x; // after debugging, x,y,z are all 0.
c->y=mm1->mVertices[i].y;
c->z=mm1->mVertices[i].z;
if (mm1->HasTextureCoords(i)) {
c->tx=mm1->mTextureCoords[i]->x;
c->ty=mm1->mTextureCoords[i]->y;
} else c->tx=c->ty=0;
if (mm1->HasNormals()) {
c->normal=D3DXVECTOR3(mm1->mNormals[i].x,mm1->mNormals[i].y,mm1->mNormals[i].z);
}
vptr[i]=c;
}
vbuf->Unlock();
}
void draw_frame(HWND hwnd) {
static float cr=0;cr+=0.01f;
D3DXMATRIX mat_translate,mat_viewport,mat_projection,mat_roty,mat_rotx,mat_rotz;
D3DXMatrixLookAtLH(&mat_viewport,&D3DXVECTOR3(0,0,-20),&D3DXVECTOR3(0,0,0),&D3DXVECTOR3(0,1,0));
D3DXMatrixPerspectiveFovLH(&mat_projection,fov,(float) SCRW/(float) SCRH,1,100);
D3DXMatrixRotationY(&mat_roty,roty);
D3DXMatrixRotationX(&mat_rotx,rotx);
mat_translate=mat_rotx*mat_roty;
dev->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,0),1,0);
dev->Clear(0, NULL, D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
dev->BeginScene();
dev->SetFVF(CUSTOMFVF);
dev->SetTransform(D3DTS_WORLD,&mat_translate);
dev->SetTransform(D3DTS_VIEW,&mat_viewport);
dev->SetTransform(D3DTS_PROJECTION,&mat_projection);
dev->SetStreamSource(0,vbuf,0,sizeof(CUSTOMVERTEX));
HRESULT f=dev->DrawPrimitive(D3DPT_TRIANGLELIST,0,mm1->mNumFaces);
if (FAILED(f)) {
crash("failed to draw vertex buffer.",f);
}
dev->EndScene();
dev->Present(NULL,NULL,NULL,NULL);
}
沒有DirectX的錯誤,模型沒有顯示。
你似乎是加載到頂點緩衝區的頂點,但沒有做任何與我期望用於形成索引緩衝區的面。據我可以告訴頂點包含每個頂點和麪孔顯示它們如何形成多邊形,而你假設頂點排列在一個簡單的三角形列表中我沒有使用assimp除了快速測試一次,所以我很可能是錯的,反正它可能不是你的問題。 – jcoder 2013-03-27 13:28:13
Assimp不自動對多邊形進行三角化?呃哦。只要有一個索引緩衝區,我會盡力處理這個問題。 – object 2013-03-27 21:50:27