计算机图形学与opengl C++版 学习笔记 第11章 参数曲面

news2024/11/25 20:33:17

目录

  • 11.1 二次贝塞尔曲线(三点)
  • 11.2 三次贝塞尔曲线(四点)
  • 11.3 二次贝塞尔曲面(3x3控制点)
  • 11.4 三次贝塞尔曲面(4x4控制点)
  • 补充说明

在20世纪50年代和60年代在雷诺公司工作期间,皮埃尔·贝塞尔(Pierre Bézier)开发了用于设计汽车车身的软件系统。他的程序利用了Paul de Casteljau之前开发的数学方程组,后者曾为竞争对手雪铁龙汽车制造商[BE72,DC63]工作。de Casteljau方程仅使用几个标量参数描述曲线,同时使用一种高明的的递归算法,称为“de Casteljau算法”,就可以生成任意精度的曲线。现在它们分别被称为“贝塞尔曲线”和“贝塞尔曲面”,这些方法通常用于高效地对各种曲面3D物体进行建模。

11.1 二次贝塞尔曲线(三点)

二次贝塞尔曲线由一组参数方程定义,方程组中使用3个控制点指定特定的曲线的形状,每个控制点都是2D空间中的一个点。考虑图11.1中所示的一组3个点[p0,p1,p2]。

在这里插入图片描述

图11.1 贝塞尔曲线的控制点

通过引入参数t,我们可以构建一个用来定义曲线的参数方程组。表示从一个控制点到另一控制点间线段距离的分数。对于在线段上的点,t的值在[0…1]的范围内。图11.2显示了一个这样的值:t=0.75,分别应用于连接
p0-p1,p1-p2的线段。通过t在两条原始线段上定义了两个新点p01(t)和p12(t)。我们对连接两个新点p01(t)和p12(t)
的线段重复该过程,产生点P(t),其中沿线段p01(t)和p12(t)在t=0.75得到点P(t)。P(t)是最终得到的曲线上的点,因此用大写字母P表示。

在这里插入图片描述

图11.2 参数位置处的点t=0.75

针对各种t值收集大量的点P(t),则会产生一条曲线,如图11.3所示。采样的t的参数值越多,生成的点P(t)越多,得到的曲线则越平滑。
在这里插入图片描述

图11.3 建立二次贝塞尔曲线

现在可以导出二次贝塞尔曲线的分析定义。首先,我们注意到连接两个点pa和pb的线段pa-pb上的任意点p可以用参数t表示如下:

在这里插入图片描述
使用该等式,我们解出点p01和p12(分别在p0-p1,p1-p2上的点)如下:

在这里插入图片描述

同理,在这两点所连接的线段上的点可以表示为:

在这里插入图片描述
替换p12和p01的定义得:

在这里插入图片描述

分解并重新合并各项可得:

在这里插入图片描述

在这里插入图片描述

其中

在这里插入图片描述

因此,我们通过控制点的加权和解出曲线上的任意点。加权函数B通常被称为“混合函数”(尽管名称“B”实际上源自Sergei Bernstein [BE16],他首先描述了这个多项式族)。请注意,混合函数的形式都是二次的,这就是为什么得到的曲线称为二次贝塞尔曲线。

11.2 三次贝塞尔曲线(四点)

我们现在将曲线模型扩展到4个控制点,就会得到一个三次贝塞尔曲线,如图11.4所示。与二次曲线相比,三次贝塞尔曲线能够定义的形状更加丰富,而二次曲线仅限于定义凹形。

在这里插入图片描述

图11.4 建立一个三次贝塞尔曲线

同二次曲线时的情形,我们可以推导出三次贝塞尔曲线的解析定义:
在这里插入图片描述

曲线上的点则是:

在这里插入图片描述

使用p12-23和p01-12的定义替换等式中的项,再合并得:

在这里插入图片描述
其中
在这里插入图片描述

渲染贝塞尔曲线时,可以使用许多不同的技术。其中一种方法是,使用固定的增量,在0.0~1.0范围内,迭代增加得出t的后继值。

例如,当增量为0.1时,我们可以使用t值为0.0、0.1、0.2、0.3等的循环。对于t的每个值,计算贝塞尔曲线上的对应点,并绘制连接连续点的一系列线段,如图11.5中的算法所述。

在这里插入图片描述

图11.5 渲染贝塞尔曲线的迭代算法

