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.GetRandomBendDegree() + binormal * data.GetRandomBendDegree()); 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); }