几何归类
隐式几何
只表示各个点之间满足的关系,比如球在三维空间中的表示:x² + y² + z² = R²
可以很容易的判断一个点在物体内还是外,但是很难画出这样的几何体,不容易找到所有点。
显式几何
参数映射:通过一个函数,把二维空间上的点坐标当做参数,映射到三维空间上。
如:f(u,v)=( (2 + cos u) 8 cos v,(2 + cos u) * sin v,sin u)
更多的隐式表示方法
Constructive Solid Geometry(构造立体几何法)
通过布尔运算表示复杂几何体
距离函数
给出空间中的每个点到几何体上的最短距离,如果在内部则为负
可以表示出渐变的运动过程
A、B分别对应的是起始状态和终止状态,如果我们直接融合会产生黑灰白各占1/3的图像,这表现不出运动的过程
我们可以融合距离函数SDF来表示中间状态,根据到边界的距离划分为正负,这样融合之后就会生成黑白各占1/3的图像
我们还能这样表示两个几何体逐渐融合的过程
水平集(Level Set Methods)
和距离函数的区别仅仅是表示方式不同,他表现在网格格式上,类似于等高线
分形(Fractals)
在物体内部展现出自相似型,类似于递归的过程
曲线
贝塞尔曲线
定义:二次贝塞尔曲线的路径由给定点,
,
的函数B(t)给出:
B
(
t
)
=
(
1
−
t
)
2
P
0
+
2
t
(
1
−
t
)
P
1
+
t
2
P
2
,
t
∈
[
0
,
1
]
B(t)=(1-t)^2P_0+2t(1-t)P_1+t^2P_2,t\in [0,1]
B(t)=(1−t)2P0+2t(1−t)P1+t2P2,t∈[0,1]
假设P0 P1上的点为A,P1 P2上的点为B,AB上的点为C(也即C为曲线上的点)。则根据一次贝塞尔曲线公式有:
A
=
(
1
−
t
)
P
0
+
t
P
1
A=(1-t)P_0+tP_1
A=(1−t)P0+tP1
B = ( 1 − t ) P 1 + t P 2 B=(1-t)P_1+tP_2 B=(1−t)P1+tP2
C = ( 1 − t ) A + t B C=(1-t)A+tB C=(1−t)A+tB
将上式中的A、B带入C中,即可得到二次贝塞尔曲线的公式:
B
(
t
)
=
(
1
−
t
)
2
P
0
+
2
t
(
1
−
t
)
P
1
+
t
2
P
2
,
t
∈
[
0
,
1
]
B(t)=(1-t)^2P_0+2t(1-t)P_1+t^2P_2 , t\in [0,1]
B(t)=(1−t)2P0+2t(1−t)P1+t2P2,t∈[0,1]
同理可得三次贝塞尔曲线
凸包性质:
贝塞尔曲线始终会在包含了所有控制点的最小凸多边形中, 不是按照控制点的顺序围成的最小多边形. 也就是说可以通过控制点的凸包来限制规划曲线的范围,在路径规划是很需要的一个性质.
逐段贝塞尔曲线
虽然贝塞尔曲线的阶数可以很高,但是如果曲线的阶数过高,调整控制点对曲线的影响就比较小,调整起来相当麻烦。
于是,我们常常使用分段的贝塞尔曲线,保证每一小段不会太复杂。这样每次只用调小段,还可以做到只调局部不影响大局,那就相当舒服了。
分段带来的唯一问题是,曲线在段与段的交界处,如何保证平滑?
所谓平滑,其实就是一阶导数连续,也就是左右导数的极限相同。
对两侧的贝塞尔曲线求导,分别代入 t=0 和 t=1 (即贝塞尔曲线的开始和结束时间),让二者相等。
此时能发现,当两侧控制点与分段交接点共线且形成的线段长度相等时,满足曲线平滑性质。
贝塞尔曲面
如果说对于曲线来说只有一个参数
t
∈
[
0
,
1
]
t\in [0,1]
t∈[0,1]
那么对于一个面来说,就应该有两个参数,分别设
u
∈
[
0
,
1
]
u\in [0,1]
u∈[0,1]
v
∈
[
0
,
1
]
v\in [0,1]
v∈[0,1]
,具体过程如下图所示:
首先规定一共4x4 = 16个控制点,其水平面位置如图中16个黑点所示(并未表示出高度,防止图形太乱),将这16个点分成4列,图中红色圈中的为一列的具体例子。
第1步 在这4个控制点之下利用第一个参数u 运用计算贝塞尔曲线的方法得到灰色曲线,因为有4列,所以一共可以得到某时刻下如图所示的4个蓝色点。(灰色曲线分别为每列4个点所对应的贝塞尔曲线)
第2步 在得到4个蓝色顶点之后,将四个蓝色顶点作为控制点,利用第二个参数v 便可以成功得出贝塞尔曲面上的正确一点
第3步 遍历所有的 u,v值就可以成功得到一个贝塞尔曲面
面的细分
LOOP细分
定义
网格细分是通过按一定规则给网格增加顶点和面片的数量,让网格模型变得更加光滑。Loop细分方法是最早一种基于三角网格的细分方法。Loop细分在每条边上都增加一个顶点,并且同一个三角形内的顶点用新增顶点连接起来,以构成新的三角形。
一次细分的过程分为两步骤,第一步是增加顶点;第二步是对顶点位置进行调整,使得网格更加光滑。
对于新增顶点
改变原有顶点
Catmull-Clark细分曲面过程
Catmull-Clark主要是针对四边形网格细分的算法
面的简化
边塌缩
边坍缩操作是移动一条边的两个使它们重合,以消除一条边。
我们一般会将其塌缩至一个新的点,但如果是通过周围的点平均来算会导致新产生的面会比探索前小很多,并不能保证原貌
基于二次度量误差的边坍缩算法
该方法的本质目的是每次坍缩让网格变化最小的那条边,这就需要引入一个代价函数,使网格变化较小的坍缩边具有较小的代价。本方法的代价通过坍缩之后的点到原始网格中相邻的面的距离衡量。