如何初始化Mesh网格的位置

思月行云 2009-10-23 10:56:20
由于程序中要加载多个Mesh网格,所以如何设置每一个网格的初始化位置从而使之协调统一就显得尤为重要。
看过一些帖子,有人说用
m_pIDirect3DDevice->SetTransform( D3DTS_WORLD, &matWorld );
我想请教:m_pIDirect3DDevice既然是整个3D设备的指针,执行此函数的效果定然是设备中所有的网格都要随变换矩阵而发生变化,如何达到控制“每一个”网格的目的。
本人初学,还望请教~~~~~~
...全文
260 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
思月行云 2009-10-23
  • 打赏
  • 举报
回复
抱歉,行者大哥,是我说话太过偏激了。
DX相关是我自己自学的,水平仅限于资料里的那几个Demo,没有达到活学活用的程度。我们这种二流学校即便是开设图形学的课程,所传授的知识也不过是皮毛而已。因为我正确没有理解状态机的概念,才会不自觉的从面向对象的思维角度来考虑问题。
再次对您的帮助表示感谢……
xingzhe2001 2009-10-23
  • 打赏
  • 举报
回复
struct Mesh
{
LPDIRECT3DVERTEXBUFFER9 m_pVB = NULL;
LPDIRECT3DINDEXBUFFER9 m_pIB = NULL;
D3DXMATRIX m_transform;
int n_vtx, n_primcount;
};

Mesh meshes[5];

void Render()
{
pDevice->BeginScene();
for( int i = 0; i < 5; i++ )
{
pDevice->SetStreamSource(0,meshes[i].m_pVB,0,stride);
pDevice->SetIndices(meshes[i].m_pVB);
pDevice->SetTransform(D3DTS_WORLDMATRIX, meshes[i].m_transform);
pDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,0,meshes[i].n_vtx,0,meshes[i].n_primcount);

}
pDevice->EndScene();
}


这样说是不是更容易理解?
fero2004 2009-10-23
  • 打赏
  • 举报
回复
这样吧,整一个类

传 Device 进去

Render()的时候就在里面弄矩阵什么的

x ->Render();

Render()
{
................
}
xingzhe2001 2009-10-23
  • 打赏
  • 举报
回复
我没有看不起你的意思,你说是0基础,我不清楚你学到哪一步了
xingzhe2001 2009-10-23
  • 打赏
  • 举报
回复
没有捆绑一说,只有在draw之前设置了那个transform就按那个transform画

你能告诉我这个伪码你哪里不懂呢?
思月行云 2009-10-23
  • 打赏
  • 举报
回复
我的问题只在于pdevice->SetTransform()要如何通过参数将变换矩阵捆绑到相应的Mesh对象而已。
类似于简单的地形渲染这样多个三角形的堆叠还是可以勉强画的出来的,谢过行者大哥如此看得起在下~~
xingzhe2001 2009-10-23
  • 打赏
  • 举报
回复
如果你不知道pdevice->SetTransform是干啥的,在SDK搜索,不懂得来问
如果你不知道怎么调用pdevice->DrawIndexPrimitive画一个物体,那么现在讨论你的问题还为时尚早,你先学会怎么画个最简单的三角形先。
xingzhe2001 2009-10-23
  • 打赏
  • 举报
回复
SetTransform就是 pdevice->SetTransform函数,matrx_of_mesh0是代表你的mesh的矩阵
DrawMesh就是你的绘制mesh的代码,也许你的代码是 pdevice->DrawIndexPrimitive()
思月行云 2009-10-23
  • 打赏
  • 举报
回复
谢过行者大哥的指点。只是,我尚有很多初级疑问有待解答。
能否请您给出一些具体实现的源码?伪码纵然有助于思想的传达,但对于0初学者而言反而会带来更多的疑惑。谢谢……
xingzhe2001 2009-10-23
  • 打赏
  • 举报
回复
首先你要理解3d api都是状态机,就是渲染的结果只与当前状态有关,SetTransform也是一个状态,你画那个mesh就设置这个模型的状态。伪码像这样每个mesh都有自己的位置

SetTransform(matrx_of_mesh0);
DrawMesh(mesh0);
SetTransform(matrx_of_mesh1);
DrawMesh(mesh1);
SetTransform(matrx_of_mesh2);
DrawMesh(mesh2);



当然如果你draw之前没有修改setTransform, 那么将沿用以前的状态,比如
SetTransform(matrx_of_mesh0);
DrawMesh(mesh0);
DrawMesh(mesh1);
DrawMesh(mesh2);


那么这3个mesh都在matrx_of_mesh0指定的位置。
思月行云 2009-10-23
  • 打赏
  • 举报
回复
也谢过fero2004朋友的热心帮助。

8,304

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