Ejemplo n.º 1
0
    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);
    }
Ejemplo n.º 2
0
    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;
                }
            }
        }
    }