2021-07-16【算法】计算射线与三角形的交点

最近在写类似mc的游戏,方块挖掘过程中要实现射线与方块面的碰撞检测

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

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;
        }
    }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值