关于DirectX中三角形检测代码的解释

Posted tonarinototoro

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于DirectX中三角形检测代码的解释相关的知识,希望对你有一定的参考价值。

bool IntersectTriangle(const D3DXVECTOR3& orig, const D3DXVECTOR3& dir,
    D3DXVECTOR3& v0, D3DXVECTOR3& v1, D3DXVECTOR3& v2,
    FLOAT* t, FLOAT* u, FLOAT* v)

    // Find vectors for two edges sharing vert0
    D3DXVECTOR3 edge1 = v1 - v0;
    D3DXVECTOR3 edge2 = v2 - v0;

    // Begin calculating determinant - also used to calculate U parameter
    D3DXVECTOR3 pvec;
    D3DXVec3Cross(&pvec, &dir, &edge2);

    // If determinant is near zero, ray lies in plane of triangle
    FLOAT det = D3DXVec3Dot(&edge1, &pvec);

    D3DXVECTOR3 tvec;
    if (det > 0)
    
        tvec = orig - v0;
    
    else
    
        tvec = v0 - orig;
        det = -det;
    

    if (det < 0.0001f)
        return FALSE;

    // Calculate U parameter and test bounds
    *u = D3DXVec3Dot(&tvec, &pvec);
    if (*u < 0.0f || *u > det)
        return FALSE;

    // Prepare to test V parameter
    D3DXVECTOR3 qvec;
    D3DXVec3Cross(&qvec, &tvec, &edge1);

    // Calculate V parameter and test bounds
    *v = D3DXVec3Dot(&dir, &qvec);
    if (*v < 0.0f || *u + *v > det)
        return FALSE;

    // Calculate t, scale parameters, ray intersects triangle
    *t = D3DXVec3Dot(&edge2, &qvec);
    FLOAT fInvDet = 1.0f / det;
    *t *= fInvDet;
    *u *= fInvDet;
    *v *= fInvDet;

    return TRUE;

首先:我们来解释一下理论上是如何计算的:

技术图片

技术图片

以上的理论部分很多大佬解释了:

大部分代码其实也很好理解,只有

if (det > 0)
    
        tvec = orig - v0;
    
    else
    
        tvec = v0 - orig;
        det = -det;
    
这一段可能有朋友会有跟我一样的困惑,为什么这么处理?
我们求出的t其实也是一个限定条件,如果t小于o那么也是没交点的。
这里的代码则并没有讨论t,也就是说,这里对于T的调整是为了保证参数t是正的。
我们可以看到 DxE2*E1可以写成E2xE1*D所以det大于0则说明 D的方向与E2xE1指向同一侧,而t的正负号由【TE1E2】=【E1E2T】决定也就是说T必须要跟E1xE2在同一侧,大家可以在脑海里想象一下,det大于0那么是不是就直接V0--》Orig,det小于0是不是就是Orig--》V0?
很明显就是这样的。简而言之,demo里的那句调整T的代码的作用就是在此。但是这个方法貌似不能检测射线跟平面背对着的情况。不信你可以用最简单的数据试一试,还是返回true的。

以上是关于关于DirectX中三角形检测代码的解释的主要内容,如果未能解决你的问题,请参考以下文章

DirectX学习笔记:利用平面着色和Gouraud着色模式绘制具有颜色的三角形

Directx 9 地形碰撞

简单的 DirectX 11 程序运行时错误

Directx9.0 学习教程3 -图形学之创建点 线 三角形 等

带三角形带的圆圈

三角形是 gpu 限制还是有其他渲染路径?