贝塞尔曲线的应用

时间:2021-09-13 05:48:58


1.实际效果

做游戏要的就是一些华丽的效果。比如物品的拾取特效,能量收集特效等等需要运动轨迹的地方。

利用贝塞尔曲线做的实际效果图:

贝塞尔曲线的应用

(好吧这个效果图有点坑爹。不过尼玛不要嫌弃QQ截图就这样了) 

单帧效果:

贝塞尔曲线的应用


2.大致原理

感觉是不是很炫酷呀!做这样的效果首先要了解下贝赛尔曲线这个东东(好吧实际上你完全不需要理解这个东东只要知道有这个东西。然后公式什么的内事找百度就好)


一阶贝塞尔曲线(线段):


贝塞尔曲线的应用

实际效果就是一个线性插值

来来来美少年们,一阶段的咱暂时不用,主要用的是二阶段的公式


二阶贝塞尔曲线(线段)

整个路径是由定点P0、P1、P2三个点来确定的。 效果如下:


贝塞尔曲线的应用

 


接下来的三阶段,四阶段xx阶段你可以看下百度内容:

http://baike.baidu.com/view/60154.htm?fr=aladdin



3.项目代码

实际项目中的代码,只要根据公式计算就可以了。

提供一个简单的例子


using UnityEngine;
using System.Collections;

/// <summary>
/// 贝塞尔曲线
/// </summary>
public class BezierVFX : MonoBehaviour {

    public Vector3 startPosition;
    public Vector3 endPosition;
    public Vector3 anchorPoint;

    [SerializeField]
    private float m_Duration;
    private float m_survivalTime;//结束之后保留的时间
    private float m_Time;
    private bool m_Begin = false;
    private Transform mTrans;

    public Transform cachedTransform { get { if (mTrans == null) mTrans = transform; return mTrans; } }

	void Start () 
    {
        m_Time = 0;
        m_Begin = false;
	}
	
	void Update () 
    {
        if (!m_Begin)
        {
            return;
        }
        m_Time += Time.deltaTime;

        float t = m_Time / m_Duration;
        t = Mathf.Clamp01(t);
        t = t * t;//曲线

        Vector3 pos = (1 - t) * (1 - t) * startPosition + 2 * t * (1 - t) * anchorPoint + t * t * endPosition;

        cachedTransform.position = pos;

        if (m_Time > m_Duration+0.5f)
        {
            Destroy(gameObject);
            m_Begin = false;
        }
	}

    public void Begin(float fDuration)
    {
        m_Begin = true;
        m_Duration = fDuration;
    }

    public void SetDuration(float fDuration)
    {
        m_Duration = fDuration;
    }
}