人们对计算几何最常见的误解之一与曲线参数有关。

由于 Nurbs 曲线的数学相当复杂——其中大部分肯定超出了高中水平——很难解释控制点坐标、控制点权重、曲线度数和结向量如何共同使 nurbs 曲线的参数化变得复杂。 我自己对 Nurbs 数学的掌握充其量是皮毛,所以我认为如果我使用更简单的曲线类型开始这个讨论,对每个参与的人都会更好。

推荐:用 NSDT场景设计器 快速搭建3D场景。

但在我们开始讨论这个问题之前,我们应该首先为什么样的形状符合“曲线”的条件制定一些基本规则:

  • 曲线是有限的一维对象,存在于具有任意维数的某个空间中。 在这篇博文中,我将只关注我们都熟悉的二维和三维空间。
  • 每条曲线必须恰好有两个端点。 不多也不少。
  • 如果端点重合,则认为曲线闭合。
  • 曲线内部不能有间隙,因为这会产生两个以上的端点。
  • 曲线上不能有分支点,除非端点与曲线的某个内部点重合。

基本上,将所有可能的曲线想象成橡皮糖,你可以拉伸、弯曲、扭曲和扭结它们,但最终它只不过是一堆变形应用于一块直的耐嚼的粘液。 请注意,上面的定义不同于曲线的常见数学定义。 数学家往往更具包容性和严谨性。

由于所有曲线都有两个端点(我们称它们为起点和终点)我们也可以说曲线存在于一个数值区间(interval)或域(domain)内。 该域将包含两个端点之间的所有数字,包括两个端点 :

上图显示了域为 [0.0, 1.0] 的二维曲线。 0.0代表曲线的起点,1.0代表终点,0.0和1.0之间的每个数字代表曲线内部的某个点。 我选择了0.0和1.0,因为它们是整齐的数字,但每个具有非零长度的域在技术上都是有效的。 它可能是 [-π, +π] 或 [1000000.0, 1000000.1]。

让人困惑的第一件事是曲线的域与曲线的长度几乎没有关系。 你可以在不影响曲线的形状或大小的情况下更改域,并且可以在不影响域的情况下更改形状。 更糟糕的是,属于域某些部分的曲线量与该子域的大小几乎没有关系。 你可以在上图中看到,[0.25, 0.5] 子域中的曲线明显多于 [0.0, 0.25] 子域中的曲线。

那么什么是曲线参数以及曲线参数化的确切含义是什么? 每条数学曲线都由一些函数集合定义。 你可能非常熟悉的一个非常著名的函数是正弦函数,当绘制图形时,它会产生正弦波。 由于这是一条二维曲线,我们需要两个函数来描述它:

  • x = t
  • y = Sin(t)

第一个方程告诉我们曲线如何沿 X 轴运动,第二个方程定义了沿 Y 轴的行为。 这里的变量 t 称为参数。 曲线参数化是我们用来描述曲线参数属性的词,与几何属性相对。 参数化包括域和参数密度等内容,它定义了曲线任何部分的“速度”。 如果莫仍然认为曲线是有弹性的橡皮糖,那么曲线的“速度”就类似于橡皮糖的厚度。 曲线拉伸得越多,橡皮糖变得越稀薄,曲线速度就越高。

如果你想知道这条曲线在任何给定参数 t 的位置,你所要做的就是评估这两个函数并且你知道 t 处的坐标。 如果你想知道这条曲线在相同参数下的切向量,你计算的不是方程本身,而是它们的一阶导数,如果你想知道曲率,你可以使用二阶导数等等 。

如果我们求解这些方程以获得等间距 t 参数的集合,我们会得到如下结果:

所有红点之间的水平距离相同,但垂直距离随正弦波而变化。 因此,两个相邻点之间的实际距离一直在变化。 当曲线以最大速度向上运动时,它可以高达 0.28,而当曲线在顶部变平时,它可以低至 0.13。 这是参数“密度”如何在曲线的不同部分变化的主要示例。

