计算机图形学入门18:曲面

news2024/11/27 9:48:31

1.曲面定义

        曲面(Surface)在图形学中应用非常广泛,可以用它来描述各种三维物体的表面。如下图所示。

2.贝塞尔曲面

2.1 介绍

        曲线和曲面一样都是物体显示的表示方法,自然可以把曲线的概念延伸到平面上。如上图所示,就是贝塞尔曲面(Bezier Surface)构成的表面,并且可以看到是分段面拼接的。

        如果对完整的表面进行分解,如上图所示,展示了空间中 4 x 4 个控制点所构成的贝塞尔曲面。贝塞尔曲线控制点都是在同一平面内,那么贝塞尔曲面的控制点则是分部在三维空间中。

2.2 绘制算法

        贝塞尔曲面的绘制算法本质上还是基于 De Casteljau's Algorithm 进行多次绘制。如下图所示,首先基于预设的所有控制点(比如:4 x 4 的控制点),绘制 4 条贝塞尔曲线(灰色线)。然后在与曲线垂直的平面中开始绘制曲线,以 4 条贝塞尔曲线上的点作为控制点(输入一个时间),绘制贝塞尔曲线(蓝色线)。

        以此类推(给定另外时间 ) ,不断地输入控制点,最终得到一个贝塞尔曲面。如下图所示。

        那么不同的贝塞尔曲面如何拼接在一块?

2.3 计算(u,v)对应的曲面位置

        在上述绘制贝塞尔曲面中,需要两个不同的时间 t ,在绘制水平面上需要一个时间 t 绘制四条赛贝尔曲线。然后找到 4 个控制点后连成曲线,还需要一个时间 t 绘制。也就是说需要一个二维的数值去控制,可以用[u,v]去表示。如下图所示。

        这样就可以用某一个u沿着四条贝塞尔曲线找到时间u的位置,这样得到四个蓝色的点。再输入v,在蓝色曲线上找到时间v。这样就找到了一个点(u,v),这个点就是曲面在参数u,v下面的位置。那么就可以得到在参数u,v都在0-1范围内,就可以映射成曲面上的任何一个点。如下图所示。

        这也说明贝塞尔曲线是显式几何表示,因为是通过参数映射过去的。

        使用(u,v)可以映射曲面上的任何一点,所以在四条曲线上分别得到一个点,再连成一条新的曲线。遍历所有的 u,v值就可以成功得到一个贝塞尔曲面。如下图所示。

3.网格处理

        根据上述绘制算法,我们可以得到基于多边形网格的曲面,一般网格都是三角形组成。在实际应用中,我们会对曲面形成的网格进行进一步的处理。常见的曲面处理操作:网格细分(Mesh Subdivision)网格简化(Mesh Simplification)网格正规化(Mesh Regularization)

3.1 网格细分

        网格细分就是把一个多边形拆分成多个多边形,其目的是增加三角形数量,细节更加丰富,表面更加光滑。如下图所示。

        网格细分又可分为Loop细分Catmull-Clark细分

3.1.1 Loop细分

        Loop细分是三角网格常用的细分规则。主要有两步操作,首先拆分出更多的三角形(顶点),然后移动三角形的位置,使表面变得光滑。如下图所示。注意:这里loop不是循环的意思,是发明人的名字。

1.将一个三角形拆分四个

        连接三角形每条边的中点,即可将拆分成四个三角形。如下图所示。

 2.根据权重分配新的位置,使表面平衡。

        将顶点分为旧顶点新顶点,新顶点就是拆分三角形取中点的点,旧顶点就是原三角形的顶点。对于这两种不同的顶点,分别用不同的规则改变位置。

        对于新顶点的位置更新,如下图白点举例,基于周围四个旧顶点求加权平均,离它近的顶点权重大,设为 3/8,离它远的顶点权重小,设为 1/8。如下图右侧公式所示计算白点位置,其他新顶点同理求得。

        对于旧顶点的位置更新,如下图白色点为例。

        基于周围几个旧顶点求加权平均,其中各个点的权重值与待更新点(白点)的度(Degree)有关,顶点的度是指这个顶点连接的边的数量。

        在这里我们定义一个n,为顶点的度。再定义一个u,这个u仅仅是一个与顶点的度有关的数。最终的计算公式如下:

        从这个公式可以看到,当顶点的度很大(连接了很多三角形),那么这个顶点基本就可以由周围的旧顶点决定位置,当顶点的度很小(连接的三角形很少),那么这个顶点原来位置的权重就会很大。

        以上就是Loop细分的全过程了,如下图所示是做两次loop细分的例子。

        Loop细分只针对三角形面进行细分。如下图是一个不断进行Loop细分的例子。

