D3D 鼠标拾取技术
来源:互联网 发布:数据漫游开了会扣费吗 编辑:程序博客网 时间:2024/05/17 22:09
D3D 鼠标拾取技术对用DirectX编写网络游戏的爱好者,尤其是初学者来说是一项非常重要的药掌握的技术。开始学写游戏时,它总是困扰着初学者...
我这会儿刚完成了,写点心得
新手分享
就说说思想,毕竟,有了思想,技术上很好实现...
首先呢,我们可以通过获得窗口上鼠标的然后呢,将它转化到世界矩阵里...
呵呵,这点,对初学者来说还是有点麻烦滴
//计算拾取射线相关变量声明
POINT ptCursor; //鼠标位置
D3DXMATRIX matWorld, matView, pmatProj, m;
D3DXVECTOR3 vPickRayOrig, vPickRayDir;
int iWidth, iHeight;
//获取后台缓冲区的宽度和高度
iWidth = DXUTGetBackBufferSurfaceDesc()->Width;
iHeight = DXUTGetBackBufferSurfaceDesc()->Height;
//获取当前鼠标在窗口客户区中的位置
GetCursorPos( &ptCursor );
ScreenToClient( DXUTGetHWND(), &ptCursor );
//获取当前设备的变换矩阵
pd3dDevice->GetTransform( D3DTS_WORLD, &matWorld );
pd3dDevice->GetTransform( D3DTS_VIEW, &matView );
pd3dDevice->GetTransform( D3DTS_PROJECTION, &pmatProj );
//计算世界观察矩阵的逆矩阵matWorld
D3DXMATRIX mWorldView = pMesh->m_pmatWorld* matView;
D3DXMatrixInverse( &m, NULL, &mWorldView );
//计算拾取射线的方向与原点
D3DXVECTOR3 vTemp;
vTemp.x = ((( 2.0f * ptCursor.x ) / iWidth ) - 1 ) / pmatProj._11;
vTemp.y = -((( 2.0f * ptCursor.y ) / iHeight ) - 1 ) / pmatProj._22;
vTemp.z = 1.0f;
vPickRayDir.x = vTemp.x*m._11 + vTemp.y*m._21 + vTemp.z*m._31;
vPickRayDir.y = vTemp.x*m._12 + vTemp.y*m._22 + vTemp.z*m._32;
vPickRayDir.z = vTemp.x*m._13 + vTemp.y*m._23 + vTemp.z*m._33;
vPickRayOrig.x = m._41;
vPickRayOrig.y = m._42;
vPickRayOrig.z = m._43;
这是我程序中用到的部分代码,以供参考...
然后呢,用这个函数
HRESULT D3DXIntersect( LPD3DXBASEMESH pMesh, CONST D3DXVECTOR3 * pRayPos, CONST D3DXVECTOR3 * pRayDir, BOOL * pHit, DWORD * pFaceIndex, FLOAT * pU, FLOAT * pV, FLOAT * pDist, LPD3DXBUFFER * ppAllHits, DWORD * pCountOfHits);
bHit 的值可以让我知道有没有点选到模型
然后呢,用相似的方法,求的这个线向量跟你想要的平面求交点
把它给你的模型,当它的坐标就一切OK了
- D3D 鼠标拾取技术
- D3D中的拾取
- D3D拾取实现
- D3D中的拾取
- 拾取技术
- OGRE 鼠标拾取
- 鼠标拾取原理介绍
- ogre中的鼠标拾取
- Unity3d 鼠标拾取
- Unity3d 鼠标拾取
- Unity 鼠标拾取
- OpenGL中鼠标拾取
- Unity3d 鼠标拾取 javascript
- 鼠标拾取代码总结
- 鼠标拾取功能
- d3d11 鼠标拾取
- OpenGL鼠标拾取
- D3D鼠标输入处理
- Employee 的构造 类
- AXIS 入门
- Employee 的测试 (类)
- Spring:使用JdbcTemplate的简单实例-基于XML文件配置
- 开始找工作了
- D3D 鼠标拾取技术
- MSDN网络广播预告:.NET 4.0中的新特性系列课程(5):追踪CLR——使用Windows事件跟踪(ETW)观察公共语言运行时CLR(Level 300)
- 堆和栈的区别
- C/C++头文件一览
- 第七讲
- CString常用方法简介
- 最简单的json实例
- 详细解说 STL 排序(Sort)
- 分层窗口实现千千静听的透明歌词