【算法】计算射线与三角形的交点

【算法】计算射线与三角形的交点

先考虑二维的情况,应该是在大家初高中做数学题经常见到的

image-20210715010151696

同样的道理就拿来放到3维用(我只证明了二维的,三维的还没验证,后面试一下就知道了

image-20210715003749585

实际上这一步能完成所有操作 a+b+c 等于1即保证了在平面上,

a>=0 b>=0 c>=0即保证了在三角形内

目前的代码

  • static bool raycast2Triangle(
            const glm::vec3 &startPoint,
            const glm::vec3 &direction, const glm::vec3 &triP1, const glm::vec3 &triP2, const glm::vec3 &triP3,
            glm::vec3 &return_cross)
    {
        //应当在前面先判断下是否平行,若平行则直接不相交
        //法向量
        auto norm = glm::cross(triP2 - triP1, triP3 - triP1);
        //如果两个向量垂直浮点数不能直接判断等于0,要跟epsilon做比较
        if (abs(glm::dot(direction, norm)) < std::numeric_limits<float>::epsilon())
        {
            return false;
        }
        //起点到三角形三点的向量矩阵
        glm::mat3x3 p2tvs(triP1 - startPoint, triP2 - startPoint, triP3 - startPoint);
        glm::vec3 k1k2k3 = glm::inverse(p2tvs) * direction;
        float n = 1 / (k1k2k3.x + k1k2k3.y + k1k2k3.z);
        return_cross = startPoint + (n)*direction;
        float a = n * k1k2k3.x;
        float b = n * k1k2k3.y;
        float c = n * k1k2k3.z;
        //全都大于0即在三角形内
        if (a >= 0 && b >= 0 && c >= 0)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    
© 2021 hanbaoaaa record.浙ICP备20005263号
asdad
联系方式 asdasd
2021-5-8 4:19
sss
回复数 (0) 点击展开
加载更多

新增评论

称呼
联系方式
邮箱(选填)
内容

提交

取消