游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2511|回复: 4

鼠标坐标到3维场景坐标的转换问题,大哥大姐帮我看看!

[复制链接]

7

主题

15

帖子

21

积分

注册会员

Rank: 2

积分
21
发表于 2006-5-20 02:24:00 | 显示全部楼层 |阅读模式


    我想在3维的场景中用鼠标点击来实现人物的精确走动到某一个点,但是我现在从鼠标的2维坐标到3维场景坐标的转换有错误。下面是我的源代码。大哥大姐给我看看方法是否正确,是哪里有错误!

        GetCursorPos(&pt);
        ScreenToClient( hWnd, &pt );

        D3DXMATRIXA16 matProj,matView,matWorld;
        g_pd3dDevice->GetTransform( D3DTS_PROJECTION, &matProj );
        g_pd3dDevice->GetTransform( D3DTS_VIEW, &matView );
        g_pd3dDevice->GetTransform( D3DTS_WORLD, &matWorld );
        D3DVIEWPORT9 viewPort;
        g_pd3dDevice->GetViewport(&viewPort);
        ScreenToClient( hWnd, &pt );

        D3DXVECTOR3 vScreen((float)pt.x,(float)pt.y,0.0f),vOut;

        D3DXVec3Unproject(&vOut,&vScreen,&viewPort,&matProj,&matView,&matWorld);
    D3DXPLANE plane;
        D3DXVECTOR3 v1(1.0f,0.0f,1.0f);
        D3DXVECTOR3 v2(-1.0f,0.0f,1.0f);
        D3DXVECTOR3 v3(-1.0f,0.0f,-1.0f);
        D3DXPlaneFromPoints( &plane, &v1, &v2, &v3 );
        D3DXPlaneIntersectLine( &vMousePt, &plane, &vEyePt, &vOut);


     vMousePt 是最后转换出来的3维向量!

201

主题

1437

帖子

1963

积分

金牌会员

Rank: 6Rank: 6

积分
1963
QQ
发表于 2006-5-21 13:39:00 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

0

主题

2

帖子

8

积分

新手上路

Rank: 1

积分
8
发表于 2006-5-22 13:36:00 | 显示全部楼层

Re:鼠标坐标到3维场景坐标的转换问题,大哥大姐帮我看



  D3DXVECTOR3 ScreenTo3D(int   iScreenX,int   iScreenY,double   f3DY)   
  {   
          D3DXVECTOR3   vPickRayDir;   
          D3DXVECTOR3   vPickRayOrig;   
          D3DXVECTOR3   vOut;   
          D3DXMATRIX   matProj;   
          g_pD3DDevice->GetTransform(   D3DTS_PROJECTION,   &matProj   );   
   
          POINT   ptCursor;   
  ptCursor.x =   iScreenX;   
  ptCursor.y =   iScreenY;   
   
          //   Compute   the   vector   of   the   pick   ray   in   screen   space   
          D3DXVECTOR3   v;   
          v.x   =     (   (   (   2.0f   *   ptCursor.x   )   /   800     )   -   1   )   /   matProj._11;   
          v.y   =   -(   (   (   2.0f   *   ptCursor.y   )   /   600   )   -   1   )   /   matProj._22;   
          v.z   =     1.0f;   
   
          //   Get   the   inverse   view   matrix   
          D3DXMATRIX   matView,   m;   
          g_pD3DDevice->GetTransform(   D3DTS_VIEW,   &matView   );   
          D3DXMatrixInverse(   &m,   NULL,   &matView   );   
   
          //   Transform   the   screen   space   pick   ray   into   3D   space   
          vPickRayDir.x     =   v.x*m._11   +   v.y*m._21   +   v.z*m._31;   
          vPickRayDir.y     =   v.x*m._12   +   v.y*m._22   +   v.z*m._32;   
          vPickRayDir.z     =   v.x*m._13   +   v.y*m._23   +   v.z*m._33;   
          vPickRayOrig.x   =   m._41;   
          vPickRayOrig.y   =   m._42;   
          vPickRayOrig.z   =   m._43;   
  vOut.y =   f3DY;   
  vOut.x =     (f3DY-vPickRayOrig.y)*vPickRayDir.x/vPickRayDir.y   +   vPickRayOrig.x   ;   
  vOut.z =     (f3DY-vPickRayOrig.y)*vPickRayDir.z/vPickRayDir.y   +   vPickRayOrig.z;   
  return   vOut;   
   
  }   
   
   
  以上中,先求得视点以及射线矢量,然后按照直线的空间方程,求得在Y平面上的X,Z坐标,可是实际中我发现这样求得的结果有较大的误差,比如视线沿X轴时X向误差较大,反之沿Z轴时Z向误差较大,恳请赐教!
这个代码是我找到的 不过,f3DY这个参数是什么意思啊,要传哪个值进去.

0

主题

2

帖子

8

积分

新手上路

Rank: 1

积分
8
发表于 2006-5-22 19:54:00 | 显示全部楼层

Re: 鼠标坐标到3维场景坐标的转换问题,大哥大姐帮我看

摆脱高手出手好不好

10

主题

69

帖子

69

积分

注册会员

Rank: 2

积分
69
发表于 2006-5-23 02:32:00 | 显示全部楼层

Re:鼠标坐标到3维场景坐标的转换问题,大哥大姐帮我看

二维到三维的转换,通常用这样一组公式(基于仿射变换):
tu=a1X + b1Y + c1Z (a1 b1 c1 为常数,求解时代入三个点的坐标(X,Y,Z,tu)即可得到解答,注意线性无关性)
tv=a2X + b2Y + c2Z (同上解释,解出系数后,将矩阵转置即可得到鼠标坐标在XYZ坐在空间的坐标)

这里把tu tv 看做你的鼠标坐标tu=pt.x tv=pt.y , X Y Z 是顶点的坐标,<<需要注意的是>>,屏幕上显示的点是基于什么坐标系的(model space -> world space -> view space -> project space)
      所以,你需要做的就是在project space中找到三个点的坐标代入上边的方程

你上边给出的那个函数,实际上就是把三维空间中的y坐标当作常量(f3dy),因为如果你试图将一个屏幕pt.x pt.y 坐标转换到三维空间的 x y z 坐标,你会发现总有某一轴向的坐标值是与另外两个坐标线性无关的,所以不好实现精确的一一映射,要忽略掉一个轴向的坐标
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-24 14:07

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表