Example #1
0
    void Move()
    {
        var curveX = new CatmullRomCurve(points.Select(vec => vec.x).ToArray());
        var curveY = new CatmullRomCurve(points.Select(vec => vec.y).ToArray());

        StartCoroutine(Move(curveX, curveY));
    }
        List <TreeSegment> BuildSegments(TreeData data, float fromRadius, float toRadius, Vector3 normal, Vector3 binormal)
        {
            var segments = new List <TreeSegment>();

            var points = new List <Vector3>();

            var length = (to - from).magnitude;
            var bend   = length * (normal * data.RandomBendDegree + binormal * data.RandomBendDegree);

            points.Add(from);
            points.Add(Vector3.Lerp(from, to, 0.25f) + bend);
            points.Add(Vector3.Lerp(from, to, 0.75f) + bend);
            points.Add(to);

            var curve = new CatmullRomCurve(points);

            var frames = curve.ComputeFrenetFrames(data.heightSegments, normal, binormal, false);

            for (int i = 0, n = frames.Count; i < n; i++)
            {
                var u      = 1f * i / (n - 1);
                var radius = Mathf.Lerp(fromRadius, toRadius, u);

                var position = curve.GetPointAt(u);
                var segment  = new TreeSegment(frames[i], position, radius);
                segments.Add(segment);
            }
            return(segments);
        }
Example #3
0
    /// <summary>
    /// Calculate the catmull-rom segments. Also estimates the curve's length.
    /// </summary>
    /// <param name="N">The number sample points used to estimate each segment's length.</param>
    public override void CalculateSegments(int N = 100)
    {
        lastSampleSize = N;

        segmentCount = (points.Length - 1);
        lengths      = new float[segmentCount];

        segments = new CatmullRomCurve[segmentCount];

        startHandle = 2 * points[0] - points[1];
        endHandle   = 2 * points[segmentCount] - points[segmentCount - 1];

        Length = 0;
        for (var i = 0; i < segmentCount; i++)
        {
            segments[i] = new CatmullRomCurve(
                i == 0 ? startHandle : points[i - 1],
                points[i],
                points[i + 1],
                (i + 1) == segmentCount ? endHandle : points[i + 2],
                Alpha
                );

            Length    += segments[i].EstimateLength(N);
            lengths[i] = Length;
        }
    }
Example #4
0
 void OnEnable()
 {
     style.fontStyle        = FontStyle.Bold;
     style.normal.textColor = Color.white;
     _target = (Curve)target;
     _curve  = _target.GetWorldSpaceCurve();
     Undo.undoRedoPerformed += OnUndo;
 }
Example #5
0
        private void BuildEye(float openAmount)
        {
            var count    = 32;
            var left     = new Vector2(-100, 0);
            var right    = -left;
            var basePull = new Vector2(0, openAmount);
            var curves   = new CatmullRomCurve[6];
            // top curve
            var topPull = basePull - lookOffset * 5 * openAmount;

            curves[0] = CatmullRomCurve.Create(count,
                                               topPull,
                                               left,
                                               right,
                                               topPull);

            // bottom curve
            var bottomPull = -basePull - lookOffset * 2 * openAmount;

            curves[1] = CatmullRomCurve.Create(count,
                                               bottomPull,
                                               left,
                                               right,
                                               bottomPull);

            CatmullRomCurve BuildIrisSegment(float progress, Vector2 pull)
            {
                var start = curves[0].GetPointAlong(progress);
                var end   = curves[1].GetPointAlong(progress);

                return(CatmullRomCurve.Create(count,
                                              pull,
                                              start,
                                              end,
                                              pull));
            }

            var progressForIris = 0.4f * (this.aimTimer / 20 + 1);
            var pullFactor      = (1 + this.aimTimer);

            curves[2] = BuildIrisSegment(Math.Clamp(progressForIris + lookOffset.X, 0.2f, 0.8f), right * pullFactor);
            curves[3] = BuildIrisSegment(Math.Clamp(1 - progressForIris + lookOffset.X, 0.2f, 0.8f), left * pullFactor);

            this.eyeCurves = curves;
        }
Example #6
0
    IEnumerator Move(CatmullRomCurve curveX, CatmullRomCurve curveY)
    {
        float time = 0;

        transform.position = new Vector3(curveX.Calc(0).position, curveY.Calc(0).position, 0);
        transform.rotation = Quaternion.LookRotation(
            new Vector3(curveX.Calc(0).velocity, curveY.Calc(0).velocity, 0)
            );
        yield return(null);

        while ((time += Time.deltaTime) <= 10)
        {
            transform.position = new Vector3(curveX.Calc(time / 10).position, curveY.Calc(time / 10).position, 0);
            transform.rotation = Quaternion.LookRotation(
                new Vector3(curveX.Calc(time / 10).velocity, curveY.Calc(time / 10).velocity, 0)
                );
            yield return(null);
        }
    }
Example #7
0
    private void GenerateTube()
    {
        var controls = new List <Vector3>()
        {
            new Vector3(0, 0, 0),
            new Vector3(0, 0, grabDistance)
        };
        var curve = new CatmullRomCurve(controls);

        // Build tubular mesh with Curve
        int   tubularSegments = 40;
        float radius          = 0.001f;
        int   radialSegments  = 20;
        bool  closed          = false; // closed curve or not
        var   mesh            = Tubular.Tubular.Build(curve, tubularSegments, radius, radialSegments, closed);

        // visualize mesh
        var filter = GetComponent <MeshFilter>();

        filter.sharedMesh = mesh;
    }
