游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1738|回复: 2

请问下面两种获取屏幕点的世界坐标方法有什么不一样

[复制链接]

6

主题

8

帖子

12

积分

新手上路

Rank: 1

积分
12
发表于 2010-3-24 15:18:00 | 显示全部楼层 |阅读模式
[em24] [em24] [em24]

代码如下:
第一种:
D3DXMATRIX world, view, projection;
GetDevice()->GetTransform(D3DTS_WORLD,&world);  
GetDevice()->GetTransform(D3DTS_VIEW,&view);  
GetDevice()->GetTransform(D3DTS_PROJECTION,&projection);  

:3DXVec3Unproject(&pOut,&pIn,&viewport,&projection,&view,&world);

第二种:
D3DXMATRIX   matWorld, matView, pmatProj, m;
D3DXVECTOR3  WorldPtDir;
       
//获取当前设备的变换矩阵
m_pGraphic->Device()->GetTransform( D3DTS_WORLD, &matWorld );
m_pGraphic->Device()->GetTransform( D3DTS_VIEW, &matView );
m_pGraphic->Device()->GetTransform( D3DTS_PROJECTION, &pmatProj );
       
//计算世界观察矩阵的逆矩阵
D3DXMATRIX mWorldView = matWorld * matView;
D3DXMatrixInverse( &m, NULL, &mWorldView );
       
//获取当前视区相关信息
D3DVIEWPORT9 viewport;
m_pApplication->GetDeviceGraphic()->Camera()->GetViewPort(viewport);
       
//计算拾取射线的方向与原点
D3DXVECTOR3 vTemp;
vTemp.x =  ((( 2.0f * Pt.x ) / viewport.Width ) - 1 ) / pmatProj._11;
vTemp.y = -((( 2.0f * Pt.y ) / viewport.Height ) - 1 ) / pmatProj._22;
vTemp.z =  1;
       
WorldPtDir.x  = vTemp.x*m._11 + vTemp.y*m._21 + vTemp.z*m._31;
WorldPtDir.y  = vTemp.x*m._12 + vTemp.y*m._22 + vTemp.z*m._32;
WorldPtDir.z  = vTemp.x*m._13 + vTemp.y*m._23 + vTemp.z*m._33;

本人菜鸟,请指教指教……

2

主题

429

帖子

435

积分

中级会员

Rank: 3Rank: 3

积分
435
发表于 2010-3-24 21:59:00 | 显示全部楼层

Re:请问下面两种获取屏幕点的世界坐标方法有什么不一样

原理一样。第一个是第二个的封装。第一个可能有优化过。

6

主题

8

帖子

12

积分

新手上路

Rank: 1

积分
12
 楼主| 发表于 2010-3-25 09:25:00 | 显示全部楼层

Re:请问下面两种获取屏幕点的世界坐标方法有什么不一样

在两种方法下得出来的向量值会有差别,不知为何
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-6-10 10:03

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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