Exemplo n.º 1
0
    public virtual void DrawMesh()
    {
        List <Vector3> meshPoints = new List <Vector3>();

        mesh.Clear();
        int[]     newTriangles;
        Vector2[] newUVs;
        int       counter = 0;

        DetectCornerPoints(ref meshPoints);
        ClockwiseComparer cc = new ClockwiseComparer(transform.position);

        meshPoints.Sort(cc);                      //sorting the points found clockwise

        meshPoints.Insert(0, transform.position); //inserting center point at zero index, this will be a vertex of every triangle

        newUVs = new Vector2[meshPoints.Count];
        CreateUVs(ref newUVs, meshPoints);

        //triangle vertices array has to be a multiple of 3, each set of 3 elements forms one triangle
        newTriangles = new int[(meshPoints.Count - 1) * 3];

        for (int i = 1; i < meshPoints.Count - 1; i++)
        {
            newTriangles[counter++] = 0;
            newTriangles[counter++] = i;
            newTriangles[counter++] = i + 1;
        }

        //forming a final triangle using the last vertex and the first
        newTriangles[counter++] = 0;
        newTriangles[counter++] = meshPoints.Count - 1;
        newTriangles[counter]   = 1;

        mesh.vertices  = meshPoints.ToArray();
        mesh.triangles = newTriangles;
        mesh.uv        = newUVs;
        meshObject.GetComponent <MeshFilter>().mesh = mesh;
    }
Exemplo n.º 2
0
        public void ClockwiseComparerTests()
        {
            var asteroids = new List <Point>
            {
                new Point(11, 1),
                new Point(9, 2),
                new Point(10, 0),
                new Point(9, 1),
                new Point(9, 0),
                new Point(8, 1),
            };
            var clockwiseComparer = new ClockwiseComparer(new Point(8, 3));

            asteroids.Sort(clockwiseComparer);

            Assert.Collection(asteroids,
                              a => Assert.Equal(new Point(8, 1), a),
                              a => Assert.Equal(new Point(9, 0), a),
                              a => Assert.Equal(new Point(9, 1), a),
                              a => Assert.Equal(new Point(10, 0), a),
                              a => Assert.Equal(new Point(9, 2), a),
                              a => Assert.Equal(new Point(11, 1), a));
        }
Exemplo n.º 3
0
        void Start()
        {
            if (type != TypePolygon.BOX_COLLIDER)
            {
                mesh = GetComponent <MeshFilter>().sharedMesh;
                Vector3[] vertices = mesh.vertices;
                List <EdgeHelpers.Edge> boundaryPath = EdgeHelpers.GetEdges(mesh.triangles).FindBoundary().SortEdges();
                Vector2 v = new Vector2();

                for (int i = 0; i < boundaryPath.Count; i++)
                {
                    Vector3 offset = transform.position;
                    Vector3 pos    = vertices[boundaryPath[i].v1] + offset;
                    pos = ExtensionMethods.RotatePointAroundPivot(pos, transform.position, transform.rotation);
                    v.x = (float)System.Math.Round(pos.x, 1);
                    v.y = (float)System.Math.Round(pos.z, 1);

                    if (!contour.Contains(v))
                    {
                        contour.Add(v);
                    }
                }

                if (type == TypePolygon.CONCAVE)
                {
                    ch      = new ConcaveHull();
                    contour = ch.CalculateConcaveHull(contour, 3);
                    contour.RemoveAt(contour.Count - 1);
                    contour.Reverse();
                }

                else if (type == TypePolygon.CONVEX)
                {
                    Vector2           position = new Vector2(transform.position.x, transform.position.z);
                    ClockwiseComparer c        = new ClockwiseComparer(position);
                    contour.Sort(c);
                }
            }

            else if (type == TypePolygon.BOX_COLLIDER)
            {
                BoxCollider[] boxColliders = GetComponentsInChildren <BoxCollider>();
                for (int i = 0; i < boxColliders.Length; i++)
                {
                    float minX = boxColliders[i].transform.position.x -
                                 boxColliders[i].size.x * boxColliders[i].transform.lossyScale.x * 0.5f;
                    float minZ = boxColliders[i].transform.position.z -
                                 boxColliders[i].size.z * boxColliders[i].transform.lossyScale.z * 0.5f;
                    float maxX = boxColliders[i].transform.position.x +
                                 boxColliders[i].size.x * boxColliders[i].transform.lossyScale.x * 0.5f;
                    float maxZ = boxColliders[i].transform.position.z +
                                 boxColliders[i].size.z * boxColliders[i].transform.lossyScale.z * 0.5f;


                    Vector3 pos = new Vector3(maxX, transform.position.y, maxZ);
                    pos = ExtensionMethods.RotatePointAroundPivot(pos, transform.position, transform.rotation);
                    contour.Add(new Vector2(pos.x, pos.z));

                    pos = new Vector3(minX, transform.position.y, maxZ);
                    pos = ExtensionMethods.RotatePointAroundPivot(pos, transform.position, transform.rotation);
                    contour.Add(new Vector2(pos.x, pos.z));

                    pos = new Vector3(minX, transform.position.y, minZ);
                    pos = ExtensionMethods.RotatePointAroundPivot(pos, transform.position, transform.rotation);
                    contour.Add(new Vector2(pos.x, pos.z));

                    pos = new Vector3(maxX, transform.position.y, minZ);
                    pos = ExtensionMethods.RotatePointAroundPivot(pos, transform.position, transform.rotation);
                    contour.Add(new Vector2(pos.x, pos.z));
                }
            }

            foreach (var position2d in contour)
            {
                Vector3 p = new Vector3(position2d.x, 0, position2d.y);
                Instantiate(prefab, p, Quaternion.identity, transform);
            }

            if (type != TypePolygon.NONE)
            {
                for (int i = 0; i < contour.Count - 1; i++)
                {
                    Engine.Instance.AddObstacle(new Vector2(contour[i].x, contour[i].y), new Vector2(contour[i + 1].x, contour[i + 1].y));
                }
            }

            else
            {
                Debug.Log("No has establecido el tipo para el poligono: " + name);
            }
        }