Unity实现图形学算法之射线与三角检测算法

/*
//unity中的测试代码
    void Cula(Mesh mesh1,Mesh mesh2)
    {
        int[] indexs = mesh1.triangles;
        Vector3[] v1s = mesh1.vertices;
        int length = v1s.Length;
        int indexlenght = indexs.Length;
        UnityEngine.Debug.Log(length);
        UnityEngine.Debug.Log(indexlenght);

        Vector3[] vs = mesh2.vertices;
        Vector3[] normalBody = mesh2.normals;
        int length2 = vs.Length;

        for (int i = 0; i < length2; i++)
        {
            for (int j = 0; j < indexlenght;)
            {
                isEnter(vs[i], normalBody[i], v1s[indexs[j]], v1s[indexs[j + 1]], v1s[indexs[j + 2]]);
                j += 3;
            }
        }
    }
    */
	//三角检测
    bool isEnter(Vector3 o,Vector3 d,Vector3 v0, Vector3 v1, Vector3 v2)
    {
        Vector3 e1 = v1 - v0;
        Vector3 e2 = v2 - v0;
        Vector3 t = o - v0;
        Vector3 p = Vector3.Cross(d, e2);
        Vector3 q = Vector3.Cross(t, e1);
        float pe1 = 1 / (Vector3.Dot(p, e1));
        float tt = pe1 * Vector3.Dot(q, e2);
        float u = pe1 * Vector3.Dot(p, t);
        float v = pe1 * Vector3.Dot(q, d);

        if (tt >= 0 && u >= 0 && v >= 0 && u + v <= 1)
        {
            return true;
        }
        return false;
    }

基于Tomas Möller的快速检测算法的C#实现,供参考。

[1]Tomas Möller, Trumbore B . Fast, Minimum Storage Ray-Triangle Intersection[J]. 2005.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值