我发现可以用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的范围也是类似的
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,发现只要多读盘,游戏都会慢得无法忍受)。
不过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的范围也是类似的
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,发现只要多读盘,游戏都会慢得无法忍受)。
不过D3D bug多多,最近玩了两个D3D游戏(一个hl2,发现只要多读盘,游戏都会慢得无法忍受)。
#10
这是一个矩阵变换而已,计算机图形学里边有很多。我不知道怎样复制公式,不然就弄上来了。