另一种方法是使用de Casteljau算法递归地将曲线对半细分,其中,在每个递归步骤t=1/2。图11.6展示了左侧曲线细分后的新三次控制点(q0,q1,q2,q3),以绿色显示(见彩插)。该算法由de Casteljau提出(完整推导见[AS14])。
在这里插入图片描述

图11.6 细分三次贝塞尔曲线

算法见图11.7。该算法重复将曲线段细分为两半的过程,直到每个曲线段足够直,进一步的细分不会产生实际的好处。在极限情况下(随着生成的控制点越来越靠近),曲线段本身实际上与第一个控制点和最后一个控制点(
q0和q3)之间的线段相同。因此,可以通过比较从第一控制点到最后一个控制点的距离与连接4个控制点的3条线段的长度之和来确定曲线段是否“足够直”:

在这里插入图片描述

当D1-D2小于一个足够小的阈值时,进一步的细分就没有意义了。

de Casteljau算法有一个有趣的特性,它可以在不使用之前描述的混合函数的情况下,生成曲线上所有的点。同时请注意,p(1/2)处的中心点是“共享”的,即它既是左细分中最右的控制点,也是右细分中最左的控制点。它可以使用t=1/2处的混合函数或使用由de Casteljau导出的公式(q2+r1)/2来计算。

另请注意,图11.7中所示的subdivide()函数假定传入的参数 p、q和r是“引用”参数,因此,图11.7上方列出的drawBezierCurve函数对于subdivide()的调用,导致subdivide()函数中的计算修改了调用中所传的实际参数。

在这里插入图片描述

图11.7 贝塞尔曲线的递归细分算法

11.3 二次贝塞尔曲面(3x3控制点)

贝塞尔曲线定义了曲线(在2D或3D空间中),而贝塞尔曲面定义了3D空间中的曲面。将我们在曲线中看到的概念扩展到曲面,需要将参数方程组中的参数个数从一个扩展到两个。对于贝塞尔曲线,我们将参数称为t。对于贝塞尔曲面,我们将参数称为u和v。曲线由点P(t)组成,而曲面将由点 P(u,v)组成,如图11.8所示。

在这里插入图片描述

图11.8 参数曲面

对于二次贝塞尔曲面,每个轴u和v上有3个控制点,总共9个控制点。图11.9(见彩插)使用蓝色展示了一组共9个控制点(通常称为控制点“网格”)的示例,以及相应的曲面(红色)。
在这里插入图片描述

图11.9 二次贝塞尔控制网格和相应的表面

网格中的9个控制点标记为pij,其中i和j分别代表u和v方向上的索引。每组3个相邻控制点(例如(p00,p01,p02))会定义一条贝塞尔曲线。然后将表面上的点P(u,v)定义为两个混合函数的和,一个在u方向,一个在v方向。则用于构建贝塞尔曲面的两个混合函数的形式遵循先前为贝塞尔曲线给出的方法:

在这里插入图片描述

接下来生成构成贝塞尔曲面的点P(u,v)。对于每个控制点pij将其与第i个混合函数在u处的值相乘,再与第j个混合函数在v处的值相乘。最后将所有控制点的结果求和,生成贝塞尔曲面上的点 P(u,v)
在这里插入图片描述

组成贝塞尔曲面的生成点集有时会称为补丁。术语“补丁”有时 会让人感到困惑,我们稍后在研究曲面细分着色器时会看到(对于实 际实现贝塞尔曲面非常有用)。因为通常控制点组成的网格才称为 “补丁”。

11.4 三次贝塞尔曲面(4x4控制点)

从二次曲面到三次曲面需要使用更大的网格——4×4而非3×3。 图11.10(见彩插)显示了16控制点网格(蓝色)和相应曲面(红色)的示例。
在这里插入图片描述

图11.10 三次贝塞尔控制网格和相应的曲面

同上,我们可以通过组合三次贝塞尔曲线的相关混合函数来推导表面上的点P(u,v)的公式:

在这里插入图片描述
其中:
在这里插入图片描述
渲染贝塞尔曲面也可以通过递归细分[AS14]完成,方法是交替地将曲面沿每个维度分成两半,如图11.11所示。每个细分产生4个新的控制点网格,每个网格包含16个点,这些点定义了曲面的一个象限。

在这里插入图片描述

图11.11 贝塞尔曲面的递归细分

当渲染贝塞尔曲线时,我们在曲线“足够直”时停止细分。而对于贝塞尔曲面,我们在曲面“足够平坦”时停止递归。一种实现方法是,确保子象限控制网格上所有递归生成的点,距由该网格的4个角点中的3个定义的平面的距离,都小于一个允许的范围。点(x,y,z)与平面(A,B,C,D)之间的距离d为:

