几何笔记
本文最后更新于:8 个月前
隐式几何表示
往往通过一个方程来定义,不够直观,但存储量小,运算简单。
显示几何表示
要么直接定义,要么通过一些参数来定义。
点云
一堆点,要构成面需要极大的密度。
通常用于三维扫描,后续再通过其他方法将点云转化为其他表示方法。
多边形网格
使用三角形或其他多边形表示(最常用)
贝塞尔曲线
通过参数来显示表示几何的实例
几何意义:很好理解但不太好描述,百度找图(
代数表示(用参数 $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。