本系列根据国外一个图形小哥的讲解为本,整合互联网的一些资料,结合自己的一些理解。
场景的组成部分
场景相当于一个或多个模型的集合。模型包含以下内容:
- 结构描述:几何形状,如顶点、纹理坐标等
- 表面描述:外观及光照等
犹他壶模型(Utah teapot)
对于学图形学的人来说,犹他壶并不陌生。犹他壶模型是计算机图形学早期著名的3D模型(大约70年代~80年代)。在那个时候,3D模型通常被表示为多项式函数,主要技术被称为“样条曲线(spline curves)”,该技术将模型划分为多个表面块,如下所示:
三角形网格
现在我们主要使用多边形或三角形网格来构建模型。
3D 对象数据的类型
- 多边形网格(polygonal meshes) —— 代表复杂的现实世界对象。
- 样条面片(spline patches) —— 程序化建模。
- 体积数据,体素(voxel) —— 通过将对象的密度存储在三维数组中来表示对象。
- 构造立体几何(Constructive Solid Geometry) —— 常用于机器零件。
- 其他。
这是网格和样条线之间的比较:
建模技术
点云技术
首先,点云样本是非结构化的数据,所以没有关于两点之间邻接(连通性)的信息。为了使点能够连接在一起,我们必须使用额外的算法,例如 K 最近邻算法。
使用点云技术的优点之一是“简单”。此外,由于点云样本通过扫描能成为“原始数据raw data”,因此如今备受关注。
使用相机进行 3D 扫描
原理是通过一系列相机扫描物体,之后相机生成点云并捕获纹理。
原始数据都是“rgbd”数据,“rgb”的部分用于表示颜色和纹理,然后“d”(深度)用于生成点云。深度是指点与相机之间的距离。
多边形汤(Polygon Soup)
多边形汤是一组非结构化的多边形。它可以渲染一个对象,但不可以再进行其他操作,因为这些多边形之间并没有几何上的连系,也不含拓扑信息。为什么起这个名可以看下知乎的一个回答。
网格(Mesh)
网格是一组连接的多边形(通常是三角形)。 例如,多边形可以由多个三角形组成,并且三角形表示为一组顶点。一开始三角形之间没有连接,我们可以通过为每个顶点附加有关相邻三角形的附加信息(索引)来实现多边形上的连接。
网格是表示对象的显式方法。
隐式曲面(水平集 Level set)
通过使用三维函数,我们可以隐式地表示一个对象。曲面表面上的点应满足“F(x,y,z) = 0”。当函数的结果为零时,表示该点是曲面上的一个点,称为等值曲面。
这种技术有优点也有缺点。
优点:
- 可以保证模型无孔洞
- 易于改变拓扑
缺点:
- 必须遍历体积数据,就会造成 CPU 时间开销,导致速度慢。
- 需要更多的内存空间。
体素(Voxels)
医疗领域在CT、MRI中经常使用此类物体。体素是体积数据的 3D 图像。
构造立体几何
使用主要的几何图形,从布尔运算的层次结构中获得目标几何图形(并集、差集和交集),例子之一是CAD程序中的机械建模。
场景图(Scene Graph)
文章的开头提到过“一个场景相当于一个或多个模型的组合”。我们可以将模型放置为层次树,而不是将它们放置为列表。
如下图所示,从办公桌的角度来看,桌面上的一组模型(电话、镜子、相框)是叶子节点。通过使它们依赖于办公桌,我们可以构建新的模型。
通过绘制一组对象的图形,我们可以应用视椎体进行剔除。“视锥体”是相机能够看到物体的空间。“剔除”是一种不会在视锥体空间之外渲染对象的技术。创建一组模型后,我们可以为包含所有对象的组设置包围体。如果我们将视图空间投影到单位立方体空间(NDC空间),红球将位于该空间之外。然后,我们可以在 CPU 操作内将其从渲染目标中删除。
程序化建模
我们在这里使用替换规则。
程序化建模的一个例子是“地形”。我们不使用纯随机数,而是利用高度图并生成受相邻位置高度影响的随机数。