예제 #1
0
    public static void create(string name, List <Vector2> verticesList, float height, float width, float zOffset)
    {
        int   wallpoints = verticesList.Count;
        float wall       = width;

        //extrude the wall
        for (int i = wallpoints - 1; i >= 0; i--)
        {
            Vector2 extrudePoint;

            if (i == wallpoints - 1)
            {
                Vector2 lot = verticesList[i - 1] - verticesList[i];
                lot = new Vector2(-lot.y, lot.x);
                lot.Normalize();
                extrudePoint = verticesList[i] + lot * wall;
            }
            else if (i == 0)
            {
                Vector2 lot = verticesList[0] - verticesList[1];
                lot = new Vector2(-lot.y, lot.x);
                lot.Normalize();
                extrudePoint = verticesList[0] + lot * wall;
            }
            else
            {
                float angle = Vector2.Angle(verticesList[i] - verticesList[i - 1], verticesList[i] - verticesList[i + 1]);

                float thickness;

                if (Mathf.Cos(angle / 2) != 0)
                {
                    thickness = wall / Mathf.Sin(angle * Mathf.Deg2Rad / 2);
                }
                else
                {
                    thickness = 100;
                }

                Vector3 cross = Vector3.Cross(verticesList[i] - verticesList[i - 1], verticesList[i] - verticesList[i + 1]);
                if (cross.z > 0)
                {
                    angle = 360 - angle;
                }

                Vector2 lot = verticesList[i] - verticesList[i + 1];
                lot = Quaternion.AngleAxis(angle / 2, Vector3.forward) * lot;
                lot.Normalize();

                extrudePoint = verticesList[i] + lot * thickness;
            }

            verticesList.Add(extrudePoint);
        }

        GeometryLoader gl = GameObject.Find("GeometryLoader").GetComponent <GeometryLoader> ();

        ExtrudeGeometry.create(name, verticesList, height, zOffset, gl.theme.getWallsMaterial(), gl.theme.getWallsMaterialST());
    }
    void Update()
    {
        // star path
        List <Vector2> pts     = new List <Vector2>();
        List <Vector2> normals = new List <Vector2>();

        for (int i = 0; i < numPts * 2; i++)
        {
            int   l = i % 2 == 1 ? 10 : 20;
            float a = (float)i / numPts * Mathf.PI;
            pts.Add(new Vector2(Mathf.Cos(a) * l, Mathf.Sin(a) * l));
        }

        for (int i = 0; i < pts.Count; i++)
        {
            int     endI = (i == pts.Count - 1) ? 0 : i + 1;
            Vector2 vec  = pts[endI] - pts[i];
            vec.Normalize();
            normals.Add(new Vector2(vec.y, -vec.x));
        }

        startShape = new Shape(pts, normals);

        // random path
        List <Vector3> randomPoints = new List <Vector3>();
        float          time         = Time.time * speedAmp;

        for (int i = 0; i < 20; i++)
        {
            float t = 2.0f * i + time;
            randomPoints.Add(new Vector3((i) * 50, 50 * Mathf.Sin(t), 0));
            //randomPoints.Add( new Vector3( ( i ) * 50, 0, 0 ) );
        }

        randomSpline = new SplineCurve3(randomPoints);
        List <Vector3> extrudePts = randomSpline.getSpacedPoints(step);

        for (int i = 0; i < extrudePts.Count; i++)
        {
            Vector3 pt = extrudePts[i];
            Debug.DrawRay(pt, Vector3.one * 2.0f, Color.yellow);
        }

//		extrudeSettings = new THREE.ExtrudeGeometry.Option();
        extrudeSettings.steps        = step;
        extrudeSettings.bevelEnabled = false;
        extrudeSettings.extrudePath  = randomSpline;
        extrudeSettings.frames       = new THREE.TubeGeometry.FrenetFrames(randomSpline, step, false);

//		THREE.Geometry extrudeGeo = new THREE.ExtrudeGeometry( new List<Shape>(new Shape[]{ startShape }), extrudeSettings );
//		if(shapeAndHole == null){
        shapeAndHole = ExtrudeGeometry.GetShapeAndHoleObject(startShape, extrudeSettings);
//		}
        extrudeGeo.UpdateShape(shapeAndHole, extrudeSettings);

        UnityEngine.Mesh mesh = extrudeGeo.CreateAndGetMesh();
        meshFilter.mesh = mesh;
    }
    public static void create(string name, List <Vector2> verticesList, float height)
    {
        Material topMaterial;
        Material sideMaterial;

        GeometryLoader gl = GameObject.Find("GeometryLoader").GetComponent <GeometryLoader>();

        if (height <= 4.0)
        {
            sideMaterial = gl.theme.getBoxMaterial();
            topMaterial  = gl.theme.getBoxMaterial();
        }
        else
        {
            topMaterial  = gl.theme.getRoofMaterial();
            sideMaterial = gl.theme.getHouseMaterial();
            sideMaterial.SetTextureScale("_MainTex", gl.theme.getTextureScaleForHeight((float)height));
        }

        ExtrudeGeometry.create(name, verticesList, height, topMaterial, sideMaterial);
    }