Cutmull-Rom Spline笔记和个人理解

最详细的Catmull-Rom Spline 推导与应用 我们往Spline 的方向深入,探究 Catmull-Rom 的曲线,想必研究的越深入,来到这里的人也越少。实际上,作为一个使用引擎的编程者,并不需要推导的那么深入,引擎自然有现成的实现。不过,既然已经钻研到了这里,“予之力尚足以入,火尚足以明也”如果不在此研究明白,恐怕以后也很难有机会再回到这里来研究更多吧。当然,我们到了这里,会发现,这部分的中文的教材充斥着抽象的概念,晦涩难懂;这部分的博客往往伴有“无脑转译”和“不求甚解” 的存在。 阅读详情

一、Spline理解

从简单的Bezier样条曲线开始:

一阶Bezier曲线:线性插值

给定两个点 P_{0} 和 P_{1},有:

B(t)=(1-t)P_0+tP_1

where, 0\leq t\leqslant 1。

可以想象这是 从点  P_{0}  走向 ​P_{1} 的过程,就是一条直线上的点。

二阶Bezier曲线:插值的插值

给定三个点 P_{0} , P_{1},P_2,进行两步操作:

1、对两对相邻点做线性插值,有:

A_0(t)=(1-t)P_0+tP_1

A_1(t)=(1-t)P_1+tP_2

2、对插值出来的两个点再做插值,有

B(t)=(1-t)A_0+tA_1

可以理解成:在第一步中,我们获得了两条“线上的点”随着时间t变化的轨迹,第二步是让这两个点之间再随着时间变化做插值。

数学公式就是:

B(t)=(1-t)^2P_0+2(1-t)tP_1+t^2P_2

三阶Bezier曲线:

一阶贝塞尔曲线是:两点之间的滑动点
二阶贝塞尔曲线是:两个滑动点之间的滑动点
三阶贝塞尔曲线是:两个“两个滑动点之间的滑动点”之间的滑动点

二、Catmull-Rom Spline

是一种分段插值样条(通过其控制点的曲线),由四个控制点控制: P_{0} , P_{1},P_2,P_3,曲线仅从 P_{1} 到 P_2。

令 $\mathbf{P}_i = \begin{bmatrix} x_i \ y_i \end{bmatrix}$ 表示一个点。对于曲线段 $\mathbf{C}$ 由点$\mathbf{P}_0, \mathbf{P}_1, \mathbf{P}_2, \mathbf{P}_3$和节点序列 $t_0, t_1, t_2, t_3$ ,向心 Catmull–Rom 样条可以通过以下方式生成:

\mathbf{C} = \frac{t_2 - t}{t_2 - t_1} \mathbf{B}_1 + \frac{t - t_1}{t_2 - t_1} \mathbf{B}_2

\mathbf{A}_1 = \frac{t_1 - t}{t_1 - t_0} \mathbf{P}_0 + \frac{t - t_0}{t_1 - t_0} \mathbf{P}_1

\mathbf{A}_2 = \frac{t_2 - t}{t_2 - t_1} \mathbf{P}_1 + \frac{t - t_1}{t_2 - t_1} \mathbf{P}_2

\mathbf{A}_3 = \frac{t_3 - t}{t_3 - t_2} \mathbf{P}_2 + \frac{t - t_2}{t_3 - t_2} \mathbf{P}_3,

\mathbf{B}_1 = \frac{t_2 - t}{t_2 - t_0} \mathbf{A}_1 + \frac{t - t_0}{t_2 - t_0} \mathbf{A}_2

\mathbf{B}_2 = \frac{t_3 - t}{t_3 - t_1} \mathbf{A}_2 + \frac{t - t_1}{t_3 - t_1} \mathbf{A}_3,

t_{i+1} = t_i + \left \| P_{i+1} - P_i \right \|^{\alpha}

从节点序列的角度解释一下:曲线C的插值过程可以看作参数 t 从t_1 到t_2插值出路径点,构造

 C(t), t \in [t_1,t_2]

因为我们希望参数 t 能反应控制点之间的距离变化,从而在插值时保持曲线的匀速或自然感,所以通过参数\alpha \in[0,1],来控制插值参数t。

当 \alpha = 0 时,参数间隔均匀,如果两点之间距离很短,那么插值时它会以同样的“时间”穿过,导致曲线抖动,而如果\alpha=0.5之类的与距离相关的参数,就能缓解这种问题。

