【3D算法】相交碰撞检测分析

一、基本原理【5】

        1、两圆碰撞检测

               【3D算法】相交碰撞检测分析_第1张图片  

//方法

Distance(X1,X2)

         2、两球碰撞检测              

//方法
Distance(P1,P2)

        3、不规则图形碰撞检测原理【10】

             【3D算法】相交碰撞检测分析_第2张图片

              绿色线应该和最近的那条边重合,红色线条是法线,基本算法如下,

               A1、遍历不规则多边形的法向量,作一条底边平行它
               A2、将各个多边形,为这条底边作投影
               A3、分别检测投影线段是否相交

              软件应用点之一:可以找出不相交的区域,并涂上不同的颜色。【11】
         
        4、射线和三角形的相交检测【1】、【7】

                  【3D算法】相交碰撞检测分析_第3张图片

                      分析

                 

/*【注解】
   O是起点,D是射线向量,u、v是权重
   右边是三角形内部点集
*/

                 右式等价于
                                   

                 最后,根据公式写代码,DX接口分析,【8】 

HRESULT D3DXIntersect(
LPD3DXBASEMESH pMesh,             //Mesh文件
CONST D3DXVECTOR3* pRayPos,       //射线起点
CONST D3DXVECTOR3* pRayDir,       //射线向量
BOOL* pHit,                       //是否相交
DWORD* pFaceIndex,                //相交面Index
FLOAT* pU,                        //相交面的U值,即权重,见上面推导
FLOAT* pV,                        //相交三角面的u值,即权重值,Pointer to a barycentric(重心的) hit coordinate
FLOAT* pDist,                     //交点与起点的距离
LPD3DXBUFFER* ppAllHits,          //所有相交三角面的信息
DWORD* pCountOfHits               //相交三角面的个数
)

二、应用分析

       1、拾取

             【3D算法】相交碰撞检测分析_第4张图片

             一个mesh文件有很多三角面片,则在大型3D游戏中,将射线和mesh的包围盒进行相交检测。、

        2、包围盒分类

               【3D算法】相交碰撞检测分析_第5张图片

           3、拾取实现注意点【8】

                  拾取发生偏移的解决办法:相机移动,重新计算射线;另外,注意矩阵变换的顺序,如是左乘,还是右乘。

参考:1、射线和三角形的相交检测

2、创建3D图形引擎(4)

3、DIRECTX9拾取

4、根据模型的顶点位置坐标和纹理坐标计算顶点的发现、切线和副法线

5、游戏开发中的数学和物理算法(6):圆和球的碰撞检测

6、圆形与矩形的碰撞检测

7、自定义射线与三角形的相交函数

8、DIRECTX9拾取

9、码农干货系列【1】--方向包围盒(OBB)碰撞检测

10、不规则图形碰撞检测

11、不规则碰撞检测原理

你可能感兴趣的:(DirectX,图形图像)