精华内容
参与话题
问答
  • Unity中的动画曲线

    千次阅读 2019-06-04 20:33:25
    Unity中的动画曲线 Animation Curves on Imported Clips 动画曲线可以附加到动画导入设置的动画选项卡中的导入动画片段。 这些曲线允许您将额外的动画数据添加到导入的剪辑,这可以让您根据动画制作者的状态来动画...

    Unity中的动画曲线

    Animation Curves on Imported Clips

    动画曲线可以附加到动画导入设置的动画选项卡中的导入动画片段。

    这些曲线允许您将额外的动画数据添加到导入的剪辑,这可以让您根据动画制作者的状态来动画其他项目的时间。例如,在冰冷条件下的游戏中,可以使用额外的动画曲线来控制粒子系统的发射速率,以显示玩家在冷空气中的冷凝呼吸。

    要为导入的动画添加曲线,首先在项目视图中选择导入的动画文件,然后在检查器的导入设置中选择动画按钮。

    展开curves标题,然后单击加号图标将新曲线添加到当前动画片段。如果导入的动画文件分割为多个动画片段,则每个片段都可以有自己的自定义曲线。

    展开曲线标题,然后单击加号图标将新曲线添加到当前动画片段。如果导入的动画文件分割为多个动画片段,则每个片段都可以有自己的自定义曲线。
    曲线的X轴表示标准化时间,并且始终在0.0和1.0之间(分别对应于动画片段的开始和结束,而不管其持续时间)。
    在这里插入图片描述
    在这里插入图片描述
    动画曲线导入

    创建关键点:左键双击

    删除关键点:

    **(1)**鼠标移动至关键点上,右键->Delete Key。

    **(2)**左键单击关键点,然后按键盘上的delete

    **设置曲线类型:**鼠标移动至关键点上,右键->

    **Auto:**根据关键点自动设置曲线。

    **Free Smooth:**统一设置入切线和出切线

    **Flat:**入切线和出切线为水平

    **Broken:**分别设置入切线和出切线
    也可以选Left Tangent(入切线)或者Right Tangent(出切线)或者Both Tangents(两切线)。

    **Free:**自由曲线,与Broken效果基本一样。

    **Linear:**线性曲线

    **Constant:**之前一直是上个点的值,然后瞬间变为这个点的值。
    其中Auto最简单,Broken调整空间最大。曲线效果以绿线为准。

    **Loop:**曲线循环

    Pingpong: 曲线和该曲线上下翻转后的曲线循环

    **Clamp:**一直为端点的值。
    代码如下

    
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class Curve : MonoBehaviour
    {
        public AnimationCurve animationCurve;
        public Vector3 v3;
        // Start is called before the first frame update
        void Start()
        {
            v3 = transform.position;
        }
    
        // Update is called once per frame
        void Update()
        {
            transform.position = new Vector3(Time.time+v3.x, animationCurve.Evaluate(Time.time)+v3.y, v3.z);
        }
    }
    
    
    

    在这里插入图片描述把脚本挂载你想要的物体上就会按照你设置的这个曲线进行运动。

    展开全文
  • Unity 中贝塞尔曲线的实现

    千次阅读 2019-03-08 10:33:11
    贝塞尔曲线是最基本的曲线,一般用在计算机 图形学和 图像处理。贝塞尔曲线可以用来创建平滑的曲线的道路、 弯曲的路径就像 祖玛游戏、 弯曲型的河流等。 一条贝塞尔曲线是由一组定义的控制点 P0到 Pn,在 n 调用...

     

    一、简介

    贝塞尔曲线是最基本的曲线,一般用在计算机 图形学和 图像处理。贝塞尔曲线可以用来创建平滑的曲线的道路、 弯曲的路径就像 祖玛游戏、 弯曲型的河流等。

            一条贝塞尔曲线是由一组定义的控制点 P0到 Pn,在 n 调用它的顺序 (n = 1 为线性,2 为二次,等.)。第一个和最后一个控制点总是具有终结点的曲线;然而,中间两个控制点 (如果有的话) 一般不会位于曲线上 。

      (1)贝塞尔曲线包含两个控制点即 n = 2 称为线性的贝塞尔曲线

      (2)贝塞尔曲线包含三个控制点即 n = 3 称为二次贝塞尔曲线

      (3)贝塞尔曲线包含四个控制点即 n = 4,所以称为三次贝塞尔曲线。

       贝塞尔曲线返回点的贝塞尔函数,使用线性插值的概念作为基础。

     

    二、公式

    1.线性贝塞尔公式:

    给定点P0、P1,线性贝兹曲线只是一条两点之间的直线。这条线由下式给出:

    其等同于线性插值。

    效果图(文章中部分图片转载自CSDN):

    2.二次贝塞尔公式:

    二次方贝兹曲线的路径由给定点P0、P1、P2控制,这条线由下式给出:

    效果图:

    3.三次贝塞尔方程:

    P0、P1、P2、P3四个点在平面或在三维空间中定义了三次方贝兹曲线。曲线起始于P0走向P1,并从P2的方向来到P3。一般不会经过P1或P2;这两个点只是用来充当控制点。P0和P1之间的间距,决定了曲线在转而趋进P3之前,走向P2方向的“长度有多长”。

    曲线的参数形式为:

    效果图:

    4.一般参数形式的贝塞尔方程:

     N阶贝兹曲线可如下推断。给定点P0、P1、…、Pn,其贝兹曲线即:

    如上公式可如下递归表达: 用表示由点P0、P1、…、Pn所决定的贝兹曲线。

    TIPS:

    通过两个低阶的贝塞尔曲线插值的堆叠总能够获得更高阶的贝塞尔曲线,通俗的来说通过对两条低阶的贝塞尔曲线插值,你可以求得一条高一阶的贝塞尔曲线。

    比如:二次贝塞尔曲线是点对点的两个线性贝塞尔曲线的线性插值,三次贝塞尔曲线是两条二次贝塞尔曲线的线性插值。

    三、实现与应用

    效果图

    通过拖动四个球可以实现不同的曲线。以上是三次贝塞尔曲线。

    代码如下:

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    [RequireComponent(typeof(LineRenderer))]
    public class TripleBezier : MonoBehaviour {
    
        public Transform[] controlPoint;
        public LineRenderer lineRenderer;
    
        private int layerOrder = 0;
        //取样数
        private int _segmentNum = 5000;
    	void Start () {
    		if(!lineRenderer)
            {
                lineRenderer = GetComponent<LineRenderer>();
            }
            lineRenderer.sortingLayerID = layerOrder;
    	}
    	void Update () {
            DrawCurve();
    	}
        //画曲线
        void DrawCurve()
        {
                for (int i = 1; i < _segmentNum; i++)
                {
                    float t = i / (float)_segmentNum;
                    int nodeIndex = 0;
                    Vector3 pixel = CalculateCubicBezierPoint(t, controlPoint[nodeIndex].position, controlPoint[nodeIndex + 1].position,
                        controlPoint[nodeIndex + 2].position, controlPoint[nodeIndex + 3].position);
                    lineRenderer.positionCount = i;
                    lineRenderer.SetPosition(i - 1, pixel);
                }
        }
        //获得贝塞尔曲线的数组
        Vector3 CalculateCubicBezierPoint(float t, Vector3 p0, Vector3 p1, Vector3 p2,Vector3 p3)
        {
            float u = 1 - t;
            float uu = u * u;
            float uuu = u * u * u;
            float tt = t * t;
            float ttt = t * t * t;
            Vector3 p = p0 * uuu;
            p += 3 * p1 * t * uu;
            p += 3 * p2 * tt * u;
            p += p3 * ttt;
            return p;
    
        }
    }
    

    二次贝塞尔曲线实现代码如下:

    using UnityEngine;
    using System.Collections.Generic;
    [RequireComponent(typeof(LineRenderer))]
    public class Bezier : MonoBehaviour
    {
        public Transform[] controlPoints;
        public LineRenderer lineRenderer;
    
        private int layerOrder = 0;
        private int _segmentNum = 5000;
    
    
        void Start()
        {
            if (!lineRenderer)
            {
                lineRenderer = GetComponent<LineRenderer>();
            }
            lineRenderer.sortingLayerID = layerOrder;
        }
    
        void Update()
        {
    
            DrawCurve();
    
        }
    
        void DrawCurve()
        {
            for (int i = 1; i <= _segmentNum; i++)
            {
                float t = i / (float)_segmentNum;
                int nodeIndex = 0;
                Vector3 pixel = CalculateCubicBezierPoint(t, controlPoints[nodeIndex].position,
                    controlPoints[nodeIndex + 1].position, controlPoints[nodeIndex + 2].position);
                lineRenderer.positionCount = i;
                lineRenderer.SetPosition(i - 1, pixel);
            }
    
        }
    
        Vector3 CalculateCubicBezierPoint(float t, Vector3 p0, Vector3 p1, Vector3 p2)
        {
            float u = 1 - t;
            float tt = t * t;
            float uu = u * u;
    
            Vector3 p = uu * p0;
            p += 2 * u * t * p1;
            p += tt * p2;
    
            return p;
        }
    
    }

    二次贝塞尔工具类代码如下:

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class BezierUtils
    {
        /// <summary>
        /// 根据T值,计算贝塞尔曲线上面相对应的点
        /// </summary>
        /// <param name="t"></param>T值
        /// <param name="p0"></param>起始点
        /// <param name="p1"></param>控制点
        /// <param name="p2"></param>目标点
        /// <returns></returns>根据T值计算出来的贝赛尔曲线点
        private static Vector3 CalculateCubicBezierPoint(float t, Vector3 p0, Vector3 p1, Vector3 p2)
        {
            float u = 1 - t;
            float tt = t * t;
            float uu = u * u;
    
            Vector3 p = uu * p0;
            p += 2 * u * t * p1;
            p += tt * p2;
    
            return p;
        }
    
        /// <summary>
        /// 获取存储贝塞尔曲线点的数组
        /// </summary>
        /// <param name="startPoint"></param>起始点
        /// <param name="controlPoint"></param>控制点
        /// <param name="endPoint"></param>目标点
        /// <param name="segmentNum"></param>采样点的数量
        /// <returns></returns>存储贝塞尔曲线点的数组
        public static Vector3[] GetBeizerList(Vector3 startPoint, Vector3 controlPoint, Vector3 endPoint, int segmentNum)
        {
            Vector3[] path = new Vector3[segmentNum];
            for (int i = 1; i <= segmentNum; i++)
            {
                float t = i / (float)segmentNum;
                Vector3 pixel = CalculateCubicBezierPoint(t, startPoint,
                    controlPoint, endPoint);
                path[i - 1] = pixel;
                Debug.Log(path[i - 1]);
            }
            return path;
    
        }
    }

    以上参考自:http://www.cnblogs.com/msxh/p/6270468.html

    补充:LineRenderer

    画出不同颜色的线:

    1.先添加一个材质。

    2.再改颜色和alpha值。

     

     

    展开全文
  • 曲线生成的问题 如何根据空间中两点确定一条曲线 绘制的电线可以用鼠标点击 最终实现的效果如下: 现在我们来一一解决。 贝塞尔曲线 关于贝塞尔曲线的原理,讲解的文章很多,大多是列出公式,然后就提供代码,其实...

    绘制电线,分解出来就一下几个问题需解决:

    • 曲线生成的问题
    • 如何根据空间中两点确定一条曲线
    • 绘制的电线可以用鼠标点击

    最终实现的效果如下:
    最终效果
    现在我们来一一解决。

    贝塞尔曲线

    关于贝塞尔曲线的原理,讲解的文章很多,大多是列出公式,然后就提供代码,其实讲得大同小异,公式怎么来的也没整明白。如果要了解贝塞尔曲线的原理,推荐这篇文章贝塞尔曲线,讲得很透彻。

    以下是根据3点生成曲线的代码。

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class BezierUtils
    {
    /// <summary>
    /// 获取存储贝塞尔曲线点的数组
    /// </summary>
    /// <param name="startPoint"></param>起始点
    /// <param name="controlPoint"></param>控制点
    /// <param name="endPoint"></param>目标点
    /// <param name="segmentNum"></param>采样点的数量
    /// <returns></returns>存储贝塞尔曲线点的数组
    public static Vector3[] GetBeizerList(Vector3 startPoint, Vector3 controlPoint, Vector3 endPoint, int segmentNum)
    {
        Vector3[] path = new Vector3[segmentNum+1];
        path[0] = startPoint;
        for (int i = 1; i <= segmentNum; i++)
        {
            float t = i / (float)segmentNum;
            Vector3 pixel = CalculateCubicBezierPoint(t, startPoint,
                controlPoint, endPoint);
            path[i] = pixel;
        }
        return path;
    }
    
    /// <summary>
    /// 根据T值,计算贝塞尔曲线上面相对应的点
    /// </summary>
    /// <param name="t"></param>T值
    /// <param name="p0"></param>起始点
    /// <param name="p1"></param>控制点
    /// <param name="p2"></param>目标点
    /// <returns></returns>根据T值计算出来的贝赛尔曲线点
    private static Vector3 CalculateCubicBezierPoint(float t, Vector3 p0, Vector3 p1, Vector3 p2)
    {
        float u = 1 - t;
        float tt = t * t;
        float uu = u * u;
    
        Vector3 p = uu * p0;
        p += 2 * u * t * p1;
        p += tt * p2;
    
        return p;
    }
    }
    

    两点确定一条曲线

    首先要明确两点是确定不了一条曲线的!至少要3个点。你看贝塞尔曲线的脚本也有一个控制点,所以现在问题转换为如何通过两点找第三个控制点的问题。
    第三个点如何找呢?最简单的就是找两点连成线的中垂线,但是空间中一条线段的中垂线有无数条啊,你总得告诉我中垂线指向哪儿或者说在哪个平面上才能确定啊。对了,在哪个平面上?我们已经知道两条线段可以确定一个平面,且目前我们知道一条线段的两个点了,那再指定一个方向不就可以得出平面了吗。
    所以现在你要做的是人为指定一个方向
    所以,如何求出中垂线呢?
    在此之前需要理解一点:两个向量的叉乘得到的向量(法线)是垂直于两个向量所在平面的,即也垂直于这两个向量
    步骤如下:

    • 人为确定一个方向,如Vector3.up,然后叉乘得出该平面的法线
    • 法线再与线段叉乘得出该线段的垂线
    • 然后再算出线段的中点
      垂线知道,中点知道,中垂线不就出来了吗,哈哈哈哈。
    /// <summary>
    /// 获取控制点.
    /// </summary>
    /// <param name="startPos">起点.</param>
    /// <param name="endPos">终点.</param>
    /// <param name="offset">偏移量.</param>
    private Vector3 CalcControlPos(Vector3 startPos, Vector3 endPos, float offset)
    {
        //方向(由起始点指向终点)
        Vector3 dir = endPos - startPos;
        //取另外一个方向. 这里取向上.
        Vector3 otherDir = Vector3.up;
    
        //求平面法线.  注意otherDir与dir不能调换位置,平面的法线是有方向的,(调换位置会导致法线方向相反)
        //ps: 左手坐标系使用左手定则 右手坐标系使用右手定则 (具体什么是左右手坐标系这里不细说请Google)
        //unity中世界坐标使用的是左手坐标系,所以法线的方向应该用左手定则判断.
        Vector3 planeNormal = Vector3.Cross(otherDir, dir);
    
        //再求startPos与endPos的垂线. 其实就是再求一次叉乘.
        Vector3 vertical = Vector3.Cross(dir, planeNormal).normalized;
        //中点.
        Vector3 centerPos = (startPos + endPos) / 2f;
        //控制点.
        Vector3 controlPos = centerPos + vertical * offset;
    
        return controlPos;
    }
    

    可以在Scene窗口实时查看中垂线的方向,以便确认计算是否正确,代码如下

    private void OnDrawGizmos()
    {
        if(endPos == null)
        {
            Awake();
        }
        //方向(由起始点指向终点)
        Vector3 dir = endPos.position - startPos.position;
        //取另外一个方向. 这里取向上.
        Vector3 otherDir = Vector3.up;
    
        //求平面法线.  注意otherDir与dir不能调换位置,平面的法线是有方向的,(调换位置会导致法线方向相反)
        //ps: 左手坐标系使用左手定则 右手坐标系使用右手定则 (具体什么是左右手坐标系这里不细说请Google)
        //unity中世界坐标使用的是左手坐标系,所以法线的方向应该用左手定则判断.
        Vector3 planeNormal = Vector3.Cross(otherDir, dir);
    
        //再求startPos与endPos的垂线. 其实就是再求一次叉乘.
        Vector3 vertical = Vector3.Cross(dir, planeNormal).normalized;
        //中点.
        Vector3 centerPos = (startPos.position + endPos.position) / 2f;
        //控制点.
        Vector3 controlPos = centerPos + vertical * offset;
    
        //线段.
        Gizmos.color = Color.white;
        Gizmos.DrawLine(startPos.position, endPos.position);
    
        //平面法线.
        Gizmos.color = Color.red;
        Gizmos.DrawLine(centerPos, controlPos + planeNormal.normalized * 5);
    
        //人为确定的方向.
        Gizmos.color = Color.blue;
        Gizmos.DrawLine(startPos.position, startPos.position + otherDir.normalized * 5);
    
        //中垂线.
        Gizmos.color = Color.green;
        Gizmos.DrawLine(centerPos, centerPos + vertical.normalized * 5);
    }
    

    给电线添加物理特性

    两点生成曲线已经搞定啦,现在就差把线绘制出来并能交互。
    把线绘制出来其实很简单,Unity自带的LineRendere已经能满足我们的要求。但是如何才能让LineRenderer可交互呢?添加碰撞器嘛!
    有了碰撞器你想怎么个交互都行嘛。
    添加碰撞器代码很简单,这个思路最重要。代码里面添加的是胶囊体碰撞器,如下:

    /// <summary>
    /// 给线添加碰撞体.
    /// </summary>
    /// <param name="poses">点集合.</param>
    /// <param name="colls">碰撞器的父物体.</param>
    /// <param name="radius">半径.</param>
    private void AttackCollider(Vector3[] poses, Transform colls, float radius)
        {
            Vector3 lastPos = poses[0];
            for (int i = 1; i < poses.Length; i++)
            {
                Vector3 nextPos = poses[i];
    
                GameObject colliderObj = null;
                if (i <= colliders.Count-1)
                {
                    colliderObj = colliders[i - 1];
                }
                else
                {
                    colliderObj = new GameObject();
                    colliders.Add(colliderObj);
                }
                
                colliderObj.name = (i - 1).ToString();
                colliderObj.transform.parent = colls;
                colliderObj.transform.forward = (nextPos - lastPos).normalized;
    
                CapsuleCollider coll = colliderObj.GetComponent<CapsuleCollider>();
                if(coll == null)
                {
                    coll = colliderObj.AddComponent<CapsuleCollider>();
                }
                Vector3 center = (lastPos + nextPos) / 2f;
    
                //设置胶囊体参数.
                colliderObj.transform.position = center;
                coll.center = Vector3.zero;
                coll.radius = radius;
                coll.height = Vector3.Distance(lastPos, nextPos);
                coll.direction = 2;                         //0-X 1-Y 2-Z
                coll.tag = "Wire";
    
                lastPos = nextPos;
            }
        }
    

    项目上传到GitHub了可下载查看。
    下次再会!

    展开全文
  • Unity一张图片上绘制动态曲线 1、比使用Line Render要节省计算和渲染 2、真正实现了二维的曲线绘制,Line Render始终是3维的 3、曲线坐标的X和Y的值不能超过贴图的宽度和高度,否则不能绘制
  • 转载收藏:原文链接https://www.cnblogs.com/msxh/p/6270468.html阅读目录一、简介二、公式三、实现与应用 RT,马三最近在参与一款足球游戏的开发,其中涉及到足球的各种运动轨迹和路径,比如射门的轨迹,高吊球,...

      RT,马三最近在参与一款足球游戏的开发,其中涉及到足球的各种运动轨迹和路径,比如射门的轨迹,高吊球,香蕉球的轨迹。最早的版本中马三是使用物理引擎加力的方式实现的足球各种运动,后来的版本中使用了根据物理学公式手动计算位置和物体速度的方式实现,现在这个版本中使用的是DoTween+贝塞尔曲线调节来实现。(关于它们之间的各种优缺点我们会在以后单独开一篇博客来探讨,届时也会放出源代码互相学习下)好了,言归正传,今天马三就来和大家一起学习一下游戏中的贝塞尔曲线以及其在Unity中如何实现。

    一、简介

    贝塞尔曲线是最基本的曲线,一般用在计算机 图形学和 图像处理。贝塞尔曲线可以用来创建平滑的曲线的道路、 弯曲的路径就像 祖玛游戏、 弯曲型的河流等。

            一条贝塞尔曲线是由一组定义的控制点 P0到 Pn,在 n 调用它的顺序 (n = 1 为线性,2 为二次,等.)。第一个和最后一个控制点总是具有终结点的曲线;然而,中间两个控制点 (如果有的话) 一般不会位于曲线上 。

      (1)贝塞尔曲线包含两个控制点即 n = 2 称为线性的贝塞尔曲线

      (2)贝塞尔曲线包含三个控制点即 n = 3 称为二次贝塞尔曲线

      (3)贝塞尔曲线包含四个控制点即 n = 4,所以称为三次贝塞尔曲线。

       贝塞尔曲线返回点的贝塞尔函数,使用线性插值的概念作为基础。

    二、公式

    1.线性贝塞尔公式:

    给定点P0、P1,线性贝兹曲线只是一条两点之间的直线。这条线由下式给出:

    其等同于线性插值。

    效果图(文章中部分图片转载自CSDN):

    2.二次贝塞尔公式:

    二次方贝兹曲线的路径由给定点P0、P1、P2控制,这条线由下式给出:

    效果图:

    3.三次贝塞尔方程:

    P0、P1、P2、P3四个点在平面或在三维空间中定义了三次方贝兹曲线。曲线起始于P0走向P1,并从P2的方向来到P3。一般不会经过P1或P2;这两个点只是用来充当控制点。P0和P1之间的间距,决定了曲线在转而趋进P3之前,走向P2方向的“长度有多长”。
    曲线的参数形式为:
    效果图:

    4.一般参数形式的贝塞尔方程:

     N阶贝兹曲线可如下推断。给定点P0、P1、…、Pn,其贝兹曲线即:

    如上公式可如下递归表达: 用表示由点P0、P1、…、Pn所决定的贝兹曲线。
    TIPS:

    通过两个低阶的贝塞尔曲线插值的堆叠总能够获得更高阶的贝塞尔曲线,通俗的来说通过对两条低阶的贝塞尔曲线插值,你可以求得一条高一阶的贝塞尔曲线。

    比如:二次贝塞尔曲线是点对点的两个线性贝塞尔曲线的线性插值,三次贝塞尔曲线是两条二次贝塞尔曲线的线性插值。

    三、实现与应用

    效果图:

    通过调节起始点(左边的白球)、控制点(中间的白球)和结束点(右边的白球)可以获得到不同的贝塞尔曲线,然后使用LineRender组件将路径绘制出来,以方便观察。下面就是实现此功能的代码:

    using UnityEngine;
    using System.Collections.Generic;
    [RequireComponent(typeof(LineRenderer))]
    public class Bezier : MonoBehaviour
    {
        public Transform[] controlPoints;
        public LineRenderer lineRenderer;
     
        private int layerOrder = 0;
        private int _segmentNum = 50;
     
     
        void Start()
        {
            if (!lineRenderer)
            {
                lineRenderer = GetComponent<LineRenderer>();
            }
            lineRenderer.sortingLayerID = layerOrder;
        }
     
        void Update()
        {
     
            DrawCurve();
     
        }
     
        void DrawCurve()
        {
                for (int i = 1; i <= _segmentNum; i++)
                {
                    float t = i / (float)_segmentNum;
                    int nodeIndex = 0;
                    Vector3 pixel = CalculateCubicBezierPoint(t, controlPoints[nodeIndex].position,
                        controlPoints[nodeIndex+1].position, controlPoints[nodeIndex+2].position);
                    lineRenderer.numPositions = i;
                    lineRenderer.SetPosition(i - 1, pixel);
                }
     
        }
     
        Vector3 CalculateCubicBezierPoint(float t, Vector3 p0, Vector3 p1, Vector3 p2)
        {
            float u = 1 - t;
            float tt = t * t;
            float uu = u * u;
     
            Vector3 p = uu * p0;
            p += 2 * u * t * p1;
            p += tt * p2;
     
            return p;
        }
         
    }

    CalculateCubicBezierPoint()函数负责根据T值计算出对应的贝塞尔曲线中的点,DrawCurve()函数通过不断的改变T值,并调用CalculateCubicBezierPoint()获得坐标点,然后通过LineRenderer将这些点绘制出来。

    为了使用方便,可以将计算贝赛尔曲线的方法放到一个工具类中——BezierUtils类:

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
     
    public class BezierUtils
    {
        /// <summary>
        /// 根据T值,计算贝塞尔曲线上面相对应的点
        /// </summary>
        /// <param name="t"></param>T值
        /// <param name="p0"></param>起始点
        /// <param name="p1"></param>控制点
        /// <param name="p2"></param>目标点
        /// <returns></returns>根据T值计算出来的贝赛尔曲线点
        private static  Vector3 CalculateCubicBezierPoint(float t, Vector3 p0, Vector3 p1, Vector3 p2)
        {
            float u = 1 - t;
            float tt = t * t;
            float uu = u * u;
     
            Vector3 p = uu * p0;
            p += 2 * u * t * p1;
            p += tt * p2;
     
            return p;
        }
     
        /// <summary>
        /// 获取存储贝塞尔曲线点的数组
        /// </summary>
        /// <param name="startPoint"></param>起始点
        /// <param name="controlPoint"></param>控制点
        /// <param name="endPoint"></param>目标点
        /// <param name="segmentNum"></param>采样点的数量
        /// <returns></returns>存储贝塞尔曲线点的数组
        public static Vector3 [] GetBeizerList(Vector3 startPoint, Vector3 controlPoint, Vector3 endPoint,int segmentNum)
        {
            Vector3 [] path = new Vector3[segmentNum];
            for (int i = 1; i <= segmentNum; i++)
            {
                float t = i / (float)segmentNum;
                Vector3 pixel = CalculateCubicBezierPoint(t, startPoint,
                    controlPoint, endPoint);
                path[i - 1] = pixel;
                Debug.Log(path[i-1]);
            }
            return path;
     
        }
    }

    通过调用 GetBeizerList( )方法就可以获得到一个包含着计算出的贝塞尔曲线的数组,然后让Obejct沿着数组里面的路径移动就可以模拟出各种曲线运动的效果了,比如炮弹的飞行轨迹,香蕉球、弧圈球等等各种各样的曲线效果了,比如下面的效果图:

     

    博客中贝塞尔曲线工程的开源地址:https://github.com/XINCGer/Unity3DTraining/tree/master/BezierTest

     

    作者:马三小伙儿
    出处:http://www.cnblogs.com/msxh/p/6270468.html 
    请尊重别人的劳动成果,让分享成为一种美德,欢迎转载。另外,文章在表述和代码方面如有不妥之处,欢迎批评指正。留下你的脚印,欢迎评论!

    展开全文
  • Unity游戏中使用贝塞尔曲线

    万次阅读 2015-08-18 09:08:14
    贝塞尔曲线是最基本的曲线,一般用在计算机 图形学和 图像处理。贝塞尔曲线可以用来创建平滑的曲线的道路、 弯曲的路径就像 祖玛游戏、 弯曲型的河流等。 一条贝塞尔曲线是由一组定义的控制点 P0到 Pn,在 n
  • LineWaves-2.0,Curvy,Vectrosity 5.4.2,三种强大的画线工具,仅供学习使用。
  • Unity 曲线编辑器说明

    万次阅读 2016-06-30 09:26:50
    曲线有许多不同的用途,在 Unity 中有一些使用可编辑曲线的不同控件。文档地址:https://docs.unity3d.com/Manual/EditingCurves.html 曲线上添加和移动键 双击曲线上键 (key) 应放置的点可将键 (key) 加...
  • Unity 曲线插件

    2019-03-11 10:03:36
    一个Unity曲线插件,各种不同的曲线,支持Unity4.0以上版本
  • Unity 曲线编辑扩展菜单功能

    千次阅读 2016-06-30 08:57:59
    曲线编辑扩展菜单功能,原因默认的 AnimationCurve 字段曲线编辑,不支持复制粘贴到另一个 AnimationCurve 字段,亦不支持关键帧的清空。所以扩展 AnimationCurve 的绘制,在右侧添加下拉菜单,以扩展功能。
  • 默认的 AnimationCurve 字段曲线编辑,不支持复制粘贴到另一个 AnimationCurve 字段,亦不支持关键帧的清空。所以扩展 AnimationCurve 的绘制,在右侧添加下拉菜单,以扩展功能。 功能 复制曲线 粘贴曲线 清空曲线 ...
  • 1.三次Hermite样条 埃尔米特插值时颇为常用的插值算法,其根本也是三次贝塞尔曲线,有关贝塞尔曲线的知识可以参考这篇文章,有...其中,P0和P3是一条曲线段的起点和终点,P1和P2是这个曲线段的两个外控制点。 ...
  • 通过Editor编程将普通的曲线工具可以在场景视图中编辑 有时候,我们从网上找到一个只有功能性的第三方插件,它只提供了组件,使用起来可能非常不方便。我们通过Editor的编程,对它进行改造,做成一个实用的工具,...
  • unity 贝塞尔曲线算法

    千次阅读 2018-05-28 19:09:37
    在任意几个点坐标绘制出的一条曲线,就叫贝赛尔曲线。线性公式 等同于线性插值这个最简单,就是很普通的插值算法,给定p0,p1,t取值范围0到1 // 线性 Vector3 Bezier(Vector3 p0, Vector3 p1, float t) { return...
  • unity3d自定义路径—曲线编辑器

    热门讨论 2010-10-25 11:26:20
    说明: http://blog.163.com/lnwanggang@yeah/blog/static/165332162201092511195070/
  • 可视化调节 曲线运动插件 Untiy C#
  • unity Bezier曲线 移动

    2016-09-20 21:10:31
    private Dictionary m_BezierTask = new Dictionary();  private bool m_bProcess = true;  public void ClearAllTask()  {  m_BezierTask.Clear();  }  void Update()  {
  • Unity中的曲线绘制

    万次阅读 2016-11-10 11:15:09
    Unity中的曲线绘制(一)——直线 直线  让我们从创建一条简单的直线开始。两点成线,我们需要一个起始点p0,以及终点p2;  现在我们可以创建一个游戏对象,为它绑定Line脚本,并且设置两个点...
  • 当你需要相机镜头根据特定轨迹运动。或者一些AI的特定轨迹运动的时候。就可以用到下面的脚本了 一下方法来自官方案例 直接代码喽。你需要做的就是,复制到你的项目中。拖在脚本上,你就知道他怎么用了。...
  • 用于学习贝塞尔曲线原理,观察贝塞尔曲线。并初步了解曲线绘制方法。

空空如也

1 2 3 4 5 ... 20
收藏数 5,638
精华内容 2,255
关键字:

unity 曲线