Barry和Goldman的金字塔公式

总结一下流程

1. 选择 4 个点 P_0, P_1, P_2, P_3;

2. 构造 knot 序列 t_0, t_1, t_2, t_3,常用 centripetal: t_{i+1} = t_i + \|P_{i+1} - P_i\|^{0.5};

3. 对于任意 t \in [t_1, t_2],递推计算一次插值 A,再计算二次插值B,最后得到三次插值C;

4. 重复对每段进行插值,可以绘制整条样条曲线。

三、CR 样条和 Bézier 曲线和 B 样条的区别

Catmull-Rom Spline(CR样条)Bézier 曲线B样条
类型一种 插值样条曲线,一定通过控制点一种 逼近型样条曲线,不一定经过控制点(除了首尾点),而是由控制点“牵引”形状。逼近型样条曲线,分段连续多项式构造
基函数分段三次样条,每段用 4 个点Bernstein 多项式De Boor-Cox 公式递归生成
曲线构建方式每两点之间生成一段曲线整个曲线由一组控制点决定分段连续多项式,而且在全曲线上有限阶可导/连续
性质改一点只影响相邻2段

全局性:无法对曲线形状进行局部控制,改变任一控制点位置时,整个曲线均受到影响。

端点性:曲线只经过两个端点的控制点(起点和终点),其它所有点只是逼近,一般不经过。

局部性:k阶曲线上的一点至多与k个控制点有关,与其它控制点无关。

不一定经过控制点

整条曲线有一个完整的表达形式,在有限阶内都十分平滑,但内在的量却是分段的

Catmull-Rom插值算法 Catmull-Rom Spline 一、简要介绍 Catmull-Rom算法保证两点: 1、点Pi 的一阶导数等于Pi+1 - Pi-1,即点Pi 的切向量和其相邻两点连线的切向量是平行的; 2、穿过所有Pi 点。这是与贝塞尔曲线的最大区别,正因为这样的特性,使得Catmull-Rom算法适于用作轨迹线算法。 点Pi处的切线记作:τ (Pi+1 − Pi−1)。此算法的转换矩阵如下: p(u)... 阅读详情

相关推荐

Catmull-Rom Spline插值算法C++实现

1. 算法简介 Catmull-Rom Spline算法是一种插值算法,能够在目标点之间插值生成一条平滑的曲线 算法数学原理不在此介绍 算法特点 什么情况下,可以使用Catmull-Rom Spline算法呢——平滑机器人或无人车的路径 算法要求: 有一系列路径点 路径点大于4个 想要在路径点之间插值生产若干个路径点 生成的轨迹是平滑的 2. C++实现 不说废话上代码,我把核心算法写成了Ca...

weixin_42156097的博客 3585

【转】利用Catmull-Rom算法拟合曲线车道线

一、Catmull_Rom样条曲线模型引入 Catmull_Rom样条曲线拟合是曲线插值技术的一种,该插值技术能经过所给的所有控制点。BY THE WAY,很多插值技术可以参考http://www.cnblogs.com/WhyEngine/p/4020390.html Catmull_Rom样条曲线拟合方法需要至少四个控制点,公式如下: 其中,t属于[0,1](也就是0-1中每个t值可能对应所...

Ubuntu16.04 深度学习环境搭建GPU版 5371

Unity:使用Catmull-Rom曲线创建道路模型