Example #8
0
    public override void OnInspectorGUI()
    {
        _target.pathColor    = EditorGUILayout.ColorField("Path Color", _target.pathColor);
        _target.isLocal      = EditorGUILayout.Toggle("Is Local", _target.isLocal);
        _target.smoothAmount = EditorGUILayout.IntSlider("Smooth Amount", _target.smoothAmount, 1, 20);
        int newCount = EditorGUILayout.IntField("Node Count", _target.nodes.Count);

        //add node?
        if (newCount > _target.nodes.Count)
        {
            for (int i = 0; i < newCount - _target.nodes.Count; i++)
            {
                _target.nodes.Add(Vector3.zero);
            }
        }

        //remove node?
        if (newCount < _target.nodes.Count)
        {
            if (EditorUtility.DisplayDialog("Remove path node?", "Shortening the node list will permanently destroy parts of your path. This operation cannot be undone.", "OK", "Cancel"))
            {
                int removeCount = _target.nodes.Count - newCount;
                _target.nodes.RemoveRange(_target.nodes.Count - removeCount, removeCount);
            }
        }

        //node display:
        for (int i = 0; i < _target.nodes.Count; i++)
        {
            _target.nodes[i] = EditorGUILayout.Vector3Field("Node " + (i + 1), _target.nodes[i]);
        }


        if (GUI.changed)
        {
            _curve = _target.GetWorldSpaceCurve();
            EditorUtility.SetDirty(_target);
        }
    }
Example #9
0
        public override void Draw(SpriteBatch spriteBatch)
        {
            var curve = CatmullRomCurve.Create(25,
                                               transform.ChildAt(0).transform.Position,
                                               transform.ChildAt(1).transform.Position,
                                               transform.ChildAt(2).transform.Position,
                                               transform.ChildAt(3).transform.Position);

            for (int i = 0; i < curve.Count - 1; i++)
            {
                if (this.time > i && this.time < i + 1)
                {
                    spriteBatch.DrawCircle(new CircleF(curve.points[i], 5f), 3, Color.White, 1f, transform.Depth);
                }
            }

            if (time > curve.Count)
            {
                time = 0;
            }

            curve.Draw(spriteBatch, Vector2.Zero, transform.Depth, 1f);
        }
 public void SetCurve(CatmullRomCurve pCurve)
 {
     _curve = pCurve;
 }
 public void SetCurve(CatmullRomCurve pCurve, float pProgress)
 {
     _curve    = pCurve;
     _progress = pProgress;
     transform.localPosition = _curve.GetPointOnPath(pProgress);
 }
Example #12
0
 public CatmullRomCurveVector3(Vector3[] points)
 {
     curveX = new CatmullRomCurve(points.Select(point => point.x).ToArray());
     curveY = new CatmullRomCurve(points.Select(point => point.y).ToArray());
     curveZ = new CatmullRomCurve(points.Select(point => point.z).ToArray());
 }
Example #13
0
 public void UpdateToWorldSpaceCurve(CatmullRomCurve pCurveToUpdate)
 {
     pCurveToUpdate.SetPassThroughPoints(GetWorldPassThroughPoints());
 }
Example #14
0
 public void UpdateToLocalSpaceCurve(Transform pTransform, CatmullRomCurve pCurveToUpdate)
 {
     pCurveToUpdate.SetPassThroughPoints(GetLocalPassThroughPoints(pTransform));
 }
Example #15
0
    void OnSceneGUI()
    {
        if (_target.enabled)
        {
            if (_target.nodes.Count > 0)
            {
                bool dirty = false;

                //allow path adjustment undo:
                Undo.RecordObject(_target, "Adjust Curve");

                //node handle display:
                Vector3 newWorldPosition;
                Vector3 oldWorldPosition;

                for (int i = 0; i < _target.nodes.Count; i++)
                {
                    if (_target.isLocal)
                    {
                        oldWorldPosition = _target.transform.TransformPoint(_target.nodes[i]);
                    }
                    else
                    {
                        oldWorldPosition = _target.nodes[i];
                    }

                    if (i == 0)
                    {
                        Handles.Label(oldWorldPosition, "Begin", style);
                    }

                    if (i == _target.nodes.Count - 1)
                    {
                        Handles.Label(oldWorldPosition, "End", style);
                    }

                    newWorldPosition = Handles.PositionHandle(oldWorldPosition, Quaternion.identity);

                    if (newWorldPosition != oldWorldPosition)
                    {
                        dirty = true;
                    }

                    if (_target.isLocal)
                    {
                        _target.nodes[i] = _target.transform.InverseTransformPoint(newWorldPosition);
                    }
                    else
                    {
                        _target.nodes[i] = newWorldPosition;
                    }
                }

                if (dirty)
                {
                    _curve = _target.GetWorldSpaceCurve();
                }

                Vector3 prevPt = _curve.GetPointOnPath(0);
                Handles.color = _target.pathColor;
                int numLines = _target.nodes.Count * _target.smoothAmount;
                for (int i = 1; i <= numLines; i++)
                {
                    float   pm     = (float)i / numLines;
                    Vector3 currPt = _curve.GetPointOnPath(pm);
                    Handles.DrawLine(currPt, prevPt);
                    prevPt = currPt;
                }
            }
        }
    }
Example #16
0
 void OnUndo()
 {
     _curve = _target.GetWorldSpaceCurve();
 }