Example #1
0
    public CustomHitInfo GlobalClosestHit(Vector3 position)
    {
        Mesh mesh = mf.sharedMesh;

        Vector3[]     vertices           = mesh.vertices;
        int[]         triangles          = mesh.triangles;
        Vector3       positionModelSpace = mf.gameObject.transform.InverseTransformPoint(position);
        int           vertexIdx          = kdTree.nearest(positionModelSpace);
        float         minDistance        = 100000f;
        CustomHitInfo hit = new CustomHitInfo();

        hit.point = mf.gameObject.transform.TransformPoint(vertices[vertexIdx]);
        foreach (var triangleIdx in vertexToTriangle[vertexIdx])
        {
            Vector3 a        = vertices[triangles[3 * triangleIdx]];
            Vector3 b        = vertices[triangles[3 * triangleIdx + 1]];
            Vector3 c        = vertices[triangles[3 * triangleIdx + 2]];
            Vector3 s        = ClosestPointOnTriangle(a, b, c, positionModelSpace);
            float   distance = Vector3.Distance(s, positionModelSpace);
            if (distance < minDistance)
            {
                minDistance = distance;
                hit.point   = mf.gameObject.transform.TransformPoint(s);
                Vector3 n = Vector3.Cross(b - a, c - a);
                n.Normalize();
                hit.normal        = n;
                hit.triangleIndex = triangleIdx;
            }
        }
        hit.collider = mc;
        hit.success  = true;
        return(hit);
    }
    public bool Raycast(CustomRay ray, out CustomHitInfo hitInfo, int maxDistance)
    {
        hitInfo = new CustomHitInfo();
        //  TODO: Write raycast function

        /*
         * for (int i = 0; i < 3; ++i)
         * {
         *  float invD = 1/ray.m_direction[i];
         *  float t0 = (i - ray.m_origin[i])*invD;
         * }
         */
        return(true);
    }
Example #3
0
    public CustomHitInfo LocalClosestHit(Vector3 position)
    {
        if (tOld == -1)
        {
            CustomHitInfo hitInfo = GlobalClosestHit(position);
            tOld = hitInfo.triangleIndex;
            return(hitInfo);
        }

        Mesh mesh = mf.sharedMesh;

        int[]         visited            = new int[mesh.triangles.Length / 3];
        Vector3       positionModelSpace = mf.gameObject.transform.InverseTransformPoint(position);
        CustomHitInfo hit = new CustomHitInfo();
        Vector3       a   = mesh.vertices[mesh.triangles[3 * tOld]];
        Vector3       b   = mesh.vertices[mesh.triangles[3 * tOld + 1]];
        Vector3       c   = mesh.vertices[mesh.triangles[3 * tOld + 2]];
        Vector3       s   = ClosestPointOnTriangle(a, b, c, positionModelSpace);

        hit.point = mf.gameObject.transform.TransformPoint(s);
        float      minDistance         = 10000f;
        List <int> trianglesInCurRing  = new List <int>();
        List <int> trianglesInNextRing = new List <int>();

        trianglesInCurRing.Add(tOld);
        int count = 0;

        while (true)
        {
            bool gettingCloser = false;
            foreach (int triangleIdx in trianglesInCurRing)
            {
                visited[triangleIdx] = 1;
                a = mesh.vertices[mesh.triangles[3 * triangleIdx]];
                b = mesh.vertices[mesh.triangles[3 * triangleIdx + 1]];
                c = mesh.vertices[mesh.triangles[3 * triangleIdx + 2]];
                s = ClosestPointOnTriangle(a, b, c, positionModelSpace);
                float distance = Vector3.Distance(s, positionModelSpace);
                if (distance < minDistance)
                {
                    gettingCloser = true;
                    if (count >= 1)
                    {
                        Debug.Log("rings away");
                        Debug.Log(count);
                    }
                    minDistance = distance;
                    hit.point   = mf.gameObject.transform.TransformPoint(s);
                    Vector3 n = Vector3.Cross(b - a, c - a);
                    n.Normalize();
                    hit.normal        = n;
                    hit.triangleIndex = triangleIdx;
                }
                AddTrianglesToRing(trianglesInNextRing, triangleIdx, visited);
            }
            trianglesInCurRing  = trianglesInNextRing;
            trianglesInNextRing = new List <int>();
            if (!gettingCloser)
            {
                break;
            }
            count++;
        }
        hit.collider = mc;
        tOld         = hit.triangleIndex;
        hit.success  = true;
        return(hit);
    }