【图形学笔记】Lecture07-Introduction to Geometry几何

Lecture07-Introduction to Geometry几何

显式的(explicit)几何表示方法:点云(point cloud)、多边形网格(polygon mesh)、细分(subdivision)…

隐式的(implicit)表示方法:等值面(level set)、代数曲面(algebraic surface)…

Implicit Surface 隐式的曲面

形如 f(x,y,z)=0 的形式给出。

  • 找到哪些点在面上通常是困难的,但是判断一个点在哪里是比较简单的!

CSG-Constructive Solid Geometry(Implicit)构造刚体几何图形

集合运算跟逻辑运算是对应的,所以就可以用集合的交并补差这些运算,来处理图形。

Blending Distance Functions 融合距离函数

对于几何,不去描述表面,而是描述点到表面的最近距离

假设想要求出上图中,AB 的中间的运动状态,如果直接混合(blend),会得到(黑-灰-白)的三块,并不具有运动的信息。如果反过来,对横轴上每个点求SDF(Signed Distance Function),然后混合两个SDF,得到blend(SDF(A),SDF(B))

Level Set Method 水平集方法

有了混合的距离函数,如何再恢复表面呢?把SDF=0的地方找出来,如果函数是隐式的,那就类似光栅化那样采样,然后用插值的方法求出等值面。

Fractal 分形

复杂的情况~在渲染的时候可能会引起强烈的走样。

Explicit Representation 显式的表示

  • 找到哪些点在面上会变简单(比如参数方程的表示,只要跑遍所有参数的取值,也必须跑遍),但是判断一个点在哪里变难了!

所有点直接给出/通过参数坐标给出,比如课件上给了个 R2R3 的映射,把平面上的图形映射成马鞍面,又比如前面的轮胎面(2x2+y2)2+z21=0,也可以改写成显示的 z=±1(2x2+y2)2

接着就开始说极坐标表示点,上面提到的轮胎面还可以表示成 f(u,v)=((2+cosu)cosv,(2+cosu)sinv,sinu),但是我们会发现,这样子的表示,就不太好判断一个点在内部还是外部了。

(补充)

Point Cloud 点云

用一系列的点 (x,y,z) 表示,可以很容易表示各种几何图形,对于数据集比较大(比如一个3D空间的扫描)的情况非常有用,并且经常可以转化成多边形网格的表示。

Polygon Mesh 多边形网格

  • 存储点和多边形

  • 很容易做处理、模拟、自适应采样

  • 更加复杂的数据结构

  • 在图形学里更经常用的表示方法

Splines 样条曲线

样条(spline):一条连续的曲线,经过一系列给定的控制点,并且满足一定的连续性

Cubic Hermite Interpolation 三次Hermite插值

  • Nearest Neighbor Interpolation:x 处选取最近的 xi 的函数值,函数不连续。
  • Linear Interpolation:线性插值,函数连续,导数不连续。
  • Cubic Hermite Interpolation(三次厄尔米特插值):可以让导数连续!

Power Basis 幂基

幂基(power basis):Pd=[1,u,u2,,ud],(注:这里幂基应当是一个行向量)很明显幂基在 \R 上是线性无关的。

然后对于一个 \R[u] 中的元素,可以写成幂基的形式: x(u)=i=0dciui=CPd

Useful Properties of a Basis 基的一些有用性质

这部分在课件里放在贝塞尔曲线,但我感觉提上来比较好。

Convex Hull property 凸包性质

  • 凸包性质指的是:所有曲线上的点都落在控制点的凸包内
  • 贝塞尔曲线具有这种性质。
  • 基满足凸包性质,若:
    • 基函数的和为1,即: bi(u)=1(uΩ)
    • 基函数非负:bi(u)0(uΩ,i=0,,n)

Invariance 不变性

这里特指:对曲线做某个变换=对控制点做变换,再绘制曲线

即:

  • 贝塞尔曲线对仿射变换具有不变性,但对透视变换不具有不变性,即:

x(u)=P3βZpTx(u)=P3βZ(Tp)

这条性质感觉得通过Bernstein多项式来写?(不知道有没有更直接的方法,直接乘矩阵肯定是不能交换的)

