美文网首页
Unity中画贝塞尔曲线

Unity中画贝塞尔曲线

作者: sakura_1 | 来源:发表于2020-07-14 20:26 被阅读0次

    最近想做一个类似曲线指示器的东西,搜了一下资料发现这个,记录一下。

    简介

    贝塞尔曲线(Bézier curve),又称贝兹曲线或贝济埃曲线,是应用于二维图形应用程序的数学曲线。

    一条贝塞尔曲线有着n个控制点,曲线上的每个点由公式推算出来。n个控制点对应着n-1次的贝塞尔曲线。

    一阶曲线

    B_{1}(t) = P_{0} + (P_{1} = P_{0})t
    B_{1}(t) = {\color{Red}{ (1 - t)}}P_{0} + {\color{Red}t}P_{1}, t\in [0, 1]

    二阶曲线

    B_{1} = {\color{Red} {(1 - t)^{2}}}P_{0} + {\color{Red}{2t(1-t)}}P_{1}+{\color{Red}{t^{2}}}P_{1}, t\in [0, 1]

    ..三阶以上我就不写了,写公式好麻烦

    实现

    话不多说,直接开始实现

    /// <summary>
        /// 计算二次贝塞尔曲线值
        /// </summary>
        /// <param name="t">t值</param>
        /// <param name="p0">起始点</param>
        /// <param name="p1">控制点</param>
        /// <param name="p2">目标点</param>
        /// <returns></returns>
        private static Vector3 CalculateCubicBezierPoint(float t, Vector3 p0, Vector3 p1, Vector3 p2)
        {
            float u = 1 - t;
            float tt = t * t;
            float uu = u * u;
    
            // B(t) = (1 - t)^2*p0 + 2t(1 - t)p1 + t^2*p2
            Vector3 p = uu * p0;
            p += 2 * u * t * p1;
            p += tt * p2;
    
            return p;
        }
    

    有了能计算2阶贝塞尔曲线的函数了,下一步就是变换t值,求出每一个点。

        /// <summary>
        /// 给定中间点个数,给出每个点的坐标
        /// </summary>
        /// <param name="startPoint">起始点</param>
        /// <param name="controlPoint">控制点</param>
        /// <param name="endPoint">目标点</param>
        /// <param name="segmentNum">中间点个数</param>
        /// <returns></returns>
        public Vector3[] GetBeizrList(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);
     
                // 设置linerenderer达到画线的目的
                lineRenderer.positionCount = i;
                lineRenderer.SetPosition(i - 1, pixel);
    
                path[i - 1] = pixel;
                Debug.Log(path[i - 1]);
            }
            return path;
        }
    

    这样,给点三个点就能够完整画出一条直线,排版有些乱,先这样吧。

    相关文章

      网友评论

          本文标题:Unity中画贝塞尔曲线

          本文链接:https://www.haomeiwen.com/subject/kxgbcktx.html