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

这篇具有很好参考价值的文章主要介绍了计算机图形学与opengl C++版 学习笔记 第11章 参数曲面。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

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

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

图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表示。

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

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

针对各种t值收集大量的点P(t),则会产生一条曲线,如图11.3所示。采样的t的参数值越多,生成的点P(t)越多,得到的曲线则越平滑。
计算机图形学与opengl C++版 学习笔记 第11章 参数曲面

图11.3 建立二次贝塞尔曲线

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

计算机图形学与opengl C++版 学习笔记 第11章 参数曲面
使用该等式,我们解出点p01和p12(分别在p0-p1,p1-p2上的点)如下:

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

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

计算机图形学与opengl C++版 学习笔记 第11章 参数曲面
替换p12和p01的定义得:

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

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

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

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

其中

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

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

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

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

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

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

同二次曲线时的情形,我们可以推导出三次贝塞尔曲线的解析定义:
计算机图形学与opengl C++版 学习笔记 第11章 参数曲面

曲线上的点则是:

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

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

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

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

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

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

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

另一种方法是使用de Casteljau算法递归地将曲线对半细分,其中,在每个递归步骤t=1/2。图11.6展示了左侧曲线细分后的新三次控制点(q0,q1,q2,q3),以绿色显示(见彩插)。该算法由de Casteljau提出(完整推导见[AS14])。
计算机图形学与opengl C++版 学习笔记 第11章 参数曲面

图11.6 细分三次贝塞尔曲线

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

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

当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()函数中的计算修改了调用中所传的实际参数。

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

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

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

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

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

图11.8 参数曲面

对于二次贝塞尔曲面,每个轴u和v上有3个控制点,总共9个控制点。图11.9(见彩插)使用蓝色展示了一组共9个控制点(通常称为控制点“网格”)的示例,以及相应的曲面(红色)。
计算机图形学与opengl C++版 学习笔记 第11章 参数曲面

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

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

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

接下来生成构成贝塞尔曲面的点P(u,v)。对于每个控制点pij将其与第i个混合函数在u处的值相乘,再与第j个混合函数在v处的值相乘。最后将所有控制点的结果求和,生成贝塞尔曲面上的点 P(u,v)
计算机图形学与opengl C++版 学习笔记 第11章 参数曲面

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

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

从二次曲面到三次曲面需要使用更大的网格——4×4而非3×3。 图11.10(见彩插)显示了16控制点网格(蓝色)和相应曲面(红色)的示例。
计算机图形学与opengl C++版 学习笔记 第11章 参数曲面

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

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

计算机图形学与opengl C++版 学习笔记 第11章 参数曲面
其中:
计算机图形学与opengl C++版 学习笔记 第11章 参数曲面
渲染贝塞尔曲面也可以通过递归细分[AS14]完成,方法是交替地将曲面沿每个维度分成两半,如图11.11所示。每个细分产生4个新的控制点网格,每个网格包含16个点,这些点定义了曲面的一个象限。

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

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

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

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

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

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

补充说明

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

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

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

