图形学笔记(九)几何 ——几何表示方法(CSG、距离函数、水平集 、点云、网格(obj格式))、贝塞尔曲线(面)

图形学笔记(八)着色2 —— 纹理映射、重心坐标、双线性插值、Mipmap、三线性插值、各向异性过滤、纹理的应用(环境贴图、法线贴图等)
图形学笔记(十)几何2 —— 曲面细分(Loop细分、Catmull-Clark细分)、曲面简化(边坍缩、二次度量误差)、曲面正则化

1 几何的表示方法

分为显式(Implicit)和隐式(Explicit)。

隐式几何的表现形式:

  • algebraic surface
  • level sets
  • distance function

显式几何的表现形式:

  • point cloud
  • polygon mesh
  • subdivision,NURBS

1.1 隐式的几何表示(Implicit)

1.1.1 概览

在这里插入图片描述

基于对点进行归类,找到满足特定关系的点。例如:球体,在三维空间中可以写成 x 2 + y 2 + z 2 = 1 x^2+y^2+z^2=1 x2+y2+z2=1

更通用的表示,f(x,y,z) = 0

优点:

  1. 很容易判断点是否在面上。(将点代入f(x,y,z),正数表示点在图形外,负数表示点在图形内,0表示点在图形上。)
  2. 表述起来很容易(对存储很有利)。
  3. 容易做面与光线求交。
  4. 容易描述和处理拓扑结构。

缺点:难以描述复杂的形状,很难知道这个面上有哪些点,很难看出式子表示的是什么形状。

1.1.2 CSG —— Constructive Solid Geometry(Implict)

通过一系列基本几何的基本布尔运算来定义新的几何。
在这里插入图片描述例子:
在这里插入图片描述这个方法在很多建模软件得到了很多的应用。

1.1.3 距离函数 Distance Function(Implict)

距离函数:给出任何一个位置到物体的最短距离。对一个点不描述表面,而是描述点到表面的最近距离。

把两个物体的距离函数都算出来然后把两个距离函数做融合(blending)
在这里插入图片描述例子:混合一个移动的边界
在这里插入图片描述通过blend两个SDF可以得到移动后的边界。

分别求出两个物体对应的距离函数, 然后把他们blend起来,然后恢复成原本的面(找出SDF 的值为0的位置)

1.1.4 水平集 Level Set Methods(Implict)

封闭形式的方程很难描述复杂的形状,所以选择一种替代方案:存储一个值近似函数的网格(可以是二维的也可以是三维的)
在这里插入图片描述通过找到插值为0的位置来找到表面,它具有一个对形状更加显示的控制。

例子:
如果有一个三维的纹理表示人体不同位置的骨密度,可以让密度函数=某个具体的值,然后找到所有满足这个等式的位置,就可以得到一个表面。
在这里插入图片描述

1.1.5 分形 Fractals(Implict)

分形又有自相似的意思,自己的部分和整体很像(有点像递归),例子有雪花(不断的六边形)、下面的西兰花等。
在这里插入图片描述这些类型的几何在渲染时会造成强烈的走样。

1.2 显式的几何(Explicit)

1.2.1 概览

所有的点直接给出,或通过参数映射定义表面。
在这里插入图片描述

优点:对于表示形状很容易。
有点:难以判断点是否在表面上(或内、外)。

1.2.2 点云(Point Cloud)

  • 简单的表示为点的列表(x,y,z)
  • 可以简单的表示任何一种几何图形
  • 对于表示大数据集是很有用的(>>1 point/pixel)
  • 经常被转换成多边形网格
  • 难以在采样不足的区域画出来
    在这里插入图片描述

1.2.3 多边形网格(Polygon Mesh)

  • 存储点和多边形(通常是三角形或四边形)
  • 容易去处理/模拟,进行自适应采样
  • 数据结构比较复杂
  • 图形学中最常用的表示

在这里插入图片描述

eg:The Wavefront Object File(.obj)格式

它是一个文本文件,由指定的顶点、法线、纹理坐标和它们的连接组成。

如下图表示了一个立方体:

  • v是顶点坐标
  • vn是法线(多了两条是因为建模误差)
  • vt是纹理坐标
  • f(face)表示面,比如f 5/1/1 1/2/1 4/3/1 表示这个三角形面是由第5、1、4个顶点组成的,三个点的纹理坐标是第1、2、3对应的纹理坐标,这个面的法线是第一条法线。

在这里插入图片描述

2 曲线(Curves)

应用:相机拍摄路径、 动画曲线、定义字体(控制点)。
在这里插入图片描述

2.1 贝塞尔曲线(Bezier Curves)

2.1.1 概览

用一系列的控制点来定义某一条曲线。这些控制点使用切线来定义贝塞尔曲线。
如下图,注意曲线起始方向沿着 P 0 P 1 P_0P_1 P0P1,结束方向沿着 P 2 P 3 P_2P_3 P2P3。(不要求曲线经过控制点,但一定要经过起止点)

在这里插入图片描述

2.1.2 计算贝塞尔曲线——de Casteljau算法

给定三个控制点生成的贝塞尔曲线称为二次贝塞尔曲线(quadratic Bezier)。

在这里插入图片描述

  1. 使用线性插值插入一个点(假设起点是时间0,终点是时间1)。
    在这里插入图片描述

  2. 在另一条边上也插入这个点。

在这里插入图片描述

  1. 把两个点相连,递归重复刚才的过程,直到只剩一条线段,找的点就在贝塞尔曲线上。

在这里插入图片描述

  1. 对于[0,1]所有的时间t采用这种算法,最终获得曲线。

在这里插入图片描述

2.1.3 贝塞尔曲线代数公式

如果有n+1个控制点(从0开始编号),可以得到n阶的贝塞尔曲线。
在这里插入图片描述

Bernstein 多项式:

在这里插入图片描述
在这里插入图片描述

例如,当n=3时,
b n ( t ) = b 0 ( 1 − t ) 3 + b 1 3 t ( 1 − t ) 2 + b 2 3 t 2 ( 1 − t ) + b 3 t 3 b^n(t)=b_0(1-t)^3+b_13t(1-t)^2+b_23t^2(1-t)+b_3t^3 bn(t)=b0(1t)3+b13t(1t)2+b23t2(1t)+b3t3

2.1.4 贝塞尔曲线的性质

  • 贝塞尔曲线一定过起点和终点,所以有 b ( 0 ) = b 0 ; b ( 1 ) = b 3 b(0)=b_0; b(1)=b_3 b(0)=b0;b(1)=b3
  • 对于3个控制点的贝塞尔曲线有 b ′ ( 0 ) = 3 ( b 1 − b 0 ) ; b ′ ( 1 ) = 3 ( b 3 − b 2 ) b'(0)=3(b_1-b_0); b'(1)=3(b_3-b_2) b(0)=3(b1b0);b(1)=3(b3b2)
  • 仿射(Affine)变换下:对贝塞尔曲线做仿射变换与对控制点做仿射变换再获得贝塞尔曲线结果是相同的。
  • 凸包(Convex hull)性质:贝塞尔曲线在控制点的凸包内。

凸包:能够包围几何形体的最小凸多边形
在这里插入图片描述

2.2 逐段(Piecewise)贝塞尔曲线

2.2.1 概览

由于当控制点太多,曲线难以被控制点控制。 所以逐段定义贝塞尔曲线(习惯用四个控制点)。
在这里插入图片描述

在PhotoShop等工具中应用了这个性质。
在这里插入图片描述
如果要让不同的分段之间光滑过渡,只需要在切线上连续(方向和大小上)即可。

2.2.3 分段贝塞尔曲线的连续性

  1. C 0 C^0 C0连续: a n = b 0 a_n=b_0 an=b0,几何上挨在一块。
  2. C 1 C^1 C1连续: a n = b 0 = 1 2 ( a n − 1 + b 1 ) a_n=b_0=\frac{1}{2}(a_{n-1}+b_1) an=b0=21(an1+b1),切线上也连续(共线,方向相反,长度相同)。

2.3 其他类型的曲线

2.3.1 样条 Spline

  • 一个连续的曲线是由一系列控制点控制点,在任意一个地方可以满足一定的连续性。
  • 简单来说就是一个可控的曲线。

2.3.2 B样条 B-Splines

  • 贝塞尔曲线的扩展(具有局部性,容易控制),就是基函数(basis)样条。
  • 比贝塞尔曲线需要更多的信息。
  • 满足贝塞尔曲线的所有性质。

3 (贝塞尔)曲面

3.1 概览

把贝塞尔曲线的概念延申到平面上。
在这里插入图片描述

3.2 为参数(u,v)计算贝塞尔曲面上的点

对于bi-cubic 贝塞尔曲面的一段:
输入:4*4 控制点
输出:一个在 [ 0 , 1 ] 2 [0,1]^2 [0,1]2内的(u,v)参数化的二维曲面
目标:计算与(u,v)对应的曲面位置

  • 使用de Casteljau算法计算在每4个贝塞尔曲线上的点u。得出4个“移动的”贝塞尔曲线控制点。
  • 使用1维的de Casteljau算法在“移动的”贝塞尔曲线上来计算点v。

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43399489/article/details/121064579
今日推荐