CatmullRom插值


之前写了个插件,有个需要曲线插值的功能。给定一些点的位置,物体成一条平滑曲线依次通过这些点。

Bezier曲线是在Unity里比较常用的,但是不适合这里的需求。因为Bezier无法通过所有的点,它需要有另外的点来构造切线。如下图:

图1

 
Bezeir

查了资料发现CatmullRom曲线可以平滑的通过所有点,满足需求,如下图:

图2

 
CatmullRom

可以看这里的介绍

在Unity中C#脚本的实现:

/// <summary>
    /// Catmull-Rom 曲线插值
    /// </summary>
    /// <param name="p0"></param>
    /// <param name="p1"></param>
    /// <param name="p2"></param>
    /// <param name="p3"></param>
    /// <param name="t">0-1</param>
    /// <returns></returns>
    Vector3 CatmullRomPoint(Vector3 P0, Vector3 P1, Vector3 P2, Vector3 P3, float t)
    {
        float factor = 0.5f;
        Vector3 c0 = P1;
        Vector3 c1 = (P2 - P0) * factor;
        Vector3 c2 = (P2 - P1) * 3f - (P3 - P1) * factor - (P2 - P0) * 2f * factor;
        Vector3 c3 = (P2 - P1) * -2f + (P3 - P1) * factor + (P2 - P0) * factor;

        Vector3 curvePoint = c3 * t * t * t + c2 * t * t + c1 * t + c0;

        return curvePoint;
    }

 

需要注意的是,接受参数p0-p3四个点后,所得的曲线为p1和p2之间的。所以要得到多个点构造的曲线,首位部分需要特殊处理下,比如:CatmullRomPoint(p0,p1,p2,p3,t); 这样可以得到p1和p2之间的曲线。

在Unity中绘制出来:

 
CatmullRom-Unity



作者:梁先生呀
链接:https://www.jianshu.com/p/5cc76b78acb1
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM