Example #1
0
 private void Start()
 {
     outCurve    = new SplineCurve();
     inCurve     = new SplineCurve();
     centerCurve = new SplineCurve();
     positions   = new List <Vector3>();
 }
Example #2
0
 public CurveSegement(Node _startNode, Node _endNode, SplineCurve _rootCurve)
 {
     startNode = _startNode;
     endNode   = _endNode;
     rootCurve = _rootCurve;
     c         = -5f;
 }
Example #3
0
 public void Start()
 {
     if (Path.IsCurved)
     {
         _splineCurve = new SplineCurve();
         UpdateCurvePoints();
     }
 }
Example #4
0
    private Vector2[] GetDivededPoints(int ind)
    {
        var     points   = new Vector2[11];
        var     pointInd = 0;
        var     indexes  = GetSplinePointIndexes(ind, true);
        Vector2 a        = paths[indexes[0]].transform.position;
        Vector2 b        = paths[indexes[1]].transform.position;
        Vector2 c        = paths[indexes[2]].transform.position;
        Vector2 d        = paths[indexes[3]].transform.position;

        for (float t = 0; t <= 1.001f; t += 0.1f)
        {
            points[pointInd++] = SplineCurve.GetPoint(a, b, c, d, t);
        }
        return(points);
    }
Example #5
0
    public override void Init()
    {
        outCurve    = new SplineCurve();
        inCurve     = new SplineCurve();
        centerCurve = new SplineCurve();
        positions   = new List <Vector3>();

        GameObject obj = GameObject.CreatePrimitive(PrimitiveType.Cube);

        meshFilter = obj.GetComponent <MeshFilter>();
        obj.GetComponent <MeshRenderer>().material.color = Color.cyan;

        GameObject.CreatePrimitive(PrimitiveType.Plane).transform.localScale = new Vector3(50, 1, 50);
        Camera.main.transform.position         = new Vector3(-118, 179, -115);
        Camera.main.transform.localEulerAngles = new Vector3(60, 45, 0);
    }
Example #6
0
    public void CreateNode(SplineComponent splineComponent)
    {
        GameObject controlPoint = new GameObject("ControlPoint");

        // Add the splineComponent component
        controlPoint.AddComponent <ControlPointComponent>();

        SplineCurve splineCurve    = splineComponent.GetSplineObject();
        Vector3     targetPosition = Vector3.one;

        Vector3[] controlPoints           = splineCurve.controlPoints;
        int       cpLength                = controlPoints.Length;
        int       controlPointsPerSegment = splineComponent.GetControlPointsPerSegment();

        if (cpLength >= controlPointsPerSegment)
        {
            // extrapolate the position from the last two points
            targetPosition = controlPoints[cpLength - 1] + (controlPoints[cpLength - 1] - controlPoints[cpLength - controlPointsPerSegment]);
        }
        controlPoint.transform.position = targetPosition;
        controlPoint.transform.parent   = splineComponent.transform;
    }
Example #7
0
    private void CalculateNewBeam(ref Transform endPointBeam)
    {
        //sets the collider to the new pos on the z axis, and obtains its x pos to be used later.
        Vector3 newPos = endPointBeam.localPosition;

        newPos.z = newBeamEndPoint + Vector3.Dot(this.transform.GetChild(this.transform.childCount - 1).position, -this.transform.forward);
        newPos.y = 0;

        endPointBeam.position = newPos;

        //for this spline implementation last two are always end point, first two are always start point, sub all in the middle for average values between the two
        SplineCurve lightCurve         = this.transform.GetChild(this.transform.childCount - 1).GetComponent <SplineCurve>();
        int         totalControlPoints = lightCurve.controlPoints.Count;

        Vector3        startPoint = lightCurve.controlPoints[0];
        List <Vector3> midPoints  = new List <Vector3>();
        Vector3        endPoint   = endPointBeam.position;

        //only the difference in the z axis is required, zeroing out the x axis is, therfore, important to keep things consistant, no matter where this object is placed, spawned.
        endPoint.x = 0;

        //new middle points cal, finds the amount required, based on the amount of control points that exist on that lightbeam
        float middlePoints = (totalControlPoints - 4);
        //finds the average number based on the amount of control points needed
        Vector3 difference = endPoint - startPoint;

        difference = (difference / middlePoints) / 2.0f;

        for (int i = 2; i < middlePoints + 2; i++)
        {
            midPoints.Add(difference * (i - 1));
        }
        //destroys old default lightbeam, and creates a new one, with custom points
        lineBeam.ToggleBeam();
        lineBeam.ToggleCustomBeam(startPoint, midPoints, endPoint);
    }
    public void DoUpdateSpline()
    {
        List <Vector3> controlPoints = new List <Vector3>();
        List <Vector3> tangents      = new List <Vector3>();
        List <float>   time          = new List <float>();
        float          lastTime      = 0;

        for (int i = 0; i < transform.childCount; i++)
        {
            ControlPointComponent controlPointComp = transform.GetChild(i).gameObject.GetComponent <ControlPointComponent>();
            if (controlPointComp != null)
            {
                controlPoints.Add(controlPointComp.position);
                tangents.Add(controlPointComp.tangent);
                // if illegal time detected, then autoadjust
                if (lastTime >= controlPointComp.time)
                {
                    controlPointComp.time += lastTime + 1;
                }
                lastTime = controlPointComp.time;
                time.Add(controlPointComp.time);
            }
        }

        switch (splineType)
        {
        case SplineType.LinearSpline: {
            LinearSplineCurve lSpline = new LinearSplineCurve();
            spline = lSpline;
            spline.lengthPrecision = lengthPrecision;
            lSpline.Init(controlPoints.ToArray(), time.ToArray());
        }
        break;

        case SplineType.CatmullRom: {
            HermiteSplineCurve hSpline = new HermiteSplineCurve();
            spline = hSpline;
            spline.lengthPrecision = lengthPrecision;
            hSpline.InitCatmullRom(controlPoints.ToArray());
        }
        break;

        case SplineType.BezierSpline:
        case SplineType.BezierSmoothSpline:
            BezierSplineCurve bSpline = new BezierSplineCurve();
            spline = bSpline;
            spline.lengthPrecision = lengthPrecision;
            switch (splineType)
            {
            case SplineType.BezierSpline:
                bSpline.Init(controlPoints.ToArray());
                break;

            case SplineType.BezierSmoothSpline:
                bSpline.InitSmoothTangents(controlPoints.ToArray());
                break;
            }
            break;
        }

        // hack to make the editor update the obejct
        Vector3 p = transform.position;

        transform.position = Vector3.zero;
        if (p.sqrMagnitude > 0)
        {
            transform.position = p;
        }

        updated = true;
    }