由于我们定义上述曲线的方式(使用正弦函数),在特定参数下对其进行评估非常简单快捷。 然而,以给定的长度对其进行评估非常困难且耗时。 找出哪个参数代表曲线上距离起点恰好 x 个单位的点所需的数学步骤数量是惊人的。 这就是为什么实际上 Rhino 和 Grasshopper 中的所有曲线方法都需要参数而不是长度。

因此,让我们看一下参数沿 Nurbs 曲线的进展,以了解它们在更复杂的几何类型中的行为方式。 看一下具有 3 个等距共线控制点的度数 = 2 的 nurbs 曲线:

实际上看起来参数密度沿着这条曲线是恒定的。 这是因为控制点的完全对称性,任何会导致参数在一个地方拉伸的效果都会被相等且相反的效果所抵消。 但是,不要认为每条具有等距控制点的线性 nurbs 曲线都是如此整洁。 引入任何额外的复杂性和获得一致的参数密度将很难实现。 我们可以看到当我们将中间点从中心移开时会发生什么:

这导致曲线两端的平滑拉伸和压缩。 眼前的曲线形状和之前一模一样,只是不再是同一条曲线。 控制点的位置不是决定参数密度的唯一因素。 结向量(我们不会在这里讨论)和控制点权重也起着重要作用。 例如,此处中点的权重为 10.0,而端点的权重为 1.0:

如果你要沿着这条曲线的长度随机选择一个点,你很可能会在相对笔直的地方。 但是,如果你选择一个随机参数,那么很可能会在急转弯的某个地方结束。 因此,根据你的迎角,这条曲线会显得非常弯曲或非常直。 当处理更高阶的 nurbs 曲线(degree=3 和 degree=5 非常流行)时,即使没有任何加权,也往往会在曲线末端附近出现明显的参数拉伸 。

那么既然我们已经讨论了正弦波曲线和 Nurbs 曲线,那么更简单的类型如直线、折线、圆和弧呢? 对于这些类型的曲线,实际上很容易以参数密度恒定的方式定义它们。 当以相等的 t 间隔对弧进行采样时,步长将保持不变。 不仅距离是恒定的,一阶、二阶、三阶等的导数也是完美无缺的:

然而,将此弧线转换为 Nurbs 等价物(例如,通过在 Rhino 中打开控制点),所有美丽都会崩溃。 和以前一样,Nurbs 曲线的形状与圆弧的形状相同,但由于参数密度现在是可变的,导数也变得松散了:

所以,总结一下:

  • 不要混淆曲线参数和曲线长度。
  • 不要假设曲线的域必须有一个特定的值,它几乎可以是任何东西。
  • 不要认为以相等的步长穿过曲线域意味着你也在以恒定速度沿着曲线移动。
  • 具有相同形状的曲线可以具有截然不同的参数化。

原文链接:Nurbs参数空间 — BimAnt

