12、计算机图形学——几何(网格细分与网格简化)

2023-11-10

一、网格细分

1.1、概念

网格细分指的是将原有模型上的网格分成更多个网格,从而将模型变得更加精细,提高渲染出来的效果,让画面更加漂亮

下图就是一个网格细分的示意,左图是细分前的效果,右图是细分后的效果

可见,细分后的面数更多,模型更加精细。

1.2、网格细分算法

1.2.1、Loop算法

首先说一下,Loop是人名,不是循环。Loop算法的主要过程如下:

(1)、将三角形按照下图的方式一分为四

(2)、计算细分完之后,新顶点的位置

如上图所示,白色顶点就是新顶点的其中一个,其位置由老顶点加权平均构成,因为AB距离新顶点较近,所以权重较大相比CD较大

特殊情况就是一个边仅仅属于一个三角形面(也就是说,该三角形面位于模型的边缘位置),那么在该条边上新加一个顶点的坐标可以表示为两个端点的平均

(3)、计算细分完之后,老顶点的位置

上述公式用数学化的方式表示出来是这样的

O表示老顶点原来的位置,O‘表示老顶点现在的位置,n表示的是老顶点的度(有多少个边连接到这个顶点上),β表示的是一个和n有关的权重,后面的累加表示周围顶点的坐标和

原先老顶点的权重是1-nβ,如果老顶点的度越大,表示周围的顶点越多,那么,在重新调整位置的时候,老顶点原来的权重也就不是那么重要,因此,经过1-nβ的计算后,老顶点的权重就会变小

反之,如果如果老顶点的度越小,表示周围的顶点越小,那么,在重新调整位置的时候,老顶点原来的权重就需要很大,1-nβ的计算后,老顶点的权重就会变大

1.2.2、Loop细分的结果

1.2.3、Catmull-Clark细分

Loop细分算法只适用于网格都是三角形的情况,如果出现了多边形网格,Loop算法就不适用了,所以,为了解决多边形网格的细分问题,Catmull-Clark网格细分算法出现了

先根据下图给出两个定义:

非四边形面:所有网格中,不是四边形的面

奇点:度不为4的点

这里以三角形为例

细分规则如下:

在每个面的中心或者重心都新加一个点,在每个边的中点也新加一个点,将新顶点连接起来,效果如下图

右下角的问题如下:

1、新增2个奇点,有几个非四边形,就会多几个奇点,现在一共4个奇点

2、新增奇点的度是3,与原来非四边形的边数一致

3、一次细分后,所有网格都是四边形

所以,这次细分完之后,只要在每个四边形上多加四个顶点和一个中心点,就可以进行无限细分

点的类型也被分为了三种,首先是面点,就是四个顶点取平均,如下如中的f

还有就是边点,是相邻两个面点和两个顶点的取平均

还有一种点和四个面相邻,计算方式如下

Catmull-Clark细分算法的结果如下

二、网格简化

2.1、概念

网格简化和网格细分的作用相反,主要是为了降低渲染效果,加快渲染速度,为啥要这么做呢?比如游戏中有个骷髅头,如果无论远近全部采用一样的模型,那么,当模型离相机很远时,就会和很近时的定点数相同,渲染速率相同,但是,其实在远处,并不需要这么精确的模型,即使是300个三角的骷髅,在远处的效果和3W个三角形的模型也没差多少,因此就有了网格简化的需求

2.2、边坍缩算法

所谓边坍缩算法就是一个边的两个顶点合成为一个顶点,从而让一条边小时,而且合成后还要最大程度上保持原有模型的形状

为了最大程度上保持原有模型的形状,引入了二次误差度量,该度量方法的原则就是合并后的新顶点,应当到合并前两个老顶点周围若干三角形所在平面的距离的平方和最小

对于一个三角面,所在平面方程为ax + by + cz + d = 0。对于这种平面方程, 空间中任意一点到这个平面的距离就是直接点的xyz代入。