在这里插入图片描述

如果小于某个足够小的阈值,则我们停止细分过程,并简单地使d用子象限网格的4个角的控制点来绘制两个三角形。

对于贝塞尔曲线,OpenGL管线的细分阶段为基于图11.5中的迭代算法渲染贝塞尔曲面提供了一种有吸引力的替代方法。其策略是让曲面细分生成一个大的顶点网格,然后使用混合函数将这些顶点重新定位到贝塞尔曲面上,由三次贝塞尔控制点指定。我们在第12章中实现了这一点。

补充说明

本章重点介绍参数贝塞尔曲线和曲面的数学基础。我们推迟了在OpenGL中呈现其中任何一个的实现,因为实现它们需要适当的曲面细分着色器知识作为载体,我们将在下一章中进行介绍。我们还跳过了一些推导过程,例如递归细分算法。

在3D图形中,使用贝塞尔曲线建模对象有许多优点。首先,理论上,这些物体可以任意缩放,并且仍然保持光滑的表面而不“像素化”。其次,许多由复杂曲线组成的物体可以使用贝塞尔控制点集合进行更有效的存储,而不是存储数千个顶点。

除计算机图形和汽车外,贝塞尔曲线还有许多实际应用。在桥梁设计中也可以找到它们的身影,例如耶路撒冷的Chords Bridge[CB16]。类似的技术也用于构建TrueType字体,因此可以将其缩放到任意大小,或者将视角任意拉近观看,而字体边缘始终保持平滑。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/644045.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【信息与内容安全复习】第二章知识要点总结

1.网络媒体信息的获取流程 2.三原色原理 3.颜色特征表达的特点、问题和主要方法 4.文本特征表达的方式 5.网络媒体信息与网络通讯信息 6.网络媒体信息获取方法 7.补充 8.视觉特征表达的应用 9.颜色特征表达举例之颜色直方图 10.纹理特征和局部特征 答: 1.网络媒体…

Redis从入门到精通【高阶篇】之底层数据结构字典(Dictionary)详解

文章目录 0.前言1. 字典的结构2. 源码解析2.1. 字典的结构体2.2. 字典的函数接口dictAdddictFinddictResize 3. 字典/哈希表的优缺点3.1 优点3.1.1. 快速的查找时间3.1.2. 动态调整大小3.1.3. 灵活的数据类型3.2 缺点 4.总结5. Redis从入门到精通系列文章 0.前言 上个篇章回顾…

java三大特性之【多态】

多态 1.1 概念1.2 实现条件1.3 方法重写(override)与方法重载(overload)1.4 向上转型1.5 向下转型 1.1 概念 同样的一个方法/行为,经过不同的对象,表现出不同的行为,这样的现象就称为多态。 举…

今天就详细告诉你发票识别软件能识别哪些内容

既然大家点进这篇文章,说明大家对增值税发票识别技术非常感兴趣。本文会先介绍增值税发票识别技术的相关知识,然后再具体介绍识别增值税发票的软件有哪些。 增值税发票识别技术是一种基于图像识别和深度学习算法的自动化技术,它可以快速准确…

AI问答:前端需要掌握的设计模式/vue项目使用了哪些设计模式/vue项目开发可以使用哪些设计模式

一、理解什么是设计模式 设计模式是对软件设计开发过程中反复出现的某类问题的通用解决方案。 设计模式是一个在软件设计领域中被广泛应用的概念,它指的是一套被公认为有效的解决特定问题的设计思路和方法。 设计模式更多的是指导思想和方法论,而不是现…

零基础学 MySQL(基础版)

零基础学 MySQL(基础版) 1. 引出 思考一个问题: 淘宝网,京东、微信,抖音 都有各自的功能,那么当我们退出系统的时候,下次再访问时,为什么信息还存在? 2. 解决之道 2.1 解决之道—文件、数据库 为了解决上述问题&…

chatgpt赋能python:Introduction

Introduction 在机器学习中,模型的训练是非常重要的步骤之一。模型训练意味着为数据拟合合适的参数,以便能够准确地预测未来的值。Python是一种功能强大的编程语言,提供许多库和框架来训练机器学习模型。在本文中,我们将探讨如何…

FFmpeg编程入门

标题 播放器框架常用音视频术语解复用器和编解码器FFmpeg库简介FFmpeg有8个常用库: FFmpeg函数简介封装格式相关编解码器相关 FFmpeg数据结构简介关系数据结构分析 播放器框架 流程:媒体文件通过复用器将音频流,视频流,字幕流分离…