理解Nurbs曲线/曲面的参数空间相关推荐

  1. NURBS曲线与曲面

    B样条方法在表示与设计自由型曲线曲面形状时显示了强大的威力,然而 在表示与设计初等曲线曲面时时却遇到了麻烦.因为B样条曲线包括其特例的 Bezier曲线都不能精确表示出抛物线外的二次曲线,B样条曲面包 ...

  2. java nurbs几何库_OpenGL超级宝典笔记——NURBS与曲面细分

    NURBS 贝塞尔曲线的缺点是当我们增加很多控制点的时候,曲线变得不可控,其连续性会变差差.如果控制点很多(高阶曲线),当我们调整一个控制点的位置,对整个曲线的影响是很大的.要获得更高级的控制,可以使 ...

  3. 计算机图形学 第六章 曲线曲面建模技术

    文章目录 1 参数方程 2 参数曲线的一般形式 3 张量积形式的参数曲面 4 连续性的定义 参数连续性Ck 5 插值.逼近和拟合 6 Bernstein多项式 7 Bezier曲线及曲面,构造方法和性 ...

  4. nurbs建模能用MATLAB么,NURBS(matlab生成nurbs曲线图像)

    NURBS是Non-Uniform Rational B-Splines的缩写,是非统一有理B样条的意思.具体解释是: .Non-Uniform(非统一):是指一个控制顶点的影响力的范围能够改变.当. ...

  5. 曲面积分的投影法_曲线曲面积分与重积分知识点汇总

    本文源自扬哥去年生日发的推送, 主要梳理曲线曲面积分与重积分的各种计算方法以及对应的一些联系, 题目多数来自每日一题与裴礼文, 还有部分为华师大课本例题. 计算题中, 对称性要放在战略的高度. 其次, ...

  6. 计算机图形学空间曲线,课程追忆之《计算机图形学》【曲线曲面篇】

    大家好,距离上一篇博文将近一个月,时间过得好快,原本计划周更的,后面推到半月跟,实际到现在是月更,每次在准备写点什么的时候,都会被一些杂乱的事物打扰,哎,重度拖延症.懒癌晚期- 继上次述说了<计 ...

  7. 曲线曲面积分总结归纳

    转载请注明 https://www.cnblogs.com/lihaqwq/p/9501876.html 1.对曲线曲面积分的理解 第一型曲线积分和第一型曲面积分是以线密度和面密度为背景的线积分,强调 ...

  8. 利用NURBS曲线进行点云曲面拟合算法

    文章目录 介绍 NURBS曲线 C++实现思路 代码实现 读取点云数据 对点云进行预处理 创建曲面模型 将曲面模型转换为NURBS曲面 完整代码 opennurbs.h说明 vs2019安装OpenN ...

  9. 多项式曲线——搞清楚贝塞尔曲线、B样条曲线、Nurbs曲线的区别

    多项式曲线--搞清楚贝塞尔曲线.B样条曲线.nurbs曲线的区别 贝塞尔曲线 Bezier曲线定义 Bernstein基函数的性质 Bezier曲线的性质 B样条曲线 B样条曲线定义 B样条基函数的性 ...

最新文章

  1. Could not get unknown property ‘compileSdkVersion‘ for project
  2. 微信小程序wx.request内调用setData方法
  3. 6.4高级查询:分组查询 链接查询 子查询 联合查询
  4. .net core 微服务之API网关 开源中间件 Ocelot 笔记
  5. 使用Apache Flume抓取数据(1)
  6. pkpm快速入门教程_PKPM快速入门教程.ppt
  7. 转载【C++】int转换为string的两种方法(to_string、字符串流)
  8. Jmeter插件监控服务器性能
  9. 声音均衡器怎么调好听_调音师必备:如何调出最佳人声?
  10. 用python画一个机器猫歌词_Python实现海贼王的歌词组成词云图
  11. meta标签http-equiv属性实现自动刷新页面和重定向
  12. SylixOS学习一—— SylixOS启程之旅 虚拟机配置
  13. w锋ndows用户组设置,第2章Wndows+Server+2008本地用户和组.ppt
  14. UI设计中一致性为什么这么重要
  15. 全球人造丝卫生棉条行业调研及趋势分析报告
  16. CBL-Mariner
  17. Kafka常用命令之kafka-topics.sh
  18. 王浩:哥德尔思想概说
  19. 学习Java的第七天
  20. Element表单验证规则

热门文章

  1. 利用Nginx正向代理加速代码编译外网依赖下载速度
  2. ffmpeg h264文件转mp4
  3. 【Linux】服务远程连接失败解决方法
  4. 企业管理软件如何选型?看完后恍然大悟
  5. ArcMap客户端——将shp属性表导出为excel
  6. 【Linux】_面试题之权限、ACL、磁盘空间管理、VDO、SELinux、逻辑卷、服务管理、防火墙策略、故障修复i
  7. TCHAR和CHAR类型的互转
  8. 什么是赛博朋克? 赛博朋克视觉体系简介
  9. 有限差分法(Finite Difference Method)解方程:边界和内部结点的控制方程
  10. 如何设置maya的Render.exe程序来mayabatch批量渲染