[计算机图形学]几何:网格处理(前瞻预习/复习回顾)

news2025/1/12 11:57:38

一、前言 

网格的三种处理:网格细分,网格简化,网格正则化,细分会产生更多的三角面片来让模型更加光滑,简化则相反会减少网格的三角面片数量,正则化则会让三角形面更加规则。如上图中最右边两幅图,左边的一张奶牛网格的三角面片有很多狭长的三角形,而正则化可以让它变成右边那幅图,也就是三角面片都接近于正三角形,这在计算的时候会带来很多便利。而本篇我们主要介绍网格的细分和简化这两部分。

二、网格细分—Mesh subdivision

1.Loop subdivision—Loop细分

Loop细分分为两步,第一步是增加三角形的数量,它增加三角形数量的方法非常直接,直接取三条边的中点连线就可以从一个三角形细分出4个三角形。第二步就是调整顶点的位置,从而让模型更加光滑一些,而顶点又分为新生成的顶点和原来的顶点,它们的调整策略是不同的。

新生成顶点的调整策略:只要这个新顶点不在边界上,如上图,在网格内部的白点。那么我们设白点所在的这条线的两端顶点分别为AB,另外两个顶点为CD(顺序无所谓),那么新顶点的位置应该被更新为3/8*(A+B)+1/8*(C+D),实际上就是一种加权平均,AB两点因为距离近所以对它的影响更大一些。这也就是新生成顶点的调整策略。

原来的老顶点调整策略:同样用到加权平均,只不过用了新的规则,一部分受周围老的顶点的影响,另一部分受自己影响。(1 - n*u) * original_position + u * neighbor_position_sum

简单的说就是先确定这个老顶点(图中白点)的度 n(度:一个顶点连接几条边),再确定它临近顶点位置的总和sum,(再规定一个数u根据实际情况决定),那么就得到了上面的公式,也就是:  (1-n*u)*自己的位置+u*sum,很好理解,它揭示了如果这个点连接的三角形很多,则说明这个点不那么重要,所以它调整的位置更多的是根据它周围老顶点的影响,而反之,如果它连接的三角形很少,则说明这个顶点很重要,它自己的影响要大一些,决定调整位置的权重也就大一些。

2.Catmull-Clark Subdivision(General Mesh)—Catmull-Clark细分

 为什么要引入Catmull-Clark细分呢?我们前面提到的Loop细分只能细分三角形网格,而Catmull-Clark细分适用于更常规的情况,也就是它可以处理既有三角形又有四边形的网格。

在介绍之前我们先定义Catmull-Clark细分中的几个概念。

1.奇异点:度不为4的点,也就是上图中的紫色顶点

2.非四边形面:也就是上图黄色三角形标注的面

同样的Catmull-Clark细分也分为两部分,(1)引入新的顶点,(2)调整顶点的位置。

怎么引入新的顶点呢,我们对于每个面,在它们中间加入一个点,在它们的每个边上增加一个中点,再将它们连起来,如下图

从这我们还可以得出几个性质,我们发现细分之后增加了2个奇异点,老的奇异点的度为5,新的奇异点的度为3,而且我们发现只要在非四边形面点一点,那么它一定是奇异点。但我们也发现经过一次细分后,所有的非四边形面消失了,也就是说经过一次细分后,再次细分的时候就不会增加新的奇异点了。这说明Catmull-Clark细分具有很好的性质。

 又经过了2次Catmull-Clark细分后的网格

接下来就是调整顶点的操作,分为三种点,第一种是在面内新生成的点,第二种是在边中心点生成的新的顶点,第三种是老的顶点。它们分别有对应的不同的调整公式,如上图,总体来说仍然是一种加权平均的思想。

三、网格简化—Mesh simplification

网格的简化和细分同样重要,在有些情况,我们的计算性能不足以支持过多的三角形顶点的变换,在这种情况下我们就需要通过网格简化来减少顶点和三角形面片数来降低对性能的消耗。同时,在一个场景中,如果一个模型距离视线较远,那我们就不需要显示过多的层次细节,也就可以用细节层次较低的模型来减少性能消耗,这和Mipmap对纹理的优化是同一个道理,当然,纹理的层次结构的连续过度很好做,但网格的层次结构优化当今仍然是图形学正在研究的困难问题之一。

1.边坍缩—Edge Collapsing

这里介绍一种方法叫做边坍缩,也就是把几个顶点捏在一起,这样就减少了边面数,当然这里也有很多值得说的地方,比如我们怎么确定要坍缩哪条边,也就是哪条边对整个网格形体来说不太重要,以及新捏出来的点的位置应该放在哪?

而这里用到的方法叫做二次误差度量,对于新捏出的简化后的一个顶点,也就是上图中的蓝色的顶点,我们找到影响它的各个面,把该顶点与各个面的距离的平方和求出来,而在调整这个点的过程中,一定有一个位置是使得这个平方和最小的,那么这个位置也就是最优位置,那么新捏成的这个点的位置也就随之确定了。