因此,距离的平方的函数为d = (ax + by + cz + d)^2。那么所有平面的距离平方和就是把所有三角面的这个函数相加,最后求最小值。

写成矩阵的形式就是

之后,对deltaV进行求偏导,是的三个方向的偏微分都为0,就能得出哪两个点合并之后,deltaV最小

二次型展开后如下

求完偏导的矩阵形式如下式

如果左边的矩阵可逆

如果矩阵不可逆,则对V1和V2进行插值查找最优点,如果仍不存在最优,直接认为合并后的点是(v1+v2)/2

上述过程只是对任意一对点的计算,而最终需要对所有对儿点都进行这个流程,

最终算法的伪代码如下

2.3、算法效果

因为每次简化都能保存简化前的网格结构,所以,可以将这个网格结构全都保存起来,当切换相机的远近景时,可以显示不同的网格结构

参考

Loop 细分曲面(loop subdivision)详解,附Python完整代码_McQueen_LT的博客-CSDN博客

【图形学】网格简化及边坍缩( Edge Collapse )算法_wk_119的博客-CSDN博客

Surface Simplification Using Quadric Error Metrics (mgarland.org)

QEM网格简化 - 简书 (jianshu.com)

GAMES101-现代计算机图形学入门-闫令琪_哔哩哔哩_bilibili

欢迎大家评论交流,作者水平有限,如有错误,欢迎指出

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

12、计算机图形学——几何(网格细分与网格简化) 的相关文章

随机推荐

  • TVM编译安装

    本文是在已大致了解tvm功能和架构的基础上 根据官方文档 在x86 64 Ubuntu 18 04 GPU Pytorch1 8 0上安装TVM的流程 参考文档 TVM安装官方文档 llvm下载链接 1 下载源代码 从tvm官网下载源代码
  • 基于粒子群算法优化支持向量机(PSO-SVM)的时间序列预测。模型评价指标包括:R2、MAE、MSE、RMSE和MAPE等,代码质量极高,方便学习和替换数据。

    清空环境变量 warning off 关闭报警信息 close all 关闭开启的图窗 clear 清空变量 clc 清空命令行 tic 导入数据 f xlsread windspeed xls Sheet1 B2 B1001 x y da
  • Jina AI x 矩池云

    近 5 年以来 图片 视频 语音等非结构化数据的数量 出现了爆发式增长 随着深度学习技术的不断升级 深度表征学习 迁移学习 对比学习等技术日益成熟 非结构化数据的搜索也逐渐形成可能 在此背景下 专注于神经搜索技术的商业开源软件公司 Jina
  • DRM框架(vkms)分析(3)----connector->func && connector->helper_private的使用

    一 connector gt func drm connector funcs类型的对象实例 其中有些对象实例可直接使用helper函数 有些可以自定义 还有一些可以忽略掉不赋值的 struct drm connector funcs co
  • ubuntu12.04搭建android开发环境

    一直准备学一点Linux的东西 一直没有付诸行动 这个周末准备安装一下 做了将近半年的android开发 准备学一点关于框架和源码的东西 安装之前也百度谷歌了很多次 也看了网上不少的资料 总结一点 就是对于像我这种入门级的人来说 还是不够明
  • 5种创建Dataframe方法

    下面将简要介绍Dataframe的5种创建方法 由于输出结果比较冗余 这里将不会展示输出结果 读者可以自行赋值粘贴 最好使用jupyter运行 并查看结果 另外的 代码中有非常详细的注释 Dataframe创建方法一 import nump
  • 【网络】UDP协议详解

    目录 UDP的感性理解 UDP协议格式 UDP协议格式感性理解 UDP特点 UDP的缓冲区 UDP的感性理解 UDP的传输过程类似于寄信 假设你要写一封家书寄回家里 首先你要在信封上填写好寄件人和收件人的地址 其次在贴好邮票 最后将信件投放
  • java深拷贝循环单链表,JZ25-复杂链表的复制

    题目描述 输入一个复杂链表 每个节点中有节点值 以及两个指针 一个指向下一个节点 另一个特殊指针random指向一个随机节点 请对此链表进行深拷贝 并返回拷贝后的头结点 注意 输出结果中请不要返回参数中的节点引用 否则判题程序会直接返回空
  • 由栈和队列完成数组的逆置操作(C语言)

    将数组a 11 1 3 6 10 15 16 17 18 19 20 通过栈和队列实现元素逆置的算法 入栈 gt 出栈 gt 入队 gt 出队 include stdio h include stdlib h typedef int dat
  • LangChain 中的嵌入

    在自然语言处理 NLP 领域 嵌入已经成为游戏规则的改变者 它们使我们能够将单词和文档转换为计算机可以理解的数字 这些数字表示 称为嵌入 对于理解文本 分析情感和翻译语言等任务至关重要 本文探讨了LangChain中的嵌入 这是一个用于创建
  • windows上bug崩溃定位分析(Qt或者VS)

    任何情况下 都不能保证自己写的代码不会发生崩溃 崩溃不可怕 可怕的是无法定位哪里崩溃 特别是客户那边崩溃 开发者这边不崩溃 问题陷入僵局 自从有了下面这个神奇的代码 再也不怕了 以下代码亲自测试没问题 1 如果是在VC 中 那么只需要将下列
  • 干货系列三:一台服务器能承载多少人同时访问?

    有很多人都会问这个问题 服务器能承载多少人同时访问 这个问题其实是很难有一个非常准确的答案的 因为服务器能同时承载的在线人数是受到多方面因素共同影响的结果 比如带宽 服务器处理速度以及访问页面的大小等等因素 虽然很难有一个精确的答案 但是服
  • 60秒轻松计算出任意一年任意一天星期几?

    60秒轻松计算出任意一年任意一天星期几 一 提出问题 60秒就可以轻松计算出任意一年任意一天星期几吗 你相信吗 如果能算出 连脑神经专家都认为是神童 大家可以通过度娘搜索 张戈 自闭症 连人民网都有报道 有图为证 如何快速计算出任意一年任意
  • Spring Security详解

    第一节 Spring Security 简介 Spring 是一个非常流行和成功的 Java 应用开发框架 Spring Security 基于 Spring 框架 提供了一套 Web 应用安全性的完整解决方案 一般来说 Web 应用的安全
  • maven高级学习

    maven高级 一 idea创建maven项目 1 1 idea中创建maven web项目 1 2 idea中使用tomcat 1 3 插件和依赖的区别 二 依赖管理 2 1 依赖配置 2 2 依赖传递 2 2 1 依赖传递中的冲突问题
  • Yii Framework 开发教程(14) UI 组件 MaskedTextField示例

    CMaskedTextField为格式输入框 可以为文本框指定Mask限制用户可以出入的文本格式 如本例使用99 99 9999 可以只允许输入类似日期的文本 修改View 添加CMaskedTextField 组件 php view pl
  • java比较mysql两个数据库_用java实现操作两个数据库的数据

    1 首先需要在jdbc的配置文件里面配置两个数据库的连接 数据库1的配置 driverClassName com mysql jdbc Driver url jdbc mysql 地址 3306 数据库名 useUnicode true c
  • 【SQL入门系列二】SQLZOO 分组

    分组 5 SUM and COUNT 5 SUM and COUNT Aggregate functions SUM COUNT MAX AVG SUM 世界总人口 SELECT SUM population FROM world Afri
  • springboot整合ehcache

    springboot整合ehcache springboot版本 2 5 1 1 pom文件
  • 12、计算机图形学——几何(网格细分与网格简化)

    一 网格细分 1 1 概念 网格细分指的是将原有模型上的网格分成更多个网格 从而将模型变得更加精细 提高渲染出来的效果 让画面更加漂亮 下图就是一个网格细分的示意 左图是细分前的效果 右图是细分后的效果 可见 细分后的面数更多 模型更加精细