[请教如何在屏幕2D坐标与空间3D坐标之间转换!]

时间:2023-01-25 04:20:12
[请教如何在屏幕2D坐标与空间3D坐标之间转换!]
我发现可以用D3DXVec3Project从3D坐标转换到屏幕坐标
同时可以用D3DXVec3UnProject将屏幕坐标转换成3D坐标!

但是由于本人是初学,所以里面很多参数搞不清如何取得,以D3DXVec3UnProject为例:
D3DXVECTOR3 VOut,VIn;
D3DVIEWPORT8          ViewPort;
D3DXMATRIX World;
D3DXMATRIX View;
D3DXMATRIX Projection;

VIn.x = 200;
VIn.y = 20;
VIn.z = 20;
ViewPort.X = 0;
ViewPort.Y = 0;
ViewPort.Width = 1024;
ViewPort.Height = 768;
ViewPort.MinZ = 0;
ViewPort.MaxZ = 100;

g_pD3DDevice->GetTransform(D3DTS_WORLD,&World);
g_pD3DDevice->GetTransform(D3DTS_VIEW,&View);
g_pD3DDevice->GetTransform(D3DTS_PROJECTION,&Projection);
D3DXVec3Project(&VOut,&VIn,&ViewPort,&Projection,&View,&World);
char sTmp[1000];
sprintf(sTmp,"x=%d,y=%d,z=%d",VOut.x,VOut.y,VOut.z);
////


结果转换出来的值非常夸张! 在基本100,000以上

请教:我例程中World,View,Projection的获取方法是否正确!

谢谢指教 !



10 个解决方案

#1


纠正:上面的函数写成了D3DXVec3Project应该是D3DXVec3Unproject

#2


只作过opengl的。

#3


说说看OGL中是如何处理的,是否有通用的算法。。。

#4



"非常夸张"是“好”的意思吗?

“100,000以上”又是代表什么?

#5


需用算法可以和我联系,我有写过类似成熟的算法哦。 QQ:67644664

#6


OpenGL用gluProject,DirectX不清楚

#7


dx里面有现成的例子啊

dx一般不直接使用那个函数做转换,而是使用更灵活的用户自己计算的方式
pick那个例子,里面在做三角形选取的时候,就是从2d的屏幕空间坐标转换到3d的世界坐标系下,选择具体的三角形面片的。

D3DXVECT3UNPROJECT也是可以做逆向变换的
从你给出代码看,你设置的参数有问题,VIEWPORT的参数当中maxZ只能是1,不可能是100的
ptIn.z的范围也是0到1的
那个函数只是根据你的参数进行计算,你给的输入参数不合理,输出自然也不对

注意屏幕坐标下的z数值范围是0到1,对应的是近裁剪平面和远裁剪平面之间的范围,你给的输入数值是20,那么对应的点是远裁剪平面20倍的距离了,所以结果当然会非常的大。
视口设置的时候,z的范围也是类似的

#8


DX好难的,我不懂,我看看在说啊

#9


opengl和D3D其实是一样的,3D->2D **project, 2D->3D **unproject。
不过D3D bug多多,最近玩了两个D3D游戏(一个hl2,发现只要多读盘,游戏都会慢得无法忍受)。

#10


这是一个矩阵变换而已,计算机图形学里边有很多。我不知道怎样复制公式,不然就弄上来了。

#1


纠正:上面的函数写成了D3DXVec3Project应该是D3DXVec3Unproject

#2


只作过opengl的。

#3


说说看OGL中是如何处理的,是否有通用的算法。。。

#4



"非常夸张"是“好”的意思吗?

“100,000以上”又是代表什么?

#5


需用算法可以和我联系,我有写过类似成熟的算法哦。 QQ:67644664

#6


OpenGL用gluProject,DirectX不清楚

#7


dx里面有现成的例子啊

dx一般不直接使用那个函数做转换,而是使用更灵活的用户自己计算的方式
pick那个例子,里面在做三角形选取的时候,就是从2d的屏幕空间坐标转换到3d的世界坐标系下,选择具体的三角形面片的。

D3DXVECT3UNPROJECT也是可以做逆向变换的
从你给出代码看,你设置的参数有问题,VIEWPORT的参数当中maxZ只能是1,不可能是100的
ptIn.z的范围也是0到1的
那个函数只是根据你的参数进行计算,你给的输入参数不合理,输出自然也不对

注意屏幕坐标下的z数值范围是0到1,对应的是近裁剪平面和远裁剪平面之间的范围,你给的输入数值是20,那么对应的点是远裁剪平面20倍的距离了,所以结果当然会非常的大。
视口设置的时候,z的范围也是类似的

#8


DX好难的,我不懂,我看看在说啊

#9


opengl和D3D其实是一样的,3D->2D **project, 2D->3D **unproject。
不过D3D bug多多,最近玩了两个D3D游戏(一个hl2,发现只要多读盘,游戏都会慢得无法忍受)。

#10


这是一个矩阵变换而已,计算机图形学里边有很多。我不知道怎样复制公式,不然就弄上来了。