Local Support 局部支撑

改变一个控制点,不会改变整个曲线。

Some Differential Geometry 一些微分几何

一条曲线在某方向的切线可以写成 t(u)=xu|u,对于一个曲面则可以写tu(u,v)=xu|u,vtv(u,v)=xv|u,v,综合起来,可以写出曲面的单位法向量:

n=tu×tv||tu×tv||

当然也有一些退化情况(比如 ||tu×tv||=0 或者 x/u=0 的情况。

好了说了这么多,其实不知道他这页PPT放了有什么意义…

Specifying a Curve 特定曲线

给了一些希望有的限制,如何确定三次幂基的系数(这句话有点绕,其实就是确定一个三次曲线的系数)?

即:已知 x(u0)=x0,x(u1)=x1,x(u0)=d0,x(u1)=d1,如何确定三次函数 x(u)=c0+c1u+c2u2+c3u3

好,首先:

x(u)=c0+c1u+c2u2+c3u3x(u)=c1+2c2u+3c3u2

不妨假设 u0=0,u1=1,那么有:

{x(0)=c0=x0x(1)=c0+c1+c2+c3=x1x(0)=c1=d0x(1)=c1+2c2+3c3=d1

写成矩阵,即:

[1000111101000123][c0c1c2c3]=[x0x1d0d1]

我们把左边的列向量 c=(c0,c1,c2,c3)T 叫做系数(coefficient)向量,右边 h=(x0,x1,d0,d1)T 一般叫做控制点,以及矩阵记为 B ,那么就是 Bc=h 我们想要的系数 c=B1h,因为逆矩阵更常用,所以不如起个名字叫 βH=B1。(H就是Hermite的首字母, βH 则叫做Hermite基矩阵

注:Hermite基矩阵:

βH=[1000001033212211]

此时任意一点

x(u)=P3(u)c=P3(u)βHh

如果控制点发生变化,其实幂基、Hermite基矩阵都不会改变,所以 P3(u)βH 的结果是固定的!这一部分(最终其实是一个行向量)就叫 Hermite 基函数(因为是关于自变量 u 的函数)

综上所述,三次Hermite插值是这样一个过程:输入端点函数值、导数值,输出一个三次多项式,最终的结果就是Hermite基的带权和(其实就是矩阵乘完的结果啦)!

得到的Hermite基函数(的各个分量):

Q:为什么不用更高阶的多项式?

A:1、高阶多项式更不稳定,容易摆动。2、希望编辑后,能保持一些局部的性质(局部不要变化太大)3、开销大。

Catmull-Rom 插值

输入一些点,输出C1连续的经过所有插值点的样条。

导数的确定方式i 处的导数值 f(xi)=f(xi+1)f(xi1)xi+1xi1,(注:这里的上一个和下一个应该是循环的)

是一种逐段的(piecewise)三次曲线,并且非常容易推广到对 n 维空间的几个点进行插值。

确定了导数之后,剩下的内容其实和三次Hermite插值一样,上面的 h=[p1,p2,12(p2p0),12(p3p1)],那么

p(u)=P3(u)βHh=P3(u)βHMCRH[p0,p1,p2,p3]T=[1uu2u3][1000001033212211][01000010120120012012][p0p1p2p3]

中间两个矩阵的结果就叫 βCR=βHβCRH

Bézier Curve 贝塞尔曲线

Evaluating Bézier Curves——Matrix Formula 矩阵表示

和之前的Hermite、Catmull-Rom相比,还是改了个切线的定义方式——所有的控制点都是空间中的点,没有切线,而是让左右两个端点处的切线,恰好是连线(虽然这里有个系数 3 ,对应着后面的Bernstein多项式的系数)

然后也类似有一个矩阵 βZ=βHMZH

βZ=[1000330036301331]

可以得到一个基函数的图像:

Evaluating Bézier Curves——De Casteljau Algorithm

对于 n 个控制点,和某个时间 t[0,1] , 跑 n1 次循环。假设当前的控制点是 b0,,bk ,则取 bi=(1t)bi+tbi+1——这一步就是所谓的线性插值(lerp),直到最后只剩下一个点。

Evaluating Bézier Curves——Bernstein Polynomial

贝塞尔曲线迭代 n 次的结果(一个点)为:

bn(t)=j=0nbjBjn(t)=j=0nbj(nj)tj(1t)nj

注意, b,bj 都是某维空间的向量, Bjn(t)=(nj)tj(1t)nj 叫做伯恩斯坦多项式,是标量。

b0,bn 是贝塞尔曲线控制点。

那么特别地,对于一个三次贝塞尔曲线,有:

b(t)=b0(1t)3+3b1t(1t)2+3b2t2(1t)+b3t3

系数 3 就在这里。

Properties of Bézier Curve 贝塞尔曲线的性质

  • 插值端点:b(0)=b0,b(1)=bn
  • 切线端点:对于3次贝塞尔曲线(4个控制点),b(0),b(1)恰是切线。
  • 仿射变换不变性:贝塞尔曲线做仿射变换=控制点做仿射变换,再绘制贝塞尔曲线。
  • 凸包性质:绘制的图形一定在控制点构成的凸包内部。
  • 良好的表现:局部控制(加入点时?)

Piecewise Bézier Curves 逐段贝塞尔曲线

普通的贝塞尔曲线有个不好的地方,次数一旦高了,就不好通过控制点控制!

所以就有了逐段贝塞尔曲线——把很多段低阶的贝塞尔曲线,按顺序拼接起来,应用非常广泛(比如Photoshop的钢笔工具,绘制路径,很多矢量图的存储方式也是用这种曲线)

然后就是注意一点差异,我们平常在Photoshop里的钢笔工具是比较规范的,实际上的逐段贝塞尔曲线,可能不是C1连续的:

想象下面两段3阶贝塞尔曲线拼接起来,C0 连续当且仅当 an=b0C1连续还需切线连续,这里通常还会要求相等,即 anan1=b1b0,又因为 C0 连续有 an=b0,所以即 an=b0=12(an1+b1)

Bézier Surfaces 贝塞尔曲面

通常是用 [0,1]2 的参数来刻画曲面的。

Method 1: Separable 1D de Casteljau Algorithm

方法1就是说,对于 (u,v) 分开地用Casteljau算法,可见复杂度之高x

Method 2: Algebraic Evaluation

方法2是代数方法,推广一下上面的Bernstein多项式的写法:

bn,m(u,v)=i=0nj=0mbi,jBin(u)Bjm(v)

课件上管这玩意叫张量积(Tensor product),给我吓得不轻。

Method 3: Linear Algebra

其实三个方法思路都一样,都是对两个方向进行线性插值。

方法3还是考虑前的形式,x(u,v)=P3(u)βZ[p0,p1,p2,p3]T,只不过这里

pi=P3(v)βZ[pi,0,pi,1,pi,2,pi,3]T

最后写出来:

x(u,v)=P3(u)βZ[p0,0p0,1p0,2p0,3p1,0p1,1p1,2p1,3p2,0p2,1p2,2p2,3p3,0p3,1p3,2p3,3]βZTP3(v)T

Method 4: Bézier Subdivision

方法4和之前的都不太一样!切入点应该是考虑贝塞尔曲线的凸包性质,进一步考虑找到一个合适的中点——即参数 t=1/2 对应的点,把控制点一分为二,连同中间过程的控制点,一起递归地处理,每次范围缩小一半,最后对于很小的地方直接用凸包替代曲线(?):

x(u)=[1,u,u2,u3]βzP,(0u12)=[1,u2,u24,u38]βZP,(0u1)=[1,u,u2,u3][11/21/41/8]S1βZP=[1,u,u2,u3](βZβZ1)S1βZP=[1,u,u2,u3]βZ(βZ1S1βZ)HZ1P=[1,u,u2,u3]βZP1

这里 HZ1=βZ1S1βZ 是一个下三角矩阵。

类似地,另一半也可以写成 x(u)=[1,u,u2,u3]βZP2 的形式,P2=HZ2P

Piecewise Bézier Surfaces逐段贝塞尔曲面

C0 连续就是边界连续,C1连续直接要求共线了,这个感觉没什么好说。

posted @   yoshinow2001  阅读(249)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示