public static Vector3 GetBezierTangent(BulletPathPoint point, BulletPathPoint nextpoint, float t) { float u = 1 - t; float tt = t * t; float tu = t * u; float uu = u * u; Vector3 p = -3 * uu * point.position; p += 3 * (uu - 2 * tu) * point.OutTangentPos; p += 3 * (2 * tu - tt) * nextpoint.InTangentPos; p += 3 * tt * nextpoint.position; return(p.normalized); }
public static Vector3 GetBezierPoint(BulletPathPoint point, BulletPathPoint nextpoint, float t) { float u = 1 - t; float tt = t * t; float uu = u * u; float uuu = uu * u; float ttt = tt * t; Vector3 p = uuu * point.position; p += 3 * uu * t * point.OutTangentPos; p += 3 * u * tt * nextpoint.InTangentPos; p += ttt * nextpoint.position; return(p); }
private void DrawScenePoint() { BulletPathPoint[] points = path.points; int numpos = points.Length; Quaternion handleRotation = Quaternion.identity; for (int i = 0; i < numpos; i++) { int pointIndex = i * 3; Handles.color = Color.green; BulletPathPoint pathpoint = points[i]; Vector3 position = GetWorldPosition(pathpoint.position); float pointHandleSize = HandleUtility.GetHandleSize(position) * 0.04f; float pointPickSize = pointHandleSize * 0.7f; Handles.Label(position, "Point " + i); if (Handles.Button(position, handleRotation, pointHandleSize, pointPickSize, Handles.DotHandleCap)) { selectedIndex = pointIndex; if (Selection.activeObject != target) { Selection.activeObject = target; } } if (selectedIndex == pointIndex) { EditorGUI.BeginChangeCheck(); var worldpos = GetWorldPosition(pathpoint.position); var pos = Handles.PositionHandle(worldpos, handleRotation); if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(path, "modity position"); points[i].position = GetLocalPosition(pos); return; } } Handles.color = Color.gray; int inIndex = pointIndex - 1; int outIndex = pointIndex + 1; if (selectedIndex < 0 || selectedIndex < inIndex || selectedIndex > outIndex) { continue; } if (i != 0) { var tangent = GetWorldPosition(pathpoint.InTangentPos); Handles.DrawLine(position, tangent); if (Handles.Button(tangent, handleRotation, pointHandleSize, pointPickSize, Handles.DotHandleCap)) { selectedIndex = inIndex; } EditorGUI.BeginChangeCheck(); var pos = Handles.PositionHandle(tangent, handleRotation); if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(path, "modity tangent"); points[i].InTangentPos = GetLocalPosition(pos); return; } } if (i != numpos - 1) { var tangent = GetWorldPosition(pathpoint.OutTangentPos); Handles.DrawLine(position, tangent); if (Handles.Button(tangent, handleRotation, pointHandleSize, pointPickSize, Handles.DotHandleCap)) { selectedIndex = outIndex; } EditorGUI.BeginChangeCheck(); var pos = Handles.PositionHandle(tangent, handleRotation); if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(path, "modity tangent"); points[i].OutTangentPos = GetLocalPosition(pos); return; } } } }