游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2527|回复: 8

读.x文件的问题

[复制链接]

3

主题

4

帖子

8

积分

新手上路

Rank: 1

积分
8
发表于 2009-2-22 23:58:00 | 显示全部楼层 |阅读模式
读.x文件生成模型,能不能获取各个顶点的坐标位置等信息。比如一张地图,我想知道各个位置的高度。

2

主题

12

帖子

14

积分

新手上路

Rank: 1

积分
14
发表于 2009-2-23 06:23:00 | 显示全部楼层

Re:读.x文件的问题

可以,通过
Vertex* v = 0;
mesh->LockVertexBuffer(0, (void**)&v);
可以获得(v._x, v._y  ,v._z )顶点坐标
         (v._nx , v._ny , v._nz)顶点法线向量
          (v._u  , v._v)纹理坐标
希望有用

1

主题

11

帖子

11

积分

新手上路

Rank: 1

积分
11
发表于 2009-2-23 11:33:00 | 显示全部楼层

Re:读.x文件的问题

能否具体点,GetVertexBuffer只能得到buffer阿,怎样才能让这个buffer里的数据装化为顶点的数据格式,一个一个读出来

3

主题

4

帖子

8

积分

新手上路

Rank: 1

积分
8
 楼主| 发表于 2009-2-23 13:46:00 | 显示全部楼层

Re: 读.x文件的问题

原来这样,谢谢,研究一下

8

主题

284

帖子

296

积分

中级会员

Rank: 3Rank: 3

积分
296
QQ
发表于 2009-2-23 21:37:00 | 显示全部楼层

Re:读.x文件的问题

先CloneMeshFVF,再GetVertexBuffer,最后自己读VB。

1

主题

11

帖子

11

积分

新手上路

Rank: 1

积分
11
发表于 2009-2-24 11:22:00 | 显示全部楼层

Re:读.x文件的问题

// Vertex 是D3DFVF_XYZ|D3DFVF_NORMAL|D3DFVF_TEX0格式的顶点,用来存储mesh里的顶点数据
Vertex* v = 0;
HRESULT hr=D3DXLoadMeshFromX(L"C:\ll.x",D3DUSAGE_DYNAMIC,pDevice,&ppAdjacency,&ppMaterials,&ppEffectInstance,&pNumMaterials,&ppMesh);
if(RESULT_OK == hr)
{
     HRESULT hr=ppMesh->CloneMeshFVF(D3DUSAGE_DYNAMIC|D3DXMESH_VB_WRITEONLY ,D3DFVF_XYZ|D3DFVF_NORMAL|D3DFVF_TEX0 , pDevice ,&ppCloneMeshJ);
     if(RESULT_OK == hr)
     {
         ppCloneMesh->GetVertexBuffer(&ppVB);
         ppVB->Lock(0,0,&v,D3DLOCK_DISCARD )
          {
              D3DVERTEXBUFFER_DESC *pDesc;
              ppVB->GetDesc(&pDesc);
              // 假设D3DFVF_XYZ|D3DFVF_NORMAL|D3DFVF_TEX0占20 个字节.
              for(int i=0 ;i< (pDesc->Size)/20 ; i++)
              {
                  // 将mesh里的数据读到出来
                  v = ppVB;
              }
          }
         ppVB->Unlock();
     }
}
大致这样写一下,不知道对不?请赐教

1

主题

11

帖子

11

积分

新手上路

Rank: 1

积分
11
发表于 2009-2-24 14:59:00 | 显示全部楼层

Re:读.x文件的问题

ID3DXMesh* cloneMesh;
IDirect3DVertexBuffer9 *pVB;
VertexPNT *v = 0;
HR(mMesh->CloneMeshFVF(D3DUSAGE_DYNAMIC|D3DXMESH_VB_WRITEONLY,D3DFVF_XYZ|D3DFVF_NORMAL|D3DFVF_TEX0,
                                                  gd3dDevice,&cloneMesh));
        HR(cloneMesh->GetVertexBuffer(&pVB));
        pVB->Lock(0,0,(void**)&v,D3DLOCK_DISCARD);
        {
            v = (VertexPNT*)(pVB);
        }
自己去写了一下,改了一些语法错误,和删除了一些不需要的语句

8

主题

284

帖子

296

积分

中级会员

Rank: 3Rank: 3

积分
296
QQ
发表于 2009-2-27 02:14:00 | 显示全部楼层

Re:读.x文件的问题

v = (VertexPNT*)(pVB);
你这样做是错误的。
pVB锁定后,v是指向锁定资源的内存指针。
cloneMesh->GetVertexBuffer(&pVB);
DWORD num = cloneMesh->GetNumVertices();
Vertex *dest = new Vertex[num];
Vertex *v = NULL;
pVB->Lock(0,0,(void**)&v,D3DLOCK_DISCARD);
{
            memcpy(dest,v, sizeof(Vertex)*num);
            // 这里也可以这样
            // for(DWORD i=0;i<num;i++)
            //    dest = v;
}

pVB->Unlock();

1

主题

11

帖子

11

积分

新手上路

Rank: 1

积分
11
发表于 2009-2-28 20:34:00 | 显示全部楼层

Re:读.x文件的问题

Thank you for reminding .:)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-20 05:08

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表