Skip to content

Instantly share code, notes, and snippets.

@SLIB53
Last active September 9, 2015 15:52
Show Gist options
  • Save SLIB53/8b550ef3fdfa74499d14 to your computer and use it in GitHub Desktop.
Save SLIB53/8b550ef3fdfa74499d14 to your computer and use it in GitHub Desktop.
using UnityEngine;
[ExecuteInEditMode]
public class BezierTension : MonoBehaviour
{
#region Pretend you never saw this
public Transform Initial;
public Transform Mid;
public Transform End;
[Range(0F, 1F)]
public float t;
[Range(0F, 1F)]
public float Tension;
public Transform TestObj;
private Vector3 StartPoint { get { return Initial.position; } }
private Vector3 MidPoint { get { return Mid.position; } }
private Vector3 EndPoint { get { return End.position; } }
private void Update()
{
TestObj.position =
QuadraticBezier(StartPoint, MidPoint, EndPoint, t, Tension);
for (float tense = 0F; tense <= 1F; tense += 0.09F)
{
float innerTension = tense * Tension;
const int numVertices = 50;
for (int i = 0; i < numVertices; i++)
{
var vertsStart = (float)i / numVertices;
var vertsEnd = (float)(i + 1) / numVertices;
Debug.DrawLine(
QuadraticBezier(StartPoint, MidPoint, EndPoint, vertsStart, innerTension),
QuadraticBezier(StartPoint, MidPoint, EndPoint, vertsEnd, innerTension),
Color.red);
Debug.DrawLine(
QuadraticBezier(StartPoint, MidPoint, EndPoint, vertsStart, 0F),
QuadraticBezier(StartPoint, MidPoint, EndPoint, vertsStart, innerTension),
Color.blue);
}
}
}
#endregion
public static Vector3 QuadraticBezier(
Vector3 startPoint,
Vector3 midPoint,
Vector3 endPoint,
float t,
float tension)
{
//// Calc Bezier
var a = Vector3.Lerp(startPoint, midPoint, t);
var b = Vector3.Lerp(midPoint, endPoint, t);
var normalBezierResult = Vector3.Lerp(a, b, t);
var finalTension = (-Mathf.Pow(2 * t - 1, 2F) + 1) * (0.85F * tension);
var tenseBezierResult = Vector3.Lerp(normalBezierResult, midPoint, finalTension);
return tenseBezierResult;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment