GAMES101学习笔记(六):Geometry 几何(基本表示方法、曲线与曲面、网格处理)
文章目录
- 几何的表示方法
- 隐式几何 Implicit Geometry
- 代数曲面(Algebraic surface)
- 构造实体几何CSG(Constructive Solid Geometry)
- 距离函数(Distance Function)
- 水平集方法(Level Set Methods)
- 分型几何(Fractal)
- 显式几何 Explicit Geometry
- 点云(Point Cloud)
- 多边形网格(Polygon Mesh)
- 曲线和曲面
- 曲线 Curves
- 贝塞尔曲线 Bézier Curves
- 绘制贝塞尔曲线——De Casteljau Algorithm
- 几何形式
- 代数形式
- 贝塞尔曲线性质
- 分段贝塞尔曲线 Piecewise Bézier Curve
- 样条曲线 Spline Curve
- 曲面 Surfaces
- 贝塞尔曲面 Bézier Surfaces
- 绘制贝塞尔曲面 Evaluating Bézier Surfaces
- 几何处理/网格处理
- 网格细分 Mesh subdivision
- 网格简化 Mesh simplification
课程资源:GAMES101-现代计算机图形学入门-闫令琪
Lec10 ~ 12 学习笔记:
Lecture 10 :Geometry 1 (Introduction) ——几何(基本表示方法)
Lecture 11 :Geometry 2 (Curves and Surfaces) ——几何(曲线与曲面)
Lecture 12 :Geometry 3 (Mesh)——几何(网格处理)、阴影图
几何的表示方法
- 隐式表示
- 显式表示
隐式几何 通过方程定义,适合判断点位置和布尔运算。
显式几何 通过参数方程定义,适合绘制和采样。

隐式几何 Implicit Geometry
隐式几何通过方程定义形状,通常表示为f(x,y,z)=0。点在曲面上当且仅当满足该方程。
优点:
1)是一种紧凑的表达,可以节省空间
2)很容易查询一个点和表面的内外关系以及点到表面的距离
3)隐式表面比显式表达更容易和光线进行求交(ray-to-surface intersection)
4)对于简单的形状,隐式表达可以准确描述形状,没有采样误差
5)处理拓扑上的变化很容易,例如很方便处理流体
缺点:很难建模复杂的物体(但是显式表达方法可以表示)
代数曲面(Algebraic surface)
并不是直接表示点的位置,而是定义物体上的点满足的关系 f(x,y,z)=0 ,满足这个关系的点就在物体上,通过将点进行归类来获得物体上的点的集合。

构造实体几何CSG(Constructive Solid Geometry)
通过对一些基本的几何形状进行一些运算(Boolean operation)得到复杂的形状,且该方法在各种三维建模工具中应用广泛。

距离函数(Distance Function)
不直接描述物体的表面,该方法使用函数表示空间中的点到物体的表面的最小距离(并且这个距离是有符号,如果点在物体之外,距离的符号为正;如果点在物体的内部,距离的符号为负),距离函数的值为0的点都在物体的表面上,这样的距离函数表示又称为有符号距离场(SDF)
SDF适合做基于距离函数的融合来实现两个物体的融合: 对两个物体的SDF做融合实际上是对两个物体的边界做融合

水平集方法(Level Set Methods)
Level Set方法中使用一个网格来近似距离函数,每个网格中都有一个值表示距离, 通过双线性插值可以求解距离等于0的位置,连接这些点就是表面。

水平集不仅可定义在二维空间中的格子上,也可定义三维空间中的网格上,此时对于对一个每个点表示密度的三维纹理来说,让密度等于某个值得到的水平集就是物体的表面。


分型几何(Fractal)
表示子相似性:自身的一个部分和整体的相似性(形状本身可能是递归生成的, 比如雪花)。
当形状本身是递归生成时,在渲染过程中会因为形状的变化频率太高而产生走样。

显式几何 Explicit Geometry
与隐式几何相对的就有显式几何,显式的方法有直接给出点的位置,或者用参数映射(定义一个函数,将二维平面上一个区域中的二维坐标点映射到三维空间的表面上去)
显式几何通过参数方程直接表示形状,通常形式为 p(u,v)=(x(u,v),y(u,v),z(u,v)),其中 u 和 v 是参数。
优点: 易于绘制和采样,适合渲染和建模。
缺点: 判断点是否在曲面上较复杂,布尔运算和求交困难。
点云(Point Cloud)
不考虑物体是一个表面,而是表面为一堆点,只要点足够密集,就看不到点与点之间的缝隙。理论上可以表示任何几何。通常三维扫描等得到的结果就是点云。
点云经常被转换成多边形网格(polygon mesh)形式的数据。

多边形网格(Polygon Mesh)
图形学中应用最广泛的表达形式,表示四边形或三角形组成的面,更易于进行处理/模拟、自适应采样(adaptive sampling)

可用Wavefront Object File(
.obj) 形式的文件的去存储mesh形式的数据: 在text文件中记录所有顶点坐标、法线、纹理坐标和顶点之间的连接关系,通过定义一个face(三角形的三个顶点各自的坐标索引,纹理坐标索引,法线索引)来表示顶点之间的连接关系。

曲线和曲面
Bezier surface,subdivision surface,NURBS(非均匀有理B样条曲线) 等。
曲线 Curves
贝塞尔曲线 Bézier Curves
贝塞尔曲线是需要一系列的控制点去定义某一个曲线(通过参数t来定义,显式表示)
三次贝塞尔曲线(Cubic Bezier Curve)使用四个控制点 P0, P1, P2, P3 来定义曲线, 曲线的起始点和终止点必须是 P0 和 P3,并且这四个点确定了曲线的两条切线:曲线在起点处的切线t0 , 在终点处的切线t1。

绘制贝塞尔曲线——De Casteljau Algorithm
通过De Casteljau算法生成贝塞尔曲线,实现的是使用任意多的点来绘制一条Bezier曲线,例如但当只有两个点时为一条线段,三个点时生成的是二次贝塞尔曲线(quadratic Bezier curve),四个控制点生成的是三次贝塞尔曲线(Cubic Bezier Curve)。
几何形式
三个控制点生成二次贝塞尔曲线(quadratic Bézier curve):

四个控制点生成三次贝塞尔曲线(Cubic Bézier Curve):
同样是对控制点进行递归线性插值的过程

代数形式
在计算三次贝塞尔曲线的过程中,我们是在每两个之间找一个时间t,相当于每两个之间线性插值。

推广到n阶:给定n+1个控制点,可得到n阶的贝塞尔曲线,任意时刻t下曲线上的点是n+1个控制点的线性组合,组合的系数是和时刻t相关的多项式(成为Bernstein polynomial),所有系数多项式的和为1,每一项系数可以看做是(t+1-t)^n
的展开项。

贝塞尔曲线性质
-
仿射变换性质:
对贝塞尔曲线做仿射变换,不需要对曲线上的每一个点做仿射变换,只需要对控制点做仿射变换,然后利用变换后的控制点来生成曲线, 该曲线就是变换后的贝塞尔曲线。(在其他的变换(eg:投影变换)下这样做不行) -
凸包性质(Convex hull property):
凸包是能够包围给定的几何形体的最小的凸多边形.
生成的贝塞尔曲线是在控制点形成的凸包内的,eg:如果四个控制点在一条直线上,则生成的贝塞尔曲线一定是连接起点和终点的线段。
贝塞尔曲线的缺点:
- 当控制点多时,不容易通过控制点来控制曲线的形状
- 改变一个控制点的位置,整条贝塞尔曲线上的点的位置都会变化。实际应用时,期望曲线具有"局部性":改变一个控制点,只会影响部分范围内的点。
分段贝塞尔曲线 Piecewise Bézier Curve
分段贝塞尔曲线通过分段解决了贝塞尔曲线的两个缺点:
- 分段后可很容易地通过控制点位置来控制曲线的形状。
- 改变一个控制点后,最多影响两段贝塞尔曲线中的点。
分段贝塞尔曲线:给定很多控制点时,不是使用所有控制点来生成一条贝塞尔曲线,而是将这些控制点按顺序分成若干个部分(通常一个部分中包含4个控制点,并且相邻部分的控制点集合中有公共点),每一个部分的控制点生成的是低阶(通常是三阶的)的贝塞尔曲线,然后将这些贝塞尔曲线连接起来就组成了分段贝塞尔曲线。

分段贝塞尔曲线的三种连续性:(前后两段的贝塞尔曲线可分别使用两个函数表示)
- C0连续性(几何连续性):前一段的终点和后一段的起点是同一个点,所以这是分段贝塞尔曲线固有的连续性(实际上两个函数在公共点处的值连续)
- C1连续性(切线连续性):在定义的基础上需要满足: an = b0,使得前一段的终点处的切线和后一段的起点的切线在方向和大小上都相同, 该连续性可使得两段曲线在连接点处的光滑过渡。(实际上是两个函数在公共点处的一阶导数连续)
- C2连续性(曲率连续性): 实际上是两个函数在公共点处的二阶导数连续。
优点: 可以通过控制每一段贝赛尔曲线的四个控制点的中间两个控制点的位置来控制这一段贝塞尔曲线的形状。
样条曲线 Spline Curve
定义:可用一系列的控制点控制的连续曲线,在曲线上的任意一个点都满足一定的连续性
基函数:前面的Bezier Curve的代数表达中的Bernstein polynomial就可看做是基函数,通过控制点的坐标来对基函数进行加权求和得到曲线的函数
B样条曲线(B-splines/Basis splines):基函数样条曲线 。该曲线比贝塞尔曲线的能力更强:因为B样条曲线具有局部性,在使用较多的控制点来生成曲线时,改变其中一个控制点,只会影响部分范围内的点,并且B样条曲线也不用像分段贝塞尔曲线那样使用分段操作才能实现局部性。
非均匀有理B样条曲线(NURBS): 比B样条曲线更加复杂
深入了解:https://www.bilibili.com/video/BV13441127CH
曲面 Surfaces
贝塞尔曲面 Bézier Surfaces
将贝塞尔曲线拓展到曲面上得到的曲面: 使用4x4个控制点(压平就是4x4的网格),然后在两个方向上分别应用贝塞尔曲线:先在水平方向上利用每条水平线上的四个控制点计算得到四条贝塞尔曲线,然后在四条贝塞尔曲线上采样得到竖直方向上相同时刻的四个点,最后基于这四个点计算贝塞尔曲线。

绘制贝塞尔曲面 Evaluating Bézier Surfaces
通过参数映射把 u v 分别映射成 t



几何处理/网格处理
-
网格细分 mesh subdivision (upsampling)
使用更多的三角形来表示物体表面,细分后的得到的表面会更加光滑 -
网格简化 mesh simplification (downsampling)
网格细分的逆过程,在能够控制损失和保持基本形状的情况下,使用更少的三角形表示,可以减少存储占用。 -
网格正则化 mesh regularization
避免长尖的三角形(这种三角形会对渲染过程造成不便),通过正则化在不丢失细节情况下让三角形变得和正三角形相似且三角形之间大小相近
网格细分 Mesh subdivision
具体的过程主要分为两步:
1.先分出更多的三角形。
2.使得这些分出的三角形的位置发生一点变化,使得细分后得到的物体表面更加光滑。
两种细分的算法:
- Loop Subdivision (只能用于细分三角形网格)
- Catmull-Clark Subdivision (可以用于一般的网格的细分)

网格简化 Mesh simplification
应用场景:当物体模型距离视点距离很远时,减少面的数量不会影响视觉效果。(可以根据物体模型和视点的距离来选用不同具有不同数量的面的模型,越近使用更多的面,这是几何的层次结构,较难处理,而前面提到的纹理图像的层次结构很容易处理,例如使用Mipmap)
一种网格简化的方法:边坍缩算法(Edge Collapsing Algorithm)
完整过程:先选择边来进行坍缩,然后通过优化的方法来确定坍缩后的点的位置
坍缩过程:就是将一条边的两个顶点合并成一个顶点并删除掉这条边,从而实现三角形数量的减少。

二次误差 Quadric Error:坍缩后的点和原本几个边(面)的距离的平方和最小。
坍缩后的点的位置的确定:可以通过最小化二次误差来确定坍缩后的点的位置使得坍缩前后的轮廓形状基本一致,这个二次误差是坍缩后的点到与该点关联的面的距离的平方和。(下图是原始的五个顶点abcde坍缩成afe三个顶点的情况)

坍缩的边的选择:不重要的边进行坍缩,重要的边不进行坍缩。算法中基于二次误差度量(Quadric Error Metrics)这个指标来选择边进行坍缩,具体过程:
- 计算当前模型中所有边的最小二次误差:对于每一条边,我们假设对每条边进行坍缩并使用优化的方法确定坍缩后的点的位置后,然后计算出坍缩每条边的最小二次误差
- 选择最小二次误差最小的边进行坍缩,坍缩了一条边之后,和这条边原始两个顶点相连的边的最小二次误差会变化,需要更新这些边的最小二次误差(使用优先队列,可以方便地取最小值,并且方便动态更新相邻边的值)
- 重复步骤2,再选择当前边的最小二次误差最小的边进行坍缩,如此迭代下去指导达到终止的条件。
属于贪心算法,通过不断求解局部最优解来寻找全局最优解

相关文章:
GAMES101学习笔记(六):Geometry 几何(基本表示方法、曲线与曲面、网格处理)
文章目录 几何的表示方法隐式几何 Implicit Geometry代数曲面(Algebraic surface)构造实体几何CSG(Constructive Solid Geometry)距离函数(Distance Function)水平集方法(Level Set Methods)分型几何(Fractal) 显式几何 Explicit Geometry点云(Point Cloud)多边形网格(Polygon …...
【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.24 随机宇宙:生成现实世界数据的艺术
1.24 随机宇宙:生成现实世界数据的艺术 目录 #mermaid-svg-vN1An9qZ6t4JUcGa {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-vN1An9qZ6t4JUcGa .error-icon{fill:#552222;}#mermaid-svg-vN1An9qZ6t4JUc…...
深入解析:一个简单的浮动布局 HTML 示例
深入解析:一个简单的浮动布局 HTML 示例 示例代码解析代码结构分析1. HTML 结构2. CSS 样式 核心功能解析1. 浮动布局(Float)2. 清除浮动(Clear)3. 其他样式 效果展示代码优化与扩展总结 在网页设计中,浮动…...
爬虫基础(三)Session和Cookie讲解
目录 一、前备知识点 (1)静态网页 (2)动态网页 (3)无状态HTTP 二、Session和Cookie 三、Session 四、Cookie (1)维持过程 (2)结构 正式开始说 Sessi…...
HTMLCSS :下雪了
这段代码创建了一个动态的雪花飘落加载动画,通过 CSS 技术实现了雪花的下落和消失效果,为页面添加了视觉吸引力和动态感。 大家复制代码时,可能会因格式转换出现错乱,导致样式失效。建议先少量复制代码进行测试,若未能…...
力扣 84. 柱状图中最大的矩形
🔗 https://leetcode.cn/problems/largest-rectangle-in-histogram 题目 给一个数组 num 表示位置 i 上圆柱的高度,求圆柱可以勾勒出的矩形的最大面积 思路 枚举圆柱 i,以该圆柱为高,计算其可以组成的矩形的最大面积。记录这过…...
【Windows Server实战】生产环境云和NPS快速搭建
前置条件 本文假定你已达成以下前提条件: 有域控DC。有证书服务器(AD CS)。已使用Microsoft Intune或者GPO为客户机申请证书。服务器上至少有两张网卡(如果用虚拟机做的测试环境,可以用一张HostOnly网卡做测试&#…...
RHCSA——搭建FTP文件共享服务器
一、实验目的 1、掌握vsftpd服务器的配置方法 2、熟悉FTP客户端工具的使用 3、掌握常见的FTP服务器的故障排除 二、实验项目背景 某企业像架构一台FTP服务器,为企业局域网中的计算机提供文件传送的任务,为财务部门、销售部门和OA系统提供异地数据备…...
IM 即时通讯系统-50-[特殊字符]cim(cross IM) 适用于开发者的分布式即时通讯系统
IM 开源系列 IM 即时通讯系统-41-开源 野火IM 专注于即时通讯实时音视频技术,提供优质可控的IMRTC能力 IM 即时通讯系统-42-基于netty实现的IM服务端,提供客户端jar包,可集成自己的登录系统 IM 即时通讯系统-43-简单的仿QQ聊天安卓APP IM 即时通讯系统-44-仿QQ即…...
SSH代理實用指南
SSH是一種安全的遠程訪問協議,用於遠程登錄和代理工具,是一種通過SSH協議實現的網路代理,常用於將網路流量通過安全的SSH通道進行轉發。與傳統的HTTP代理不同,SSH代理能夠在多種協議下工作(如HTTP、HTTPS、FTP等&#…...
Python在线编辑器
from flask import Flask, render_template, request, jsonify import sys from io import StringIO import contextlib import subprocess import importlib import threading import time import ast import reapp Flask(__name__)RESTRICTED_PACKAGES {tkinter: 抱歉&…...
ZZNUOJ(C/C++)基础练习1041——1050(详解版)
1041 : 数列求和2 题目描述 输入一个整数n,输出数列1-1/31/5-……前n项的和。 输入 输入只有一个整数n。 输出 结果保留2为小数,单独占一行。 样例输入 3 样例输出 0.87注意sum 1相当于sumsum1 注意sum * 1相当于sumsum*1 C语言版 #include<stdio.h> // 包含…...
JavaScript系列(51)--解释器实现详解
JavaScript解释器实现详解 🎯 今天,让我们深入探讨JavaScript解释器的实现。解释器是一个将源代码直接转换为结果的程序,通过理解其工作原理,我们可以更好地理解JavaScript的执行过程。 解释器基础概念 🌟 …...
浅析DDOS攻击及防御策略
DDoS(分布式拒绝服务)攻击是一种通过大量计算机或网络僵尸主机对目标服务器发起大量无效或高流量请求,耗尽其资源,从而导致服务中断的网络攻击方式。这种攻击方式利用了分布式系统的特性,使攻击规模更大、影响范围更广…...
深度学习 Pytorch 神经网络的学习
本节将从梯度下降法向外拓展,介绍更常用的优化算法,实现神经网络的学习和迭代。在本节课结束将完整实现一个神经网络训练的全流程。 对于像神经网络这样的复杂模型,可能会有数百个 w w w的存在,同时如果我们使用的是像交叉熵这样…...
【回溯】目标和 字母大小全排列
文章目录 494. 目标和解题思路:回溯784. 字母大小写全排列解题思路:回溯 494. 目标和 494. 目标和 给你一个非负整数数组 nums 和一个整数 target 。 向数组中的每个整数前添加 或 - ,然后串联起所有整数,可以构造一个 表达式…...
Linux系统上安装与配置 MySQL( CentOS 7 )
目录 1. 下载并安装 MySQL 官方 Yum Repository 2. 启动 MySQL 并查看运行状态 3. 找到 root 用户的初始密码 4. 修改 root 用户密码 5. 设置允许远程登录 6. 在云服务器配置 MySQL 端口 7. 关闭防火墙 8. 解决密码错误的问题 前言 在 Linux 服务器上安装并配置 MySQL …...
Miniconda 安装及使用
文章目录 前言1、Miniconda 简介2、Linux 环境说明2.1、安装2.2、配置2.3、常用命令2.4、常见问题及解决方案 前言 在 Python 中,“环境管理”是一个非常重要的概念,它主要是指对 Python 解释器及其相关依赖库进行管理和隔离,以确保开发环境…...
记录一次,PyQT的报错,多线程Udp失效,使用工具如netstat来检查端口使用情况。
1.问题 报错Exception in thread Thread-1: Traceback (most recent call last): File "threading.py", line 932, in _bootstrap_inner File "threading.py", line 870, in run File "main.py", line 456, in udp_recv IndexError: list…...
kamailio-ACC_JSON模块详解【后端语言go】
要确认 ACC_JSON 模块是否已经成功将计费信息推送到消息队列(MQueue),以及如何从队列中取值,可以按照以下步骤进行操作: 1. 确认 ACC_JSON 已推送到队列 1.1 配置 ACC_JSON 确保 ACC_JSON 模块已正确配置并启用。以下…...
群晖NAS安卓Calibre 个人图书馆
docker 下载镜像johngong/calibre-web,安装之 我是本地的/docker/xxx/metadata目录 映射到 /usr/local/calibre-web/app/cps/metadata_provider CALIBREDB_OTHER_OPTION 删除 CALIBRE_SERVER_USER calibre_server_user 缺省用户名口令 admin admin123 另外有个N…...
android主题设置为..DarkActionBar.Bridge时自定义DatePicker选中日期颜色
安卓自定义DatePicker选中日期颜色 背景:解决方案:方案一:方案二:实践效果: 背景: 最近在尝试用原生安卓实现仿element-ui表单校验功能,其中的的选择日期涉及到安卓DatePicker组件的使用&#…...
pytorch实现基于Word2Vec的词嵌入
PyTorch 实现 Word2Vec(Skip-gram 模型) 的完整代码,使用 中文语料 进行训练,包括数据预处理、模型定义、训练和测试。 1. 主要特点 支持中文数据,基于 jieba 进行分词 使用 Skip-gram 进行训练,适用于小数据集 支持负采样,提升训练效率 使用 cosine similarity 计算相…...
彩色控制台,自动换行...学习个新概念:流操控器![more cpp--11]
孩子们,我回来了。先看看今天我又学了什么CPP的没啥用新特性。彩色的控制台! 还有很多的新花样! 事情要从去年八月讲起,我那个时候在研究流函数,写了一些比较愚笨的代码。 为什么要研究这个呢?虽然我们的C…...
基于单片机的盲人智能水杯系统(论文+源码)
1 总体方案设计 本次基于单片机的盲人智能水杯设计,采用的是DS18B20实现杯中水温的检测,采用HX711及应力片实现杯中水里的检测,采用DS1302实现时钟计时功能,采用TTS语音模块实现语音播报的功能,并结合STC89C52单片机作…...
TensorFlow 示例摄氏度到华氏度的转换(一)
TensorFlow 实现神经网络模型来进行摄氏度到华氏度的转换,可以将其作为一个回归问题来处理。我们可以通过神经网络来拟合这个简单的转换公式。 1. 数据准备与预处理 2. 构建模型 3. 编译模型 4. 训练模型 5. 评估模型 6. 模型应用与预测 7. 保存与加载模型 …...
win10部署本地deepseek-r1,chatbox,deepseek联网(谷歌网页插件Page Assist)
win10部署本地deepseek-r1,chatbox,deepseek联网(谷歌网页插件Page Assist) 前言一、本地部署DeepSeek-r1step1 安装ollamastep2 下载deepseek-r1step2.1 找到模型deepseek-r1step2.2 cmd里粘贴 后按回车,进行下载 ste…...
【memgpt】letta 课程6: 多agent编排
Lab 6: Multi-Agent Orchestration 多代理协作 letta 是作为一个服务存在的,app通过restful api 通信 多智能体之间如何协调与沟通? 相互发送消息共享内存块,让代理同步到不同的服务的内存块...
Java 大视界 -- Java 大数据在自动驾驶中的数据处理与决策支持(68)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...
【Linux】opencv在arm64上提示找不到libjasper-dev
解决opencv在arm64上提示找不到libjasper-dev的问题。 本文首发于❄慕雪的寒舍 问题说明 最近我在尝试编译opencv,安装依赖项libjasper1和libjasper-dev的时候就遇到了这个问题。在amd64平台上,我们可以通过下面的命令安装(ubuntu18.04&…...
