games101 几何

几何归类

隐式几何

只表示各个点之间满足的关系,比如球在三维空间中的表示: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)

在物体内部展现出自相似型,类似于递归的过程

曲线

贝塞尔曲线

定义:二次贝塞尔曲线的路径由给定点P_0{P_1}P_2的函数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)=(1t)2P0+2t(1t)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=(1t)P0+tP1

B = ( 1 − t ) P 1 + t P 2 B=(1-t)P_1+tP_2 B=(1t)P1+tP2

C = ( 1 − t ) A + t B C=(1-t)A+tB C=(1t)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)=(1t)2P0+2t(1t)P1+t2P2,t[0,1]
同理可得三次贝塞尔曲线
请添加图片描述

凸包性质:

贝塞尔曲线始终会在包含了所有控制点的最小凸多边形中, 不是按照控制点的顺序围成的最小多边形. 也就是说可以通过控制点的凸包来限制规划曲线的范围,在路径规划是很需要的一个性质.

逐段贝塞尔曲线

虽然贝塞尔曲线的阶数可以很高,但是如果曲线的阶数过高,调整控制点对曲线的影响就比较小,调整起来相当麻烦。

于是,我们常常使用分段的贝塞尔曲线,保证每一小段不会太复杂。这样每次只用调小段,还可以做到只调局部不影响大局,那就相当舒服了。

分段带来的唯一问题是,曲线在段与段的交界处,如何保证平滑?

所谓平滑,其实就是一阶导数连续,也就是左右导数的极限相同。

对两侧的贝塞尔曲线求导,分别代入 t=0 和 t=1 (即贝塞尔曲线的开始和结束时间),让二者相等。

此时能发现,当两侧控制点与分段交接点共线且形成的线段长度相等时,满足曲线平滑性质。

贝塞尔曲面

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WtNo9J1p-1652256012393)(D:\Desk\md\图片\v2-1c7b63501741bee61934d27e833f991b_r.jpg)]

如果说对于曲线来说只有一个参数
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]
,具体过程如下图所示:

在这里插入图片描述

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iNAzfCt3-1652256012398)(D:\Desk\md\图片\v2-cbe5f7054203ce2e7625068524c1ad2c_720w.jpg)]

首先规定一共4x4 = 16个控制点,其水平面位置如图中16个黑点所示(并未表示出高度,防止图形太乱),将这16个点分成4列,图中红色圈中的为一列的具体例子。

第1步 在这4个控制点之下利用第一个参数u 运用计算贝塞尔曲线的方法得到灰色曲线,因为有4列,所以一共可以得到某时刻下如图所示的4个蓝色点。(灰色曲线分别为每列4个点所对应的贝塞尔曲线)

第2步 在得到4个蓝色顶点之后,将四个蓝色顶点作为控制点,利用第二个参数v 便可以成功得出贝塞尔曲面上的正确一点

第3步 遍历所有的 u,v值就可以成功得到一个贝塞尔曲面

面的细分

LOOP细分

定义

网格细分是通过按一定规则给网格增加顶点和面片的数量,让网格模型变得更加光滑。Loop细分方法是最早一种基于三角网格的细分方法。Loop细分在每条边上都增加一个顶点,并且同一个三角形内的顶点用新增顶点连接起来,以构成新的三角形。

一次细分的过程分为两步骤,第一步是增加顶点;第二步是对顶点位置进行调整,使得网格更加光滑。

对于新增顶点

在这里插入图片描述

改变原有顶点

在这里插入图片描述

Catmull-Clark细分曲面过程

Catmull-Clark主要是针对四边形网格细分的算法

在这里插入图片描述

面的简化

边塌缩

边坍缩操作是移动一条边的两个使它们重合,以消除一条边。

在这里插入图片描述

我们一般会将其塌缩至一个新的点,但如果是通过周围的点平均来算会导致新产生的面会比探索前小很多,并不能保证原貌

基于二次度量误差的边坍缩算法

该方法的本质目的是每次坍缩让网格变化最小的那条边,这就需要引入一个代价函数,使网格变化较小的坍缩边具有较小的代价。本方法的代价通过坍缩之后的点到原始网格中相邻的面的距离衡量。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值