3.1.2 Catmull-Clark细分

        正如上文所说Loop细分针对是所有三角形面,那么对于不仅仅只有三角形面该怎么办呢?这也就有了Catmull-Clark细分。与loop细分同理,Catmull-Clark细分也是先增加顶点,再移动顶点位置。

        接下来看如何做Catmull-Clark细分这里以四边形面和三角面的混合为例,先定义两个概念。如下图所示。

        1.对于所有不是四边形的面,称之为Non-quad face。

        2.所有度不为4的顶点称之为奇异点。

        每次细分步骤:在每个面中心都添加一个顶点,在每条边的中点也都添加一个点,面中心的新顶点连接所有边上的新顶点,结果如下图所示。

        经过一次细分后,有以下几个问题。

        1.现在还有几个奇异点?

        2.这些奇异点的度是多少?

        3.有多少个Non-quad face?

        考虑这几个问题,其实也是一些Catmull-Clark细分的特点

        1.有几个非四边形面,就会多出几个奇异点,原本的面是非四边形那么中间一定会出现一个奇异点。所以现在一共有2+2 = 4个。

        2.新多出来的奇异点的度数与原来所在面的边数相等,原来奇异点的度不变。所以新奇异点就是3度,原来的奇异点还是5度。

        3.第一次细分之后所有非四边形面都会变成四边形,且往后奇异点数目不再增加,所以是0个。

        这里再做一次细分,结果如下图所示。

        可以看到奇异点依然是4个,不再改变。

        以上进行了增加顶点,那么接下来如何对顶点进行位置更新呢?

        这里将所有顶点的更新分为三种,第一种是对于面的中心点 的更新,第二种是对于边的中心点 的更新,第三种是对于老的顶点 的更新。

        对于各类顶点位置调整如下图所示。

3.1.3 Loop细分与Catmull-Clark细分的区别

        loop细分只能做三角面的细分,而Catmull-Clark细分可以做各种不同面的细分。

3.2 网格简化

        网格简化是网格细分的逆过程,其目的是为了减少三角形数量,从而提升性能。在实际应用中,一些距离很远的物体不需要丰富的细节,可以进行网格简化。如下图所示。

3.2.1 网格简化算法

        曲面简化的目的是在保持整体造型的同时减少网格元素的数量。如下图所示,一个模型从3万个顶点到30个顶点的过程,可以看到细节是越来越差的。

        如下图所示,当模型距离很远或者很小的时候,3万个顶点与3千个顶点看上去差别并不大,顶点多浪费了性能开销,就需要简化。

        那么,怎么样去计算这个过程?

        曲面简化所利用的一个方法叫做边坍缩(Edge Collapse)。如下图所示,就是将一条边的两个顶点合成为一个顶点。

        但随之而来的问题就是,曲面简化需要尽量保持原本模型的基本轮廓,如何坍缩一条边,或者说坍缩哪一条边能够使得原模型样貌被改变的程度最小,这就是曲面简化的关键所在。

        如下图所示,是一个将中间三个顶点简化成一个顶点的位置,先做了一次平均处理得到的结果。可以发现得到新的三角形无论如何都比原来的面小,那肯定是不对的。

        为此引入一个误差的度量,即二次误差度量(Quadric Error Metrics)

        把这个新生成的顶点放置在某个位置上,使得这个顶点到原来相关联的各个面的距离的平方和达到最小(上图中的边代表三角面)。如果能够使得这个误差最小那么对整个模型样貌修改一定程度上也会较小。

        对于整个模型有很多条边,假设如果坍缩一条边,并且算出把这个坍缩后的点放在最佳的位置上会得到一个多大的二次度量误差?对于整个模型而言,每次肯定都是要坍缩二次度量误差最小的边开始。

        综上,这整个曲面简化的算法流程如下。

        1.为模型每条边赋值,其值为坍缩这条边之后,代替两个老顶点的新顶点所能得到的最小二次误差度量。

        2.选取权值最小的边做坍缩,新顶点位置为原来计算得出使得二次误差最小的位置。

        3.坍缩完之后,与之相连其他的边的位置会改动,更新这些边的权值。

        4.重复上述步骤,直到到达终止条件

        但是问题是,如果坍缩了一条边,会有一些临近边的位置要跟着这条坍缩的边变化,那么这些边的二次度量误差就会随之发生变化。

        因此这里要通过一种数据结构,既可以每次取到二次度量误差的最小值的边,又可以动态地以最小的代价去更新其他的受影响的元素。那么这里要使用的数据结构就是堆(优先队列),允许求最小,并且运行时动态更新任何一点的值。

        在任意一个局部(任意一个位置一条边)附近都找最优的做法,通过不断找局部最优的方式来找全局的最优解。这其实是一个标准的贪心算法,可能到不了全局最优解,但事实证明最终的结果依然相当不错,如下图所示。

