games101-11-Geometry2

显示几何

点云

​ 不考虑物体是一个表面,而是考虑物体由点组成,只要点的数量足够多,就可以变成物体表面。空间中每一个点由(x,y,z)表示。理论上只要点足够密集,可以表示任何几何,由点变成多边形面。

image-20230511124237550

多边形面

​ 常用三角形面和四边形面,如下图将任何复杂的几何体拆成三角形面。通过定义各个多边形面的顶点以及顶点之间的连接关系就可以得到许许多多的三角形面或是四边形面,再通过这些面来近似表现出我们想要的模型效果。

image-20230511124525785

​ 例如比较著名的.obj文件,其格式如下:

image-20230511124752805

​ v定义三角形面的三个顶点坐标(立方体8个顶点);vt定义三角形面的三个顶点uv坐标(每个面4个点,共6个面所以最多有24种不同的纹理坐标信息);vn定义三角形面的三个顶点的法线坐标(6个面的法线信息,有8个是因为建模软件输出的精度问题);f定义点的连接关系,哪三个点形成三角形面。如5/1/1定义三角形的第一个顶点是第5个v,使用第1个vt作为uv该顶点的uv坐标,使用第1个vn作为该顶点的法线坐标。

贝塞尔曲线

​ 用一系列控制点定义曲线,并且定义曲线满足的一些性质。如下图p0,p1,p2,p3为控制点,该曲线的起始点为p0,结束点为p3,且曲线起始位置的切线沿p0p1方向,结束位置的切线沿p2p3方向(参数3是根据控制点的个数决定的)。曲线不一定要经过p1,p2。可以用任意多个点定义曲线,但2个点只能定义线段。将控制点经过仿射变换后绘制出的还是同一个曲线(仿射变换不包括投影变换) 。所形成的曲线具有凸包性质 ,即曲线一定在在控制点形成的凸包内,不会超出所有控制点构成的凸多边形范围。所以如果四个控制点在一个线段上,最后形成的曲线就是这个线段。

image-20230511130613920

​ 以三个控制点的情况为例:

image-20230511130719131

​ 假设曲线起始对应时间0,结束对应时间1,现在要找到0-1中间任意一个时刻所对应曲线上点的位置。假设t=1/3,取b0b1线段上1/3处的点:

image-20230511131116462

​ 取b1b2线段上1/3处的点:

image-20230511131143327

​ 此时连接上述的两个点形成一个新的线段(两个线段变成一个线段),取这个线段1/3处的点,这个点就是t=1/3时刻,曲线上的点。遍历所有t,就可以获得整条曲线。

image-20230511131222819

​ 如下是四个控制迪安的情况,三个线段变成两个线段,两个线段变成一个线段:

image-20230511131501727

​ 将上述过程变成代数形式,如下是递归规程:

image-20230511131741041

​ 代数表达式相当于在每个线段上进行插值。以b0b1为例,如果t=0,新生成的点在b0处;如果t=1,新生成的点在b1处,最后曲线上的点可以通过时间t以及三个控制点的坐标表示(上标表示第几层(从0开始),下标表示该层的第几个点(从0开始),最后一层只有一个点):

image-20230511131938146

​ 第n层也就是最后一层只会新生成一个点,该点可以用每一个控制点和时间t的多项式进行线性组合计算出来,一共n+1项(bj表示第几个控制点(第0层),B表示该控制点对应的关于t的多项式)。该绘制曲线的方法也可以推广至三维,每一个控制点用(x,y,z)定义。该方法属于显示表达,已知t的范围已知映射关系,只要遍历所有的t就可以得到曲线上所有的坐标。

image-20230511132053483

​ 例如由四个控制点,就会有四个关于时间t的多项式,n的值为3,j的值从0-3。四个多项式随时间t的变化如下,在任意一个时刻,四个多项式的和为1:

image-20230511132315175
逐段贝塞尔曲线

​ 当控制点多的时候,不便于计算操作。

image-20230511144704245

​ 将一个贝塞尔曲线,用多段贝塞尔曲线组合起来,逐段定义贝塞尔曲线。一般情况下,每一段由四个控制点控制。如下曲线由三段拼接。

image-20230511145214254

​ 如果要使得曲线之间的拼接光滑(已知第一个曲线的最后一个控制点和第二个曲线的第一个控制点是同一个点),需要第一个曲线最后一个点的切线和第二个曲线第一个点的切线共线、反向,第一个曲线倒数第二个点和第二个曲线第二个点距离两个曲线重叠的点的距离相同。(如果不相同不能称之为光滑)

image-20230511145338232

​ 另一种定义曲线的方法叫做B样条曲线。对于多个控制点定义的曲线,如果移动一个点,会使得整条曲线发生变换。现在只想对曲线的局部进行变化,B样条曲线可以在不逐段定义的情况先,控制一个控制点的变化最多影响到曲线的哪一个局部范围内。

​ 对于两段曲线,有重合的点,叫做C0连续:

image-20230511162850925

​ 对于两段曲线,不仅有重合的点,重合区域切线等长、共线且相反,叫做C1连续:

image-20230511162918366
曲面
image-20230511162453198

​ 首先规定一共4x4 = 16个控制点,其水平面位置如图中16个黑点所示(并未表示出高度,防止图形太乱),将这16个点分成4列,图中红色圈中的为一列的具体例子。第1步在这4个控制点之下利用第一个参数 u得到蓝色点,因为有4列,所以一共可以得到如图所示的4个蓝色点。(灰色曲线分别为每列4个点所对应的贝塞尔曲线)第2步在得到4个蓝色顶点之后,在这四个蓝色顶点的基础之下利用第二个参数 v 可以得出贝塞尔曲面上的正确一点。第3步遍历所有的 u,v值就可以成功得到一个贝塞尔曲面。对于曲面和曲面间如何光滑衔接是更复杂的问题。这里由uv可以映射到曲面上的一个点,所以也是显示表示。

其他面操作

对于曲面物体更广泛的操作还是分解成多边形面。

1.细分:通过将面细分成更多的面(如三角形或者四边形)使得模型精细。

2.简化:将不破坏大体形状的前提下,使用更少的面(如三角形或者四边形)节省内存空间。

3.正规化:例如所有组成物体的三角形都为正三角形,这会具有很多很好的性质,但不不能丢失物体原本的表现质量。

image-20230511150928273

Donate
  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.

扫一扫,分享到微信

微信分享二维码

请我喝杯咖啡吧~

支付宝
微信