再回到我们另外一个问题,怎么确定坍缩哪条边呢?这里同样用到二次误差度量,在一个网格中,我们对每条边都做一次二次度量误差,也就是说对每条边坍缩后对网格的整体影响做一个预计算并排序,那么开始坍缩的时候,先从那条二次度量误差最小的那条边做坍缩。

这里也有问题,那就是,我们每坍缩一条边之后,会对其它边的二次度量误差产生影响,也就是说,每坍缩一条边之后,我们的其它边坍缩后的对网格的影响要重新计算。也就是说我们需要一种数据结构,我们能瞬间取到最小值,也就是O(1),并且我们能动态的更新重新排序剩下的受影响的数据,也就是优先队列/堆这也就支持了我们每次取二次度量误差最小的边进行坍缩,然后再取受影响之后的二次度量误差最小的边进行坍缩,然后循环往复的过程。

还有一个问题,我们想对整体的网格进行简化且不损失整体轮廓,也就是说我们想找到的是对全局的一个最优化办法,但我们实际上做的是对一条边也就是局部找最优化办法,我们在试图通过局部优化达到整体的优化,这实际上是一种贪心算法,这并不是一种能完全保证全局最优性的算法。但在实际的场景中,几乎没有特别复杂的网格使得实际优化后的模型和这种贪心算法的结果相差的特别远的情况,所以人们还在用这种方法简化网格 。

 

四、总结 

到这里,几何部分的内容就就讲完了,我们从最开始的隐式,显式表示,到贝塞尔曲线和曲面,再到本篇的网格细分和简化都介绍了一遍,这部分和shader中的曲面细分着色器以及3ds MAX中的网格平滑操作都有很大的关系。下一篇将开启GAMES101光线追踪的部分,会涉及到很多物理学的知识,我们先从几何第三节的结尾的阴影图开始介绍,最后把鄙人所理解的通过我认为简单易懂的方式写出来,下篇见。

参考:

Lecture 12 Geometry 3_哔哩哔哩_bilibili

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

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

相关文章

SpringBoot监听器源码解析

