几何杂记
隐式几何表示
往往通过一个方程来定义,不够直观,但存储量小,运算简单。
显示几何表示
要么直接定义,要么通过一些参数来定义。
点云
一堆点,要构成面需要极大的密度。
通常用于三维扫描,后续再通过其他方法将点云转化为其他表示方法。
多边形网格
使用三角形或其他多边形表示(最常用)
贝塞尔曲线
通过参数来显示表示几何的实例
几何意义:很好理解但不太好描述,百度找图(
代数表示(用参数 \(t\) 来表示时间/比例,\(t\in [0, 1]\))推导:
- 有 \(n+1\) 个控制点 \(b_{0..n}\),控制一条 \(n\) 次贝塞尔曲线。
- 首先对于任意点 \(A\)(非两边的点),在一次取点过后,会将 \(tA\) 分配到一边,\((1-t)A\) 分配到另一边。
- 那么一个点 \(A\) 最终能分配到答案中多少,可以看做是一个金字塔状的路径选取的问题。
- 然后就不难从中发现二项式了。
- 最终结论为:\(ans = \sum_{i=0}^{n}C_n^ib_it^i(1-t)^{n-i}\)
贝塞尔曲线性质:
- 仿射变换不变性:对贝塞尔曲线仿射变换,等价于对几个控制点仿射变换后再生成贝塞尔曲线
- 贝塞尔曲线始终在控制点的凸包内
- 贝塞尔曲线的阶次等于控制点数-1,曲线的起点/终点与第一个/最后一个控制点重合。
分段贝塞尔曲线
贝塞尔曲线的一大缺点是没有局部控制能力,任一控制点的变化都会影响到整个曲线(B样条曲线能解决这个问题),有时也会用分段贝塞尔曲线解决。
如PS的钢笔工具就是每段使用四个控制点,每段画三次贝塞尔曲线(Cubic Bezier Curve)
两端段贝塞尔曲线交接的部分,相交处的控制点连线若平行,即可平滑连接,若连线长度也相同,就能使二阶导数也连续。
显然,曲线应当可以表示成关于 \(t\) 的 \(n\) 阶多项式 \(G(t)\)
例如对于 \(n = 3\),\(G(t)=(1-t)^3b_0+3t(1-t)^2b_1+3t^2(1-t)b_2+t^3b_3\) \[ \begin{bmatrix} -1&3&-3&1\\ 3&-6&3&0\\ -3&3&0&0\\ 1&0&0&0 \end{bmatrix} \times \begin{bmatrix} b_0\\ b_1\\ b_2\\ b_3 \end{bmatrix} = \begin{bmatrix} p_3\\ p_2\\ p_1\\ p_0 \end{bmatrix} \] 我们可以用矩阵计算得出各次系数 \(p\),\(G(t)=p_3t^3+p_2t^2+p_1t+p_0\),此处的系数为一个vec2。
后面我们可以把其他形式的曲线(如B样条)也写成这种矩阵形式,然后轻松在两者之间转化。
B样条曲线
三次B样条曲线的矩阵表达如下: \[ \frac1{6}\begin{bmatrix} -1&3&-3&1\\ 3&-6&3&0\\ -3&0&3&0\\ 1&4&1&0 \end{bmatrix} \times \begin{bmatrix} b_0\\ b_1\\ b_2\\ b_3 \end{bmatrix} = \begin{bmatrix} p_3\\ p_2\\ p_1\\ p_0 \end{bmatrix} \]
贝塞尔曲面
以4x4控制点为例:先将四列分别画出贝塞尔曲线,然后每一行取出四个点作为新贝塞尔曲线的控制点,得到一行贝塞尔曲线,扫出一个曲面。
贝塞尔曲面可以用参数 \(u,v\) 来表示。
网格细分
用于将网格变得更平滑,本质上是一种模糊操作,并没有更多的信息量。在已有网格能大致表示物体轮廓时,用网格细分使得它更平滑。
Loop 细分
Loop是人名
细分:在每条三角形边上取一个新的顶点,形成 4 倍顶点。
调整:对顶点位置进行一个“模糊”,思路如下:
对于新顶点,它在两个三角形的重边上,设重边上的两个点为 \(A,B\),重边对的两个点为 \(C,D\),新顶点的位置为 \(3/8\times (A+B)+1/8 \times (C+D)\)
系数取决于调参经验,总之就是加权平均。
对于原顶点,它由相邻的原顶点和自身加权平均得来,具体设 \(n\) 为度数,\(u\) 为相邻顶点的比例系数,通常设 \(u = 3/(8n)\),特别当 \(n=3\) 时设 \(u=3/16\)
最终位置为 \((1-nu)ori+u\sum adj\)
Catmull-Clark细分
多边形网格的细分
每轮细分在每条线上产生一个点,每个面上也产生一个点。
以一定的权值来调整新点的位置。
其特点是:经过一轮变换后,所有面都会变成四边形。
网格简化
在尽可能保留信息的前提下简化网格,常用于LOD。