Unity中的曲线插值CatmullRom

链接:Unity中的曲线插值CatmullRom

ps:博客从typecho换成jekyll后,文章复制到简书来因为图片链接原因变得麻烦了。- -!

正文

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

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

图1

2050387-46add4655f7aafbb.png
Bezeir

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

图2

2050387-b78abc83cc37e595.png
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>
public static Vector3 CatmullRomPoint(Vector3 p0, Vector3 p1, Vector3 p2, Vector3 p3, float t)
{
    return p1 + (0.5f * (p2 - p0) * t) + 0.5f * (2f * p0 - 5f * p1 + 4f * p2 - p3) * t * t +
            0.5f * (-p0 + 3f * p1 - 3f * p2 + p3) * t * t * t;
}

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

在Unity中绘制出来:

2050387-c7a89826b34eb78c.png
CatmullRom-Unity
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值