Example #9
0
    public override void OnUpdate()
    {
        MouseLeft();

        // 路面创建测试
        if (Input.GetKeyDown(KeyCode.K))
        {
            List <Vector3> points_out = new List <Vector3>();
            List <Vector3> points_in  = new List <Vector3>();
            Vector3        dirr;

            dirr = PhysicsMath.GetHorizontalDir(positions[1] - positions[0]);
            points_in.Add(positions[0] + dirr * 4);
            points_out.Add(positions[0] - dirr * 4);

            for (int i = 1; i < positions.Count - 1; i++)
            {
                dirr = PhysicsMath.GetHorizontalDir(positions[i + 1] - positions[i - 1]);
                points_in.Add(positions[i] + dirr * 4);
                points_out.Add(positions[i] - dirr * 4);
            }

            dirr = PhysicsMath.GetHorizontalDir(positions[positions.Count - 1] - positions[positions.Count - 2]);
            points_in.Add(positions[positions.Count - 1] + dirr * 4);
            points_out.Add(positions[positions.Count - 1] - dirr * 4);

            for (int i = 0; i < positions.Count; i++)
            {
                outCurve.AddNode(points_out[i], c);
                inCurve.AddNode(points_in[i], c);
                centerCurve.AddNode(positions[i], c);
            }
            outCurve.AddCatmull_RomControl();
            inCurve.AddCatmull_RomControl();
            centerCurve.AddCatmull_RomControl();


            for (int i = 0; i < outCurve.segmentList.Count; i++)
            {
                float add = 1f / 20;
                for (float j = 0; j < 1; j += add)
                {
                    Vector3 point = centerCurve.segmentList[i].GetPoint(j);
                    path.Add(point);
                    objs.Add(Utility.CreatPrimitiveType(PrimitiveType.Sphere, Color.red, point, 1));

                    //point = outCurve.segmentList[i].GetPoint(j);
                    //path.Add(point);
                    //objs.Add(Utility.CreatPrimitiveType(PrimitiveType.Sphere, point, 1, Color.red));

                    //point = inCurve.segmentList[i].GetPoint(j);
                    //path.Add(point);
                    //objs.Add(Utility.CreatPrimitiveType(PrimitiveType.Sphere, point, 1, Color.red));
                }
            }

            CreateRoads(Terrain.activeTerrain, meshFilter, path, 6);
        }
        if (Input.GetKeyDown(KeyCode.C))
        {
            meshFilter.mesh.Clear();
            objs.ForEach((a) => { Object.Destroy(a); });
            objs.Clear();
            outCurve    = new SplineCurve();
            inCurve     = new SplineCurve();
            centerCurve = new SplineCurve();
            positions.Clear();
            path.Clear();
        }

        if (Input.GetKeyDown(KeyCode.J))
        {
            hit = Utility.SendRay(LayerMask.GetMask("Terrain"));
        }


        // 刷新地图
        if (Input.GetKeyDown(KeyCode.L))
        {
            //TerrainUtility.Refresh();
        }
    }