贝塞尔曲线的应用

来源:互联网 发布:java进阶书籍 知乎 编辑:程序博客网 时间:2024/05/23 11:24


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;    }}




0 0