Пример #1
0
    public static bool lineIntersect3D(Vector3 linea1, Vector3 linea2, Vector3 lineb1, Vector3 lineb2, ref Vector3 ip, float tol)
    {
        Vector3 da = linea2 - linea1;
        Vector3 db = lineb2 - lineb1;
        Vector3 dc = lineb1 - linea1;

        Vector3 dadbcross = Vector3.Cross(da, db);

        float dotTol = Vector3.Dot(dc, dadbcross);

        //Debug.Log(dotTol);

        float toln = tol * 100;

        if (!NearestPointTest.valueWithinRange(-toln, toln, dotTol))
        {
            return(false);
        }

        float s = Vector3.Dot(Vector3.Cross(dc, db), dadbcross) / dadbcross.sqrMagnitude;

        if (s >= 0.0f && s <= 1.0f)
        {
            Vector3 mp = da * s;
            ip = linea1 + mp;
            return(true);
        }

        return(false);
    }
    public static Vector3 NearestPointOnMesh(Vector3 pt, Vector3[] verts, int[] tri, VertTriList vt)
    {
        int   num  = -1;
        float num2 = 1E+08f;

        for (int i = 0; i < verts.Length; i++)
        {
            float sqrMagnitude = (verts[i] - pt).sqrMagnitude;
            bool  flag         = sqrMagnitude >= num2;
            if (!flag)
            {
                num  = i;
                num2 = sqrMagnitude;
            }
        }
        bool    flag2 = num == -1;
        Vector3 result;

        if (flag2)
        {
            result = Vector3.zero;
        }
        else
        {
            int[]   array  = vt[num];
            Vector3 vector = Vector3.zero;
            num2 = 1E+08f;
            for (int j = 0; j < array.Length; j++)
            {
                int     num3          = array[j] * 3;
                Vector3 vector2       = verts[tri[num3]];
                Vector3 vector3       = verts[tri[num3 + 1]];
                Vector3 vector4       = verts[tri[num3 + 2]];
                Vector3 vector5       = NearestPointTest.NearestPointOnTri(pt, vector2, vector3, vector4);
                float   sqrMagnitude2 = (pt - vector5).sqrMagnitude;
                bool    flag3         = sqrMagnitude2 >= num2;
                if (!flag3)
                {
                    vector = vector5;
                    num2   = sqrMagnitude2;
                }
            }
            result = vector;
        }
        return(result);
    }
Пример #3
0
    // To do falloff we need connected verts to each vert then just need to do recursive check until none effected
    void DeformMesh()
    {
        for (int i = 0; i < verts.Length; i++)
        {
            Vector3 p      = verts[i];          // + offsets[i];
            Vector3 origin = transform.TransformPoint(p);
            if (col.bounds.Contains(origin))
            {
                // Point in collider space
                Vector3 lp = col.transform.worldToLocalMatrix.MultiplyPoint(origin);

                Vector3 np   = NearestPointTest.NearestPointOnMesh(lp, colmesh.verts, colmesh.tris, colmesh.trilist);
                float   dist = Vector3.Distance(lp, np);
                Debug.Log("[" + i + "] = " + dist.ToString("0.00000"));                 //np " + np);
            }


            sverts[i] = verts[i];
        }
    }
Пример #4
0
        public static void ConvexHull2DTriangulated(List <Vector3> pt, List <Vector3> tri, ref Vector3 norm)
        {
            NearestPointTest.triangulate(pt, tri, norm);

            /*opt.Clear();
             *
             * ConvexHull2D(pt, opt, ref norm);
             *
             * if (opt.Count < 3) {
             *  return;
             * }
             *
             * Vector3 line1 = pt[0];
             *
             * int count = pt.Count - 1;
             *
             * for (int i = 1; i < count; i++) {
             *  tri.Add(line1);
             *  tri.Add(pt[i]);
             *  tri.Add(pt[i + 1]);
             * }*/
        }
