之前写了个插件,有个需要曲线插值的功能。给定一些点的位置,物体成一条平滑曲线依次通过这些点。
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
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