文章目录问题描述:子问题一:子问题二:子问题三: 问题描述: 输入一些离散的三维点坐标,输出一段Mesh。 子问题一: 使用离散点构造一条Catmull-Rom曲线。 CatmullRom曲线的参数方程: public static Vector3 Interpolate(Vector3 start, Vector3 end, Vector3 tanPoint1, Vector3 tanPoint2, float t) { // Catmull-Rom splines are Hermite cur

方寸想法,编码宇宙 3974

插值技术之Catmull-Rom Spline Interpolating(2)

对于在游戏开发中,想要平滑的经过路径上的N个点的问题进行详细的讲解,引导出Catmull-Rom Spline的数学定义,并且讲解如何使用四个控制点来构造曲线,从而实现平滑移动

i_dovelemon的专栏 2万+

Catmull-Rom平滑多段线在奇异点处的扭曲问题(1)

Catmull-Rom样条是一种三次插值样条,由Edwin Catmull和Raphael Rom在1974年提出。曲线经过所有控制点(插值性)只需要四个点即可定义一段曲线C¹连续(一阶导数连续)局部控制性:移动一个点只影响相邻曲线段。

qq_39540537的博客 1176

车道线曲线拟合方法

车道线曲线拟合方法 一.车道线拟合算法 背景技术:在车辆行驶过程中,为了更好的了解并预测周围的环境信息,对车道线的曲线拟合是必要的。将采集来的车道线数据进行曲线拟合可以很好的估计车道线的参数信息,得知偏移量、倾斜角、曲率半径等信息,从而预测车道线的走向,为驾驶员或车辆自动控制系统提供帮助。现有的主流算法是将采集的车道线数据投影到鸟瞰图后直接用最小二乘法做三次曲线的拟合。这样做的优点是简单快捷,但缺...

吴建明wujianming_110117 6616

详解 Catmull-Rom 样条

Catmull-Rom 样条在决定两个点(比如点 P1 和点 P2)之间的曲线应该怎么弯曲时,它不仅仅看 P1 和 P2 这两个点,它还会“参考” P1 左边的点(我们叫它 P0)和 P2 右边的点(我们叫它 P3)。这样简单,但是得到的线段是“折线”,在连接点的地方会很生硬,不平滑。Catmull-Rom 样条就像一个聪明的画笔,你给它一系列的点,它就能自动帮你画出一条平滑的、并且。想象一下,你是一个动画师,或者想在电脑上画一条平滑的曲线,比如一条蜿蜒的小路或者过山车的轨道。

抟土成人祖,炼石补青天。眼中览银河,手可摘星辰。 2084

catmull-rom样条插值算法1

catmull-rom样条插值算法1

Catmull_Rom算法的实现

Catmull_Rom算法的具体原理在网络上都有,感兴趣的可以自己查找,此处只是它的代码实现,实现环境为OSG: 给定一堆离散点,将该离散点进行插值,绘制的曲线经过每一个离散点。 实现的代码: //生成Catmull_Rom Spline算法顶点 osg::Vec3 Catmull_Rom_SplinePoint_new(float u, osg::ref_ptr subconct

一位媛的修炼之路 9038

Python、Selenium实现问卷星自动填写(内含适配个人问卷的方法)

使用Python、Selenium实现问卷星自动填写,内含适配个人问卷的方法。

DaenCode的博客 3838

互联网金融项目实战(大数据Hadoop hive)

什么是互联网金融? 互联网金融 --> 信贷(信用贷款) --> 支付宝率先搞了一个信用体系 互联网金融: 在线支付、P2P 银行: 只会锦上添画、不喜欢雪中送炭 银行害怕出现坏账 ( 储户存钱,银行放贷 赚个利息差 ) 银行是可以倒闭的 保险公司不允许倒闭 银行分为:商业银行(自生自灭的)和非商业银行(国家的) 中国工商银行 全球第一大行 招商银行(清朝的一个李鸿章) 中国银行(历史超过 100 年了) 国家政策:希望银行能够扶持中小型企业 p2p:网络借贷平台 民间吸纳贷款 -->

weixin_58276266的博客 1553

经典文献阅读之--Online Monocular Lane Mapping(使用Catmull-Rom样条曲线完成在线单目车道建图)

所提出的单目车道映射系统的结构如图2所示。该系统使用仅有的单目摄像头和里程计(例如VIO、LIO)作为输入,无需先验导航地图或航空照片,即可输出紧凑的车道标记地图,以样条表示。具体而言,所提出的框架由两个子系统组成:车道跟踪和地图优化。神经网络在车道跟踪中直接基于输入图像预测3D车道标记。然后,这些预测结果经过进一步处理以满足后续需求,详见第3.1节。随后,处理后的车道标记与地图中的车道标记结合,同时考虑里程计提供的位姿信息(第3.2节)。最后,根据关联结果更新位姿(参见第3.3节)。

lovely_yoshino的博客 8979

Win11极速安装Tensorflow-gpu+CUDA+cudnn(含视频)

Win11极速安装Tensorflow-gpu+CUDA+cudnn(含视频链接)

weixin_46713695的博客 1万+

图形学曲线c++简单实现

贝塞尔曲线是一类常用的平滑曲线,通常用于矢量图形、路径动画、字体设计等。

积累点滴,保持自我 1269

【WRF数据准备】气象驱动数据-ERA5再分析数据(Copernicus)

【WRF数据准备】气象驱动数据-ERA5再分析数据

WW、forever的博客 5535

华为非AI方向0603笔试真题-爆破小游戏(详细思路+多语言题解)

华为非AI方向0603笔试第二题【爆破小游戏】,提供详细思路讲解以及代码实现。

qq_45776114的博客 358

Catmull-Rom 样条曲线 (JavaScript)

Catmull-Rom 样条曲线是一种通过给定点集生成平滑曲线的插值方法。

1H1R1M的博客 579

手把手教你学Simulink--基于Simulink的近端策略优化(PPO)路径规划仿真建模

本文详细介绍了如何利用Simulink进行近端策略优化(PPO)路径规划的仿真建模。首先,文章概述了PPO路径规划的特点和挑战,强调了其在连续或离散动作空间问题中的高效性和稳定性。接着,列出了所需的工具和环境,包括MATLAB/Simulink、Reinforcement Learning Toolbox等。随后,文章分步骤详细讲解了从定义任务需求到验证与分析的整个仿真建模过程,包括创建Simulink项目、集成智能体模型、构建环境模型、编写PPO路径规划逻辑、将逻辑集成到Simulink模型中以及最终的验

MHD0815的博客 166

Catmull-Rom Splines

http://www.dxstudio.com/guide_content.aspx?id=70a2b2cf-193e-4019-859c-28210b1da81f http://steve.hollasch.net/cgindex/curves/catmull-rom.html

LLC 1697

C#量化交易的市场数据采集与分析:从0到1构建你的‘数据雷达’——对比5大神器,代码实战全解析!

数据是量化交易的‘氧气’,而好的数据采集与分析是你的‘呼吸机’!本文5大神器+代码实战,总有一款适合你!(本文代码均经过测试,但请根据实际需求调整!

java专栏 734

第14.8章 高翔博士最新开源框架Lightning-LM源码解读(八):位姿平滑器PoseSmoother深度剖析,从原理到代码实现

本文深度解析了高翔博士开源框架Lightning-LM中的位姿平滑器PoseSmoother模块。该模块通过设置平滑因子,在保证位姿准确性的同时减少突变,使位姿变化更平稳。文章详细讲解了模块功能、数据流程和核心代码实现,包括构造函数、拷贝构造函数以及关键的PushDRPose和PushPose函数。重点分析了位姿平滑算法原理,涉及运动有效性校验、位姿队列维护和平滑因子调节等核心机制。此外还介绍了相关C++语法(如显式构造函数、默认拷贝构造)和优化方向。本解析为SLAM学习者提供了位姿平滑处理的实用实现范例。

行知SLAM 605

初识贝塞尔曲线

老早就听说过大名鼎鼎的贝塞尔曲线------Bézier curve,今天就来一探究竟! 贝塞尔曲线是应用在二维图形的数学曲线。贝塞尔曲线由线段与节点组成,节点是可拖动的支点,线段是可伸缩的橡皮筋,PS中的钢笔工具能画出来那么漂亮的曲线,就是因为数学家发明了贝塞尔曲线啊!(数学大佬赛高!)下图就是PS画出来的曲线。 曲线定义:起始点、终止点(也称锚点)、控制点。通过调整控制点,贝塞尔曲线的...

Arcobaleno 2168

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

unity实战篇 Catmull-Rom曲线工具类

Unity绘制UI层面曲线工具类

圈池 1068

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

两种 2D 折线(Polyline)平滑算法【C#】【VB.NET】

引言 当使用地图 (GIS) 或图表数据时,您将拥有2D点、线、折线和多边形等形状的对象。这些物体有很多不同的名字:形状、路径、面积、区域等等。在这篇文章中,我们把点定义为单个的 (x,y) 坐标对,即顶点,简单标记为P;直线被定义为以起点 和终点 为顶点对);多个顶点(从 到 ,其中n为> 2)组成一条折线。在折线中,顶点按它们在集合中出现的顺序连接;多边形就是一个简单的折线,...

ShaderJoy 的兴趣技术杂货铺 7487

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

CatmullRom插值算法

Vector3f DDUtil::catmullRom(Vector3f P0, Vector3f P1, Vector3f P2, Vector3f P3, float t) { float factor = 0.5; Vector3f c0 = P1; Vector3f c1 = (P2 - P0) * factor; Vector3f c2

ym19860303的专栏 6786
上一篇: Contiguous()到底怎么用,什么时候用
下一篇: 散度(学习自存)
叙利亚男篮
博客等级 码龄6年 31粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值