求答:3D空间坐标转换屏幕2D坐标.

时间:2022-02-24 04:19:45
D3DXMATRIX mview,mpoj,mwod,mxyz;
D3DXVECTOR3 veyept;
veyept.x=m_game.viewx;
veyept.y=m_game.viewy+m_game.vy;
veyept.z=m_game.viewz-m_game.vz;
D3DXVECTOR3 vlookatpt;
vlookatpt.x=m_game.viewx;
vlookatpt.y=0.0f;
vlookatpt.z=m_game.viewz;
D3DXVECTOR3 vupvec(0.0f,1.0f,0.0f);
D3DXMatrixLookAtLH(&mview,&veyept,&vlookatpt,&vupvec);

D3DXMatrixPerspectiveFovLH(&mpoj,D3DX_PI/4,(float)D3D_WIDTH/(float)D3D_HEIGHT,1.0f,1500.0f);//投置投影距阵
D3DXMatrixTranslation(&mxyz,m_cmx.object[danqianmesh].m_xyz.x,m_cmx.object[danqianmesh].m_xyz.y,m_cmx.object[danqianmesh].m_xyz.z);
m_game.g_device->SetTransform(D3DTS_WORLD,&mxyz);
m_game.g_device->GetTransform(D3DTS_WORLD,&mwod);
D3DVIEWPORT9 viewpoj;
viewpoj.X=0;
viewpoj.Y=0;
viewpoj.Width=D3D_WIDTH;
viewpoj.Height=D3D_HEIGHT;
viewpoj.MinZ=0.0f;
viewpoj.MaxZ=1.0f;
D3DXVec3Project(&dx,&m_cmx.object[danqianmesh].m_xyz,&viewpoj,&mpoj,&mview,&mwod);


为什么老是不成功.获取的数字.[来源:GameRes.com]很大不知道.D3DXVec3Project这个函数到底怎么用.求高手指点....


D3DXVec3Projectp这个函数到底怎么用呀....怎么看到有人把第二个参数三个坐标都设为零,第二个参数是不是要转换的坐标吗.为什么要为零

7 个解决方案

#1


m_game.g_device->SetTransform(D3DTS_WORLD,&mxyz);
m_game.g_device->GetTransform(D3DTS_WORLD,&mwod);

你理解这两句是什么意思吗???

D3DXMatrixTranslation(&mxyz,m_cmx.object[danqianmesh].m_xyz.x,m_cmx.object[danqianmesh].m_xyz.y,m_cmx.

这个产生一个偏移m_cmx.object[danqianmesh].xyz的矩阵,且个世界矩阵,

你再求m_cmx.object[danqianmesh].xyz偏移了m_cmx.object[danqianmesh].xyz后,在view,proj变幻后的坐标?????

仔细想想吧!!!!!!!

#2


这个程序写得太长了

求变幻后的坐标很简单

mat = world * view * proj;

new point = mul( point, mat );

#3


回二楼的.
我原本是想把这个物体放到3D空间去.然后取这个世界矩阵,因为我是多视区.所以单单用GetTransfrom取不到想要的世界矩阵.

三楼的MUL这个函数还是第一次见.汗...你这个point是POINT结构体对像吧

#4


mul,是指vector与matrix相乘

我只是借用shader里的含义,你明白意思就行了

#5


真是晕死,为什么要先set,后get?

直接=不行??????

#6


D3DXVec3Project内部是这么做的:
result=pos*WorldMatrix*ViewMatrix*ProjectMatrix*ViewPortMatrix;

而你的WorldMatrix是从pos变换来的,简单的理解起来,就变成了这样的:
result=pos*pos*ViewMatrix*ProjectMatrix*ViewPortMatrix;

所以pos被算了两次,结果当然不对了。

所以这里,要么WorldMatrix设为Identity矩阵,要么D3DXVec3Project的时候传入坐标设为(0,0,0)

#7


谢谢六楼..

受教了.....

改了一下成功了....谢谢哈
等下再试一下MUL这个.呵呵这个这么简单......

#1


m_game.g_device->SetTransform(D3DTS_WORLD,&mxyz);
m_game.g_device->GetTransform(D3DTS_WORLD,&mwod);

你理解这两句是什么意思吗???

D3DXMatrixTranslation(&mxyz,m_cmx.object[danqianmesh].m_xyz.x,m_cmx.object[danqianmesh].m_xyz.y,m_cmx.

这个产生一个偏移m_cmx.object[danqianmesh].xyz的矩阵,且个世界矩阵,

你再求m_cmx.object[danqianmesh].xyz偏移了m_cmx.object[danqianmesh].xyz后,在view,proj变幻后的坐标?????

仔细想想吧!!!!!!!

#2


这个程序写得太长了

求变幻后的坐标很简单

mat = world * view * proj;

new point = mul( point, mat );

#3


回二楼的.
我原本是想把这个物体放到3D空间去.然后取这个世界矩阵,因为我是多视区.所以单单用GetTransfrom取不到想要的世界矩阵.

三楼的MUL这个函数还是第一次见.汗...你这个point是POINT结构体对像吧

#4


mul,是指vector与matrix相乘

我只是借用shader里的含义,你明白意思就行了

#5


真是晕死,为什么要先set,后get?

直接=不行??????

#6


D3DXVec3Project内部是这么做的:
result=pos*WorldMatrix*ViewMatrix*ProjectMatrix*ViewPortMatrix;

而你的WorldMatrix是从pos变换来的,简单的理解起来,就变成了这样的:
result=pos*pos*ViewMatrix*ProjectMatrix*ViewPortMatrix;

所以pos被算了两次,结果当然不对了。

所以这里,要么WorldMatrix设为Identity矩阵,要么D3DXVec3Project的时候传入坐标设为(0,0,0)

#7


谢谢六楼..

受教了.....

改了一下成功了....谢谢哈
等下再试一下MUL这个.呵呵这个这么简单......