请教如何在屏幕2D坐标与空间3D坐标之间转换
1个回答
推荐于2016-09-18 · 知道合伙人数码行家
huanglenzhi
知道合伙人数码行家
向TA提问 私信TA
知道合伙人数码行家
采纳数:117538
获赞数:517196
长期从事计算机组装,维护,网络组建及管理。对计算机硬件、操作系统安装、典型网络设备具有详细认知。
向TA提问 私信TA
关注
展开全部
好几个朋友问到 D3DXVec3Unproject 这个函数的用法,他们进行拾取检测时想利用这个函数将屏幕空间的坐标变换回世界空间或物体空间,但是返回的却是乱七八糟的值。
这个函数在DX手册中只有很简略的几句话,没有使用中的注意事项,所以使用起来不注意的话经常会有麻烦
我看了看主要的几个问题有 (以下都指 Perspective Projection):
1. Projection Matrix 的 Near Clip 为 0.0f,这种设置方式常在图像处理中见到,虽然可以正确地在屏幕上投影生成最终图像,但在 Unprojection 时会产生错误的坐标。
2. 试图将 World、View、Projection 合并后的矩阵直接传入到 D3DXVec3Unproject 函数中。
如:
...
D3DVIEWPORT9 vp;
pdevice->GetViewport(&vp);
D3DXMATRIX idenity;
D3DXMATRIXIdentity(&identity);
D3DXMATRIX matTrans = World * View * Proj;
D3DXVec3Unproject(&pt_out, &pt_scr, &vp, &matTrans, &identity, &identity);
...
这么用在 D3DXVec3Project 中虽然能产生正确结果,但 Projection Matrix 执行的不是仿射变换,合并后会丢失在 UnProject 的过程中需要用到的信息,所以这里需要将 Projection 矩阵单独传入。
3. view port 的值不正确。请确保 viewport 结构内的参数值正确。
若要使用 D3DXVec3Unproject 进行拾取检测等操作,正确的方法应当是调用两次分别得到指定屏幕坐标点在 Near Clip Plane 和 Far Clip Plane 上的点,这两个点形一个贯穿视锥裁剪体的 ray,再利用此 ray 和场景内的物体进行求交即可
pt_in.x = screen_x;
pt_in.y = screen_y;
pt_in.z = 0.0f
D3DXVec3Unproject(&pt_near, &pt_in, &vp, &proj, &view, &world); // 得到 near clip plane 上的点
pt_in.z = 1.0f
D3DXVec3Unproject(&pt_far, &pt_in, &vp, &proj, &view, &world); // 得到 near clip plane 上的点
此时 pt_near 和 pt_far 即形成上面所说的 ray
这个函数在DX手册中只有很简略的几句话,没有使用中的注意事项,所以使用起来不注意的话经常会有麻烦
我看了看主要的几个问题有 (以下都指 Perspective Projection):
1. Projection Matrix 的 Near Clip 为 0.0f,这种设置方式常在图像处理中见到,虽然可以正确地在屏幕上投影生成最终图像,但在 Unprojection 时会产生错误的坐标。
2. 试图将 World、View、Projection 合并后的矩阵直接传入到 D3DXVec3Unproject 函数中。
如:
...
D3DVIEWPORT9 vp;
pdevice->GetViewport(&vp);
D3DXMATRIX idenity;
D3DXMATRIXIdentity(&identity);
D3DXMATRIX matTrans = World * View * Proj;
D3DXVec3Unproject(&pt_out, &pt_scr, &vp, &matTrans, &identity, &identity);
...
这么用在 D3DXVec3Project 中虽然能产生正确结果,但 Projection Matrix 执行的不是仿射变换,合并后会丢失在 UnProject 的过程中需要用到的信息,所以这里需要将 Projection 矩阵单独传入。
3. view port 的值不正确。请确保 viewport 结构内的参数值正确。
若要使用 D3DXVec3Unproject 进行拾取检测等操作,正确的方法应当是调用两次分别得到指定屏幕坐标点在 Near Clip Plane 和 Far Clip Plane 上的点,这两个点形一个贯穿视锥裁剪体的 ray,再利用此 ray 和场景内的物体进行求交即可
pt_in.x = screen_x;
pt_in.y = screen_y;
pt_in.z = 0.0f
D3DXVec3Unproject(&pt_near, &pt_in, &vp, &proj, &view, &world); // 得到 near clip plane 上的点
pt_in.z = 1.0f
D3DXVec3Unproject(&pt_far, &pt_in, &vp, &proj, &view, &world); // 得到 near clip plane 上的点
此时 pt_near 和 pt_far 即形成上面所说的 ray
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询