iCache dCache

前言 CPU 和 RAM 之间存在多级高速缓存,一般分为 3 级,分别是 L1、L2、L3。 另外,我们的代码都是由两部分组成的:指令、数据。 L1 Cache 比较特殊,每个 CPU 会有两个 L1 Cache,分别为 iCache(指…

互联网 Java 工程师高级面试八股文汇总(1260 道题目附解析)

今年的行情,让招聘面试变得雪上加霜。已经有不少大厂,如腾讯、字节跳动的招聘名额明显减少,面试门槛却一再拔高,如果不用心准备,很可能就被面试官怼得哑口无言,甚至失去了难得的机会。 现如今,…

苹果将在 iOS 17 引入新功能,Safari隐私浏览有重大更新

苹果公司正在对Safari隐私浏览系统进行重大更新,为用户在浏览网页时提供更好的保护,防止第三方跟踪器。 iPhone制造商说:先进的跟踪和指纹保护有助于防止网站使用最新的技术来跟踪或识别用户的设备。隐私浏览现在可以在不使用时锁定&#xf…

MODIS数据下载

MODIS数据常用下载网址: Find Data - LAADS DAAC 在下载之前需要注册一个账号,才可进行下载。 1.选择数据产品,本人选取MOD09Q1数据产品(250m8天合成的反射率数据) 2.设置时间限制如下 3.找到感研究区域所在的位置&…

chatgpt赋能python:Python怎么拦截Windows浏览器的请求

Python怎么拦截Windows浏览器的请求 Python是一种流行的编程语言,并且被广泛用于Web开发。在这篇文章中,我们将深入探讨Python如何拦截Windows浏览器的请求。 什么是拦截请求? 拦截请求是指在网络传输过程中,对请求进行截获并进行处理的过…

C++结构体

目录 一、结构体的概念 二、结构体定义和使用 三、结构体数组 四、结构体指针 五、结构体嵌套结构体 六、结构体做函数参数 七、结构体中const使用场景 一、结构体的概念 结构体属于用户自定义的数据类型,允许用户存储不同的数据类型 二、结构体定义和使用 语法&…

对称二叉树(C++)

题目描述 一棵有点权的有根树如果满足以下条件,则被轩轩称为对称二叉树: 1. 二叉树; 2. 将这棵树所有节点的左右子树交换,新树和原树对应位置的结构相同且点权相等。 下图中节点内的数字为权值,节点外的 id 表示节点编号。 现在给出一棵二叉…

Spring 事务的相关配置、传播行为、隔离级别及注解配置声明式事务

目录 一、事务的相关配置 1. 添加测试标签 2. 添加对应方法 3. 测试 二、事务的传播行为 三、事务的隔离级别 四、注解配置声明式事务 1. 注册事务注解驱动 2. 加上注解 3. 配置类代替xml文件中的注解事务支持 4. 测试 往期专栏&文章相关导读 1. Maven系列专栏…

用了【WRITE-BUG数字空间】,其他文档软件可以卸载、注销账号了

都3202年了文档都进化成在线协同编辑文档了 让我看看谁还在用本地软件写文档啊~滋滋滋 使用【WRITE-BUG数字空间】云文档全键盘写作不是梦!铁汁,听我句劝,把本地软件卸载了奥,你把握不住~ 程序员兄弟姐妹们的最爱编辑器&#x…

Zotero jasminum茉莉花插件

github地址:https://github.com/l0o0/jasminum 一个简单的Zotero 插件,用于识别中文元数据 非常感谢作者开发了这么好用的工具 安装步骤 首先要安装zotero 下载茉莉花插件安装包 https://github.com/l0o0/jasminum/releases 下载这个xpi格式的文件…

chatgpt赋能python:Python怎么抢优惠券?优惠不再是梦想!

Python怎么抢优惠券?优惠不再是梦想! 在如今的消费社会,优惠券已成为人们购物时追逐的目标。而优惠券的数量有限且抢手,往往仅能在短时间内领取,因此初次抢到心仪的优惠券可谓令人欣喜不已。而对于程序员们而言&#…

《springboot使用篇》——只为使用,一篇就够

目录 环境: spring boot概述 一,springboot快速入门 1.创建maven项目 2.引入起步依赖 3.自定义controller 4.编写启动类 5.开始测试 二.快捷方式创建sprinboot工程 补充 三,配置文件 1.配置文件之间的关系 2.yml配置文件 1.基本…