首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用directx9实现ASSIMP网格

用directx9实现ASSIMP网格
EN

Stack Overflow用户
提问于 2013-03-25 02:44:27
回答 1查看 601关注 0票数 1

遗憾的是,this的问题一直没有得到回答。

我正在尝试加载一个.X文件,或者使用ASSIMP加载任何其他模型。

这是我尝试使用的代码:

代码语言:javascript
运行
复制
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错误,模型也不显示。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-27 21:03:34

我可以使用Assimp成功地将任何网格格式加载到我的directx9应用程序中。请让我知道,以防你仍然在这个问题上。

现在,我只能在没有任何纹理的情况下加载第0索引的网格。在做其他的事情...让我知道:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15602484

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档