3.3 网格正规化

        网格正规化就是让三角形不至于出现特别尖、特别长的三角形,变成接近正三角形相似的三角形。需要注意的事,在改善三角形质量的同时不能丢失模型本身的质量。如下图所示。

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

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

相关文章

数组移除元素算法(以JS为例)

题目:LeeCode第27题 答案: 算法思想:双指针 这段代码实际上使用了一种简化版的双指针技术来实现元素的移除。这里的双指针技术并不是传统意义上的两个指针,而是一个索引k作为辅助指针,用来记录新数组(或原…

梯度提升决策树(GBDT)的训练过程

以下通过案例(根据行为习惯预测年龄)帮助我们深入理解梯度提升决策树(GBDT)的训练过程 假设训练集有4个人(A、B、C、D),他们的年龄分别是14、16、24、26。其中A、B分别是高一和高三学生&#x…

分解数据堆栈:存储和计算 2.0 的分解

在LinkedIn上,有一篇优秀的帖子在数据和数据库人群中流行。它由 Theory VC 合伙人 Tomasz Tunguz 撰写,讲述了我们自 2019 年以来讨论的趋势。 数据库正在成为高速查询引擎,并正在抛弃存储。这并不意味着存储不重要,相反&#xf…

灵感枯竭?来看Charls,新指标发一区(IF=9.3)| CHARLS等七大老年公共数据库周报(6.12)...

七大老年公共数据库 七大老年公共数据库共涵盖33个国家的数据,包括:美国健康与退休研究 (Health and Retirement Study, HRS);英国老龄化纵向研究 (English Longitudinal Study of Ageing, ELSA);欧洲健康、…

网页抓取单词关联

在当今数字化的时代,数据的获取与处理成为了众多企业和开发者关注的焦点。API 服务的出现,为我们打开了高效、便捷获取和利用数据的新大门。接下来,为您介绍几款独具特色的 API 服务,它们将为您的业务和开发工作带来前所未有的便利…

idea中tomcat控制台乱码

文章目录 解决IDEA中tomcat控制台中文乱码问题1.方法一2.方法二 解决IDEA中tomcat控制台中文乱码问题 网上有很多的教程,这里我给大家汇总一下 1.方法一 file –>Settings 点击Settings–>选择点击Editor—>选择点击General–>选择点击Console –>…

【pytorch02】手写数字问题引入

1.数据集 现实生活中遇到的问题 车牌识别身份证号码识别快递单的识别 都会涉及到数字识别 MNIST(收集了很多人手写的0到9数字的图片) 每个数字拥有7000个图像train/test splitting:60k vs 10k 图片大小28 28 数据集划分成训练集和测试集合的意义…

【因果推断python】50_去偏/正交机器学习2

目录 Frisch-Waugh-Lovell on Steroids CATE Estimation with Double-ML Frisch-Waugh-Lovell on Steroids 双重/偏差 ML 其思想非常简单:在构建结果和治疗残差时使用 ML 模型: 是估计,是估计 我们的想法是,ML 模型具有超强的…

python创建虚拟环境venv

为什么要创建虚拟环境 使用python创建虚拟环境是为了让项目的依赖隔离开来,互不干扰,使得每个项目都运行在一个独立的Python环境中。 创建虚拟环境 1. 命令行创建 step1. 创建 # 1. 进入到你的项目目录中 cd myproject # 使用python创建一个虚拟环境…

2024年化学、能源与核工程国际会议(ICCENE 2024)

2024年化学、能源与核工程国际会议(ICCENE 2024) 2024 International Conference on Chemical, Energy and Nuclear Engineering (ICCENE 2024) 会议地点:三亚,中国 网址:www.iccene.com 邮箱: iccenesub-conf.com 投稿主题请注明:ICCEN…

osgVerse加载3dtiles

本文利用osgVerse中的osgdb_3dtiles插件,展示其加载倾斜模型3dtiles的效果,并对其实现做的分析,分析其按照osg的场景结构显示3dtiles的方法。 目录 1 osgVerse显示3dtiles效果2 osg的场景结构与3dtiles结构分析3 部分代码实现细节内容 1 osgVerse显示3dtiles效果数据下载地址…

头歌资源库(14)残缺棋盘

一、 问题描述 二、算法思想 首先,将2^k 2^k的棋盘划分为四个相等大小的子棋盘,定义为左上、左下、右上和右下四个子棋盘。 然后,根据残缺格的坐标,确定其中一个子棋盘是不完整的,即残缺子棋盘。假设残缺子棋盘是左…

Pytest框架中pytest.mark功能

文章目录 mark功能 1. 使用pytest.mark.skip 2. 使用pytest.mark.skipif 3. 使用 pytest.mark.xfail 4使用pytest.mark.parametrize 5 使用pytest.mark.自定义标记 6 使用pytest.mark.usefixtures pytest 的mark功能在pytest官方文档是这样解释的: https://…

【C语言】解决C语言报错:Buffer Overflow

文章目录 简介什么是Buffer OverflowBuffer Overflow的常见原因如何检测和调试Buffer Overflow解决Buffer Overflow的最佳实践详细实例解析示例1:字符串操作不当示例2:数组访问越界示例3:未检查输入长度示例4:使用不安全的函数 进…

公共 IP 地址和私有 IP 地址的区别总结

什么是IP地址? IP 地址,即互联网协议地址(Internet Protocol Address),是网络设备在网络中进行通信的标识。IP 地址可以看作是设备在网络中的“地址”,有助于数据包在网络中找到正确的接收端。IP 地址主要…

FP7195做大功率钓鱼灯应用方案,0.1%深度无极无频闪调光调色应用,调光曲线顺滑无突兀

文章目录 文章目录 方案背景 一、夜钓灯电路框架 二、FP7195芯片介绍 芯片参数 总结 方案背景 目前夜钓正在逐渐变得时尚起来,随着夜钓群体的年轻化,人们对于夜钓灯的审美要求也越来越高。夜钓灯作为夜间钓鱼的重点装备,不仅仅需要高质量的光…

视频号封禁VS京东支持,AI虚拟主播是红利还是“毒药”?

大数据产业创新服务媒体 ——聚焦数据 改变商业 在数字化浪潮的推动下,AI技术正以前所未有的速度渗透到我们生活的每一个角落。而当AI技术遇上直播带货,一个全新的概念——AI数字人直播带货,便应运而生。这不仅仅是一场技术的革新&#xff0…

定时任务查看报拒绝权限,不执行

排查思路: 1、查看/etc/cron.deny ##此文件是空的 cat /etc/cron.deny只有cron.deny文件。但文件无内容,不存在限制(如果存在cron.allow文件,以cron.allow文件优先;若cron.allow和cron.deny都存在,以cron…

力扣SQL50 查询结果的质量和占比 AVG(条件)

Problem: 1211. 查询结果的质量和占比 &#x1f468;‍&#x1f3eb; 参考题解 Code select query_name,round(avg(rating/position),2) as quality,round(100 * avg(rating < 3), 2) as poor_query_percentage from Queries group by query_name -- 到此结束过不了最后一…

el-upload 组件上传文件(查询,上传,删除,下载功能)

1.html el-upload中的属性&#xff1a; <el-upload ref"upload" class"upload-demo" // element-ui自带的样式 :headers"headerOdj" // 文件上传的头,带token&#xff08;重要&#xff0c;不然传输大文件会断掉&…