当前位置: 代码迷 >> VC >> 请高手帮小弟我指点一下这个关于网格和鼠标碰撞检测的有关问题
  详细解决方案

请高手帮小弟我指点一下这个关于网格和鼠标碰撞检测的有关问题

热度:855   发布时间:2013-02-25 00:00:00.0
请高手帮我指点一下这个关于网格和鼠标碰撞检测的问题
我是新手,想请大家帮忙。最近看了一段代码这部分实在是看不懂了,这里是地图和鼠标的碰撞检测,   来请教大虾帮忙,代码如下,:

头文件中的内容
#ifndef   AFX_CMATH_H
#define   AFX_CMATH_H
#define   INTERSECT_NEGATIVEY 0x10
#define   INTERSECT_HORIZENTAL 0x30  


//Summary:
//Description: 计算一个三角形和一个射线的交点
//Parameters:
// orig: 射线起始点
// dir: 射线的方向
// v0: 三角形的第一个顶点
// v1: 三角形的第二个顶点
// v2: 三角形的第三个顶点
// t: 交点到射线起始点的距离
// u: 交点在v1-v0上的投影的位置,
// v: 交点在v1-v0上的投影的位置,   交点为vRet=v0+u*(v1-v0)+v*(v2-v0)
//Returns: 是否有交点

BOOL   IntersectTriangle(   const   D3DXVECTOR3&   orig,
                                                                              const   D3DXVECTOR3&   dir,   const   D3DXVECTOR3&   v0,
                                                                              const   D3DXVECTOR3&   v1,   const   D3DXVECTOR3&   v2,
                                                                              FLOAT*   t,   FLOAT*   u,   FLOAT*   v   );
//Summary: 求射线和网格的交点
//Description: 求射线和用顶点缓冲区和索引缓冲区定义的网格的交点
//Parameters:
// pIB: 索引缓冲区
// pVB: 顶点缓冲区
// nStide: 每个顶点的大小
// dwNumFaces: 面数
// vRayOrig: 射线起始点
// vRayDir: 射线的方向
// pVRet: 交点
//Returns: 是否有交点

BOOL   IntersectIndexBuffer(LPDIRECT3DINDEXBUFFER9   pIB,
      LPDIRECT3DVERTEXBUFFER9   pVB,
      UINT   nStride,UINT   dwNumFaces,
      const   D3DVECTOR   *vRayOrig,const   D3DVECTOR   *vRayDir,
      D3DVECTOR   *pVRet,DWORD   dwFlag=0);

#endif


CPP中的内容:


#include     <d3d9.h>
#include     <d3dx9.h>
#include   "CMath.h "


//Summary: 求射线和网格的交点
//Description: 求射线和用顶点缓冲区和索引缓冲区定义的网格的交点
//Parameters:
// pIB: 索引缓冲区
// pVB: 顶点缓冲区
// nStide: 每个顶点的大小
// dwNumFaces: 面数
// vRayOrig: 射线起始点
// vRayDir: 射线的方向
// pVRet: 交点
//               dwFlag暂时不用
//Returns: 是否有交点
BOOL   IntersectIndexBuffer(LPDIRECT3DINDEXBUFFER9   pIB,//实现碰撞检测   的全局函数(顶点缓冲)
      LPDIRECT3DVERTEXBUFFER9   pVB,
      UINT   nStride,UINT   dwNumFaces,
      const   D3DVECTOR   *vRayOrig,const   D3DVECTOR   *vRayDir,D3DVECTOR   *pVRet,DWORD   dwFlag)
{
                WORD* pIndices;
                BYTE* pVertices;
D3DINDEXBUFFER_DESC   IB_Desc;

FLOAT   fBary1,   fBary2,fDist=1e+32f;

FLOAT   t_fBary1,   t_fBary2,t_fDist;
DWORD   dwFace=-1;
DWORD     dwUpperLower;