到了这里,关于计算机图形学与opengl C++版 学习笔记 第11章 参数曲面的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • golang,OpenGL,计算机图形学(三)

    代码仓库 https://github.com/phprao/go-graphic 颜色 光源照射到物体上,一部分颜色被吸收,另一部分无法吸收的被反射到人眼,于是呈现出了颜色。 当我们把光源的颜色与物体的颜色值 相乘 (而不是点乘),所得到的就是这个物体所反射的颜色。由此,我们可以定义物体的颜色为

    2024年02月12日
    浏览(44)
  • 【计算机图形学】OpenGL递归实现光线追踪

    计算机图形学课程设计:基于面向对象的光线跟踪算法设计与实现 目录 一、前言 二、项目实现与说明 1. 数据结构设计 1.1 光线 Ray 1.2 材质 Material 1.3 光照 Light 1.4 相机 Camera 1.5 球体Sphere 1.6 场景Scene 2. 算法实现 2.1 光线追踪算法原理与步骤 2.2 计算观察光线 2.3 光线与物体(球

    2024年02月08日
    浏览(45)
  • 计算机图形学实验四 OpenGL的鼠标交互绘制

    一、实验目的 1.掌握OpenGL的鼠标按钮响应函数。 2.掌握OpenGL的鼠标移动响应函数。 3.进一步巩固OpenGL的基本图元绘制基础。 二、实验内容 1.鼠标画草图——实现鼠标点到哪,线就画到哪。 思路: 1)在主程序注册鼠标响应和鼠标移动子函数: glutMouseFunc(mymouse); glutMotionFunc(mym

    2023年04月20日
    浏览(122)
  • GAMES101 计算机图形学 | 学习笔记 (上)

    1. C++中安装opencv库 2. C++中安装eigen库 3. C++中安装openGL库 步骤(1)glut下载 4. C++安装openGL库 步骤(2)VS中安装两个NuGet程序包 5. C++安装glew和glfw工具库 要注意的是 glew.h必须包含再glut.h之前 。 如下: 计算机图形学是利用计算机技术进行图像和视觉内容的创建、处理和显示的领

    2024年02月03日
    浏览(43)
  • 【计算机图形学 】扫描线多边形填充算法 | OpenGL+鼠标交互

    传送门 实现多边形扫描线填充算法,并和鼠标进行交互。 具体原理略过,会贴上完整代码,可直接运行。 环境: vs2019,OpenGL的库(可以搜索如何用vs使用OpenGL的库,可以使用vs自带的插件或者其他方法,很方便) 要点: 1.NET和AET的创建,改动 2.改变鼠标点击和鼠标拖拽的响应

    2023年04月08日
    浏览(78)
  • 计算机图形学,OpenGL编写的一个可实现旋转缩放移动的房间,内有数十种交互

    #include stdlib.h #includestdio.h #includewindows.h #include GL/glut.h #include math.h #include gl/GLU.h //颜色宏定义 #define white 1.0f, 1.0f, 1.0f #define black 0.0f, 0.0f, 0.0f #define red 1.0f, 0.0f, 0.0f #define blue 0.0f, 0.0f, 1.0f #define skyBlue 135.0/255.0, 206.0/255.0, 1.0f #define plum 1.0f, 187.0/255.0, 1.0f //浅紫色 #define pink 1.0f, 1

    2024年04月17日
    浏览(65)
  • Python+OpenCV 零基础学习笔记(4-5):计算机图形基础+Python相对文件路径+OpenCV图像+OpenCV视频

    【2022B站最好的OpenCV课程推荐】OpenCV从入门到实战 全套课程 CSDN标题里个括号对应视频的分P OpenCV+Python CSDN专栏 Gitee 项目地址 Python:3.11.5 Anaconda:23.7.4 IDE:vscode 运行环境:Windows OpenCV:4.8.1 Python+OpenCV 零基础学习笔记(1-3):anaconda+vscode+jupyter环境配置 本节课来了解以下OpenCV的简单使用

    2024年02月03日
    浏览(80)
  • 计算机图形学 期末复习笔记

    目录 第一章-导论 1. 计算机图形学的定义 2. 计算机图形学的应用领域 2.1 计算机图形学与其他学科的关系 3. 图形显示器的发展及其工作原理 3.1 阴极射线管(CRT) 3.2 随机扫描显示器 3.3 直视存储管显示器 3.4 光栅扫描显示器 4. 图形软件标准的形成 5. 三维图形渲染管线 第二章

    2024年02月12日
    浏览(47)
  • Part1:使用 TensorFlow 和 Keras 的 NeRF计算机图形学和深度学习——计算机图形学世界中相机的工作原理

    是否有一种方法可以仅从一个场景多张不同视角的照片中捕获整个3D场景? 有。 NeRF:将场景表示为用于视图合成的神经辐射场中(NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis),Mildenhall等人(2020)的论文解答了这个问题。NeRF的更简单实现赢得了 TensorFlow社区聚光

    2024年02月07日
    浏览(51)
  • 《计算机系统2》学习笔记

    目录 计算机系统漫游 Amdahl定理 信息的表示和处理 信息存储 进制转化 小端法 大端法 布尔代数 位级运算 逻辑运算 移位运算 整数表示 无符号数编码 补码编码 有符号数和无符号数之间的转换 扩展数的位表示 截断数字 整数运算 无符号加法 无符号数求反 有符号整数加法 补码

    2024年02月11日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包