1.1 创建SpringApplication对象 public static ConfigurableApplicationContext run(Class<?>[] primarySources, String[] args) {return new SpringApplication(primarySources).run(args); }SpringApplication(。。){//获取到所有配置的ApplicationListener类型的监…

Android中的多线程编程与异步处理

Android中的多线程编程与异步处理 引言 在移动应用开发中&#xff0c;用户体验是至关重要的。一个流畅、高效的应用能够吸引用户并提升用户满意度。然而&#xff0c;移动应用面临着处理复杂业务逻辑、响应用户输入、处理网络请求等多个任务的挑战。为了确保应用的性能和用户体验…

《springboot实战》第六章 实现自定义全局异常处理

前言 springboot实现自定义全局异常处理&#xff0c;以及统一返回数据。 1、分析 首先&#xff0c;实现全局异常的流程 从图中可以看到&#xff0c;实现全局异常会需要这样几个类&#xff1a; 自定义异常接口类自定义异常枚举类自定义异常类自定义异常处理类自定义全局响应…

藏在GPT背后的治理分歧:那些赞同和反对的人们|AI百态(下篇)

AGI的火种正在燎原。 一面是无可否认的AI生产力&#xff0c;正在赋能千行百业&#xff1b;而另一面&#xff0c;这团火似乎烧向了我们不可控的隐秘角落。 在《AI百态&#xff08;上篇&#xff09;——ChatGPT的“N宗罪”》中&#xff0c;我们提到监管重锤在落下&#xff0c;意大…

安装 Docker和基本操作实验文档

一、安装 Docker 目前 Docker 只能支持 64 位系统。 systemctl stop firewalld.service setenforce 0 #安装依赖包 yum install -y yum-utils device-mapper-persistent-data lvm2 yum-utils&#xff1a;提供了 yum-config-manager 工具。device mapper&#xff1a; 是Li…

分布式系统概念和设计-操作系统中的支持和设计

分布式系统概念和设计 操作系统支持 中间件和底层操作系统的关系&#xff0c;操作系统如何满足中间件需求。 中间件需求:访问物理资源的效率和健壮性&#xff0c;多种资源管理策略的灵活性。 任何一个操作系统的目标都是提供一个在物理层&#xff08;处理器&#xff0c;内存&a…

【网络安全】Xss漏洞

xss漏洞 xss漏洞介绍危害防御方法xss测试语句xss攻击语句1. 反射性xss2.存储型xss3.DOM型xssdvwa靶场各等级渗透方法xss反射型&#xff08;存储型方法一致&#xff09;LowMediumHightimpossible Dom型LowMediumHight xss漏洞介绍 定义&#xff1a;XSS 攻击全称跨站脚本攻击&am…

Twitter|GraphJet:推特的实时内容推荐(论文+源码解读)

以下内容具有主观性&#xff0c;有些问题的理解和回答不一定准确&#xff0c;仅供参考。翻译不确定的后面都有原文。 1.论文 1.1论文的动机是什么&#xff1f; 作者在追溯基于图推荐的系统的进化过程&#xff0c;发现了两大趋势&#xff08;更快更广&#xff09;。 趋势一是…

MySQL ,MyBatis 1.参数占位符 2. ParameterType 3. SQL 语句中特殊字符处理

1.参数占位符&#xff1a; 1&#xff09;#{}&#xff1a;执行sql时&#xff0c;会将#仔占位符替换为&#xff1f;&#xff0c;将来自动设置参数值 2&#xff09;${}&#xff1a;拼SQL。会存在SQL注入问题 3.使用时机&#xff1a; * 参数传递&#xff0c;都使用#{} *如果要对表名…

Elasticsearch:保留字段名称

作为 Elasticsearch 用户&#xff0c;我们从许多不同的位置收集数据。 我们使用 Logstash、Beats 和其他工具来抓取数据并将它们发送到 Elasticsearch。 有时&#xff0c;我们无法控制数据本身&#xff0c;我们需要管理数据的结构&#xff0c;甚至需要在摄取数据时处理字段名称…

腾讯云轻量服务器测评:4核8G12M带宽流量CPU限制说明

腾讯云轻量4核8G12M服务器446元一年&#xff0c;之前是4核8G10M配置&#xff0c;现在公网带宽和月流量包整体升级&#xff0c;系统盘为180GB SSD盘&#xff0c;每月2000GB免费流量&#xff0c;如果是选择买赠专区的4核8G12M配置是518元15个月&#xff0c;腾讯云百科来详细说下4…

MyBatis插入时获取自增id

关于MyBatis在插入时获取自增id 1.1 注释方法 Insert("insert into book(bid, bname, price, number, cratedate) values(null,#{bname},#{price},#{number},#{cratedate}) ")int add(Book book); //注意&#xff1a;在mapper中是不能重载的这里我特意写为add01Ins…

【力扣-JZ22】链表中倒数第k个结点

&#x1f58a;作者 : Djx_hmbb &#x1f4d8;专栏 : 数据结构 &#x1f606;今日分享 : "把手插进米堆的原因 " : 因为米堆类似于高密度的流体&#xff0c;会给人的手带来较大的压强&#xff0c;这种压强促进静脉血回流&#xff0c;会让人感到生理上的舒服。 文章目…

临床决策曲线分析如何影响预测模型的使用和评价

目前&#xff0c;临床决策曲线分析&#xff08;clinical decision curve analysis, DCA&#xff09;在业界已经被超过1500文献使用&#xff0c;也被多个主流的临床杂志所推荐&#xff0c;更被写进了临床预测模型撰写标准&#xff08;TRIPOD&#xff09;中&#xff0c;但是许多预…

OpenCV实例(七)汽车检测

OpenCV实例&#xff08;七&#xff09;汽车检测 1.概述2.代码实例3.代码功能 作者&#xff1a;Xiou 1.概述 对于图像和视频检测中的目标类型并没有具体限制&#xff0c;但是&#xff0c;为了使结果的准确度在可接受范围内&#xff0c;需要一个足够大的数据集&#xff0c;包括…

mongodb数据库索引介绍与优化选择

数据库开发系列 文章目录 数据库开发系列前言一、基础篇二、提高篇总结 前言 一、基础篇 MongoDB 索引 索引通常能够极大的提高查询的效率&#xff0c;如果没有索引&#xff0c;MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录。 这种扫描全集合的查…

broadcast自动扩展/合并与分割/基本运算

文章目录 一、broadcastKey ideamatch from last dim 二、合并catstack 三、拆分split&#xff1a; 四、基本运算matmulAn examplematmulpowerexp logapproximationclamp 五、统计属性总结 一、broadcast Key idea ▪ Insert 1 dim ahead ▪ Expand dims with size 1 to same…

测试概念篇

目录 调试和测试的区别软件测试的概念软件测试和软件开发的区别优秀的测试人员应该具什么素质为什么要做测试软件的生命周期什么是Bug什么是需求测试用例是什么产品的生命周期软件测试贯穿于软件的整个生命&#xff0c;如如何贯穿&#xff1f;开发模型瀑布模型&#xff08;面向…

【java】反射基础

Class类 import java.io.*; import java.util.Scanner;public class Main {public static void main(String[] args) throws ClassNotFoundException {Class<String> clazz String.class; //使用class关键字&#xff0c;通过类名获取Class<?> clazz2 Class.f…

SpringBoot源码学习系列——运行流程分析

前文SpringBoot源码学习系列——构造流程分析对SpringApplication的实例化流程进行了介绍&#xff0c;完成了基本配置文件的加载及初始化&#xff0c;本文对其run方法进行介绍&#xff0c;看看Spring Boot是如何启动运行的。 run方法核心流程 可以看到&#xff0c;SpringAppli…