Пример #5
0
    public void updateMesh()
    {
        vertexPoints.Clear();
        indexPoints.Clear();
        uvPoints.Clear();

        oobb.update(gameObject);

        Vector3 dirUp    = gameObject.transform.TransformDirection(Vector3.up);
        Vector3 dirUpPos = gameObject.transform.position - (dirUp * gameObject.transform.localScale.y);

        Vector3 dirDown    = gameObject.transform.TransformDirection(Vector3.down);
        Vector3 dirDownPos = gameObject.transform.position - (dirDown * gameObject.transform.localScale.y);

        Vector3 dirForward    = gameObject.transform.TransformDirection(Vector3.forward);
        Vector3 dirForwardPos = gameObject.transform.position - (dirForward * gameObject.transform.localScale.z);

        Vector3 dirBack    = gameObject.transform.TransformDirection(Vector3.back);
        Vector3 dirBackPos = gameObject.transform.position - (dirBack * gameObject.transform.localScale.z);

        Vector3 dirLeft    = gameObject.transform.TransformDirection(Vector3.left);
        Vector3 dirLeftPos = gameObject.transform.position - (dirLeft * gameObject.transform.localScale.x);

        Vector3 dirRight    = gameObject.transform.TransformDirection(Vector3.right);
        Vector3 dirRightPos = gameObject.transform.position - (dirRight * gameObject.transform.localScale.x);


        yPosPlane.SetValues(dirUp, dirUpPos);
        yNegPlane.SetValues(dirDown, dirDownPos);

        zPosPlane.SetValues(dirForward, dirForwardPos);
        zNegPlane.SetValues(dirBack, dirBackPos);

        xPosPlane.SetValues(dirLeft, dirLeftPos);
        xNegPlane.SetValues(dirRight, dirRightPos);

        if (data != null)
        {
            List <TriangleData> tris = data.getTrianglesInOOBB(oobb);

            //Debug.Log(tris.Count);

            Vector3 lineInt = new Vector3();

            for (int i = 0; i < tris.Count; i++)
            {
                Vector3[] pts = tris[i].getTransformedPoints();

                Vector3 point1 = pts[0];
                Vector3 point2 = pts[1];
                Vector3 point3 = pts[2];

                Vector3 n = Vector3.Cross(point2 - point1, point3 - point1);
                n.Normalize();

                points.Clear();
                newTris.Clear();
                lpoints.Clear();

                if (TriangleTests.IntersectLineTriangle(ref oobb.oobbCoordsTrans[0], ref oobb.oobbCoordsTrans[1], ref point1, ref point2, ref point3, ref lineInt))
                {
                    lpoints.Add(lineInt);
                }
                if (TriangleTests.IntersectLineTriangle(ref oobb.oobbCoordsTrans[0], ref oobb.oobbCoordsTrans[2], ref point1, ref point2, ref point3, ref lineInt))
                {
                    lpoints.Add(lineInt);
                }
                if (TriangleTests.IntersectLineTriangle(ref oobb.oobbCoordsTrans[0], ref oobb.oobbCoordsTrans[4], ref point1, ref point2, ref point3, ref lineInt))
                {
                    lpoints.Add(lineInt);
                }
                if (TriangleTests.IntersectLineTriangle(ref oobb.oobbCoordsTrans[1], ref oobb.oobbCoordsTrans[3], ref point1, ref point2, ref point3, ref lineInt))
                {
                    lpoints.Add(lineInt);
                }
                if (TriangleTests.IntersectLineTriangle(ref oobb.oobbCoordsTrans[1], ref oobb.oobbCoordsTrans[5], ref point1, ref point2, ref point3, ref lineInt))
                {
                    lpoints.Add(lineInt);
                }
                if (TriangleTests.IntersectLineTriangle(ref oobb.oobbCoordsTrans[2], ref oobb.oobbCoordsTrans[6], ref point1, ref point2, ref point3, ref lineInt))
                {
                    lpoints.Add(lineInt);
                }
                if (TriangleTests.IntersectLineTriangle(ref oobb.oobbCoordsTrans[2], ref oobb.oobbCoordsTrans[3], ref point1, ref point2, ref point3, ref lineInt))
                {
                    lpoints.Add(lineInt);
                }
                if (TriangleTests.IntersectLineTriangle(ref oobb.oobbCoordsTrans[3], ref oobb.oobbCoordsTrans[7], ref point1, ref point2, ref point3, ref lineInt))
                {
                    lpoints.Add(lineInt);
                }
                if (TriangleTests.IntersectLineTriangle(ref oobb.oobbCoordsTrans[4], ref oobb.oobbCoordsTrans[5], ref point1, ref point2, ref point3, ref lineInt))
                {
                    lpoints.Add(lineInt);
                }
                if (TriangleTests.IntersectLineTriangle(ref oobb.oobbCoordsTrans[4], ref oobb.oobbCoordsTrans[6], ref point1, ref point2, ref point3, ref lineInt))
                {
                    lpoints.Add(lineInt);
                }
                if (TriangleTests.IntersectLineTriangle(ref oobb.oobbCoordsTrans[5], ref oobb.oobbCoordsTrans[7], ref point1, ref point2, ref point3, ref lineInt))
                {
                    lpoints.Add(lineInt);
                }
                if (TriangleTests.IntersectLineTriangle(ref oobb.oobbCoordsTrans[6], ref oobb.oobbCoordsTrans[7], ref point1, ref point2, ref point3, ref lineInt))
                {
                    lpoints.Add(lineInt);
                }

                NDPlane.IntersectSixPlanesTriangle(xPosPlane, xNegPlane, yPosPlane, yNegPlane, zPosPlane, zNegPlane, ref point1, ref point2, ref point3, lpoints);
                NDPlane.SideOfSixPlanesFilter(xPosPlane, xNegPlane, yPosPlane, yNegPlane, zPosPlane, zNegPlane, lpoints, points);

                HullTests.ConvexHull2DTriangulated(points, newTris, ref n);

                for (int j = 0; j < newTris.Count; j += 3)
                {
                    Vector3 v1 = newTris[j + 0];
                    Vector3 v2 = newTris[j + 1];
                    Vector3 v3 = newTris[j + 2];

                    float   tolerance = layer * offset;
                    Vector3 dist      = n * tolerance;

                    v1 = v1 + dist;
                    v2 = v2 + dist;
                    v3 = v3 + dist;

                    int vec1 = 0;
                    int vec2 = 0;
                    int vec3 = 0;

                    // point is new, compute new UV coordinates for it
                    if (!NearestPointTest.approxContains(vertexPoints, v1, tolerance, ref vec1))
                    {
                        Vector3 transVec = gameObject.transform.InverseTransformPoint(vertexPoints[vec1]);

                        if (!cubeMap)
                        {
                            uvPoints.Add(new Vector2((transVec.y + 1) / 2, (transVec.z + 1) / 2));
                        }
                        else
                        {
                            uvPoints.Add(HullTests.CubeMap3DV(ref transVec, ref n));
                        }
                    }

                    if (!NearestPointTest.approxContains(vertexPoints, v2, tolerance, ref vec2))
                    {
                        Vector3 transVec = gameObject.transform.InverseTransformPoint(vertexPoints[vec2]);

                        if (!cubeMap)
                        {
                            uvPoints.Add(new Vector2((transVec.y + 1) / 2, (transVec.z + 1) / 2));
                        }
                        else
                        {
                            uvPoints.Add(HullTests.CubeMap3DV(ref transVec, ref n));
                        }
                    }

                    if (!NearestPointTest.approxContains(vertexPoints, v3, tolerance, ref vec3))
                    {
                        Vector3 transVec = gameObject.transform.InverseTransformPoint(vertexPoints[vec3]);

                        if (!cubeMap)
                        {
                            uvPoints.Add(new Vector2((transVec.y + 1) / 2, (transVec.z + 1) / 2));
                        }
                        else
                        {
                            uvPoints.Add(HullTests.CubeMap3DV(ref transVec, ref n));
                        }
                    }


                    //Debug.Log(vertexPoints.Count + " " + vec1 + " " + vec2 + " " + vec3);
                    if (HullTests.IsTriClockwise(vertexPoints[vec1], vertexPoints[vec2], vertexPoints[vec3], n))
                    {
                        indexPoints.Add(vec1);
                        indexPoints.Add(vec2);
                        indexPoints.Add(vec3);
                    }
                    else
                    {
                        indexPoints.Add(vec1);
                        indexPoints.Add(vec3);
                        indexPoints.Add(vec2);
                    }
                }
            }
        }
    }