在之前: 这篇文章或许能帮你开始学习建模 这篇文章中提到过;一个模型中需要的不止是点-边-面,还需要大量其他信息。至于这些是什么,当时在文章中没有仔细说。今天这(两)篇文章就给大家进行一下介绍。上篇的内容可能会显得生涩和枯燥,但是这些架构也是之后讲解的基础,我尽量讲的直观一些。 从直观的几何知识去理解,所有的模型基础都是点。但是在CG建模中有两个类似的概念,就是点(Point)和 顶点(Vertex)。
在日常生活中,甚至在数学上这两个词都经常混用;但是在CG建模中,点和顶点 是有本质的区别的。
有些建模软件甚至都混淆了这两个词(例如Maya),但是这些概念还是值得理清的。并且也是有些软件严格区分这些概念的(例如Houdini)。
直觉上看,两个线相交就构成一个点;几何上看,一个点就是空间中只有位置,没有大小的图形;从数据上来看,只需一个三维坐标就能完全定义一个点。在CG建模中,点继承了这些所有特点。
CG中的点是构成边的要素,边是构成面的要素。既然是这种层级结构,就会出现下面的“问题”:
此时所说的“问题”,就是一个点其实会被多个边/面共享的。例如上图,图中出现的三个面和标红的三个边其实共享中间绿色的点。
但是话说回来,“点需要被共享”,为什么被称为“问题”呢?这是因为在CG建模中,有很多数据是需要基于面或者边,而不能仅仅基于顶点的。
因为一些历史/技术原因(之后可能会展开成文章),在CG建模中所有的数据其实都是储存在点/顶点上面的。边和面其实都没有数据的;它们仅仅是表达点与点之间的关系。
在各种制作软件中,会有方便制作者理解的其他数据结构(例如Maya的面法线)。但是各大软件的这些“封装结构”都是不统一的,而且这些封装结构在导入到引擎后,都是统一转换到顶点上面去的。(殊途同归)
考虑到点本身需要被边和面共享,于是一个点上可能需要承担若干个面的数据。虽然从程序层面上其实没问题(大可整个数组)。但是因为计算机图形中,大多数的处理还是通过GPU;所以我们需要一个更简洁一些的解决方案(尽量不要用数组)。
先从概念上解释一下顶点,首先,我们看到最简单的几何情况:几何上讲的一个角
如果一个点是两个边的交点(点A),那么顶点就是由绿点标出的“部分”。这里看的可能还是云里雾里,如果在多个边的情况下,就能看出点和顶点的区别:
还是关注点A,在这张图中就出现了很多绿点儿。换句话说,在这种情况下;一个点可以对应多个顶点(这里是1:6)。
还有一点要注意的就是,虽然在三张图中,绿色的顶点和蓝色的点稍微有一些位置上的区别(绿点儿都要比蓝点儿远离一些实际交点)。但是实际上一个点和他对应的所有顶点在物理位置上是相同的。
然而这些有什么用呢?再看到下面这张图(理解成一个模型网格的部分放大图也可以):
在上面这张图中,就可以看到由 点 A-B-C 组成的 ∆ABC,此时就有了三个“自己的”顶点。虽然 ∆ABC 和 ∆ABK 共享两个点:A和B,但是不再需要共享顶点了。并且这个结构可以推广到这张图中的所有三角形中。此时这些“私有”顶点就可以十分方便的储存对应不同的面的数据了。
正因为这个特点,顶点就成为了储存数据的基本单元;并且一个点往往对应多个顶点。在模型的点数越多的时候,这个效应会越明显。
在上面这种点数量本身就比较多的情况下,这两个数据可能轻易地出现数量级差距。于是为了精确地沟通,提到性能往往是用顶点而不是点。
在说明了点和顶点后,就可以捎带手辨析一下另一组经常被混用的词语了,那就是面(face)和三角形(triangle)。
“面”在CG建模中也被称为多边形(polygon),如果不是三角形,也可以被称为 n边面(n-gon)。
为了更好地说明面和三角形的关系,我们也是回到基本的几何观念:任何一个封闭图形(无论凹凸),都可以拆分成若干个三角形。
从上图能看出来,只有三角形可以保证有且只有三个顶点,其他的所有多边形含有多少顶点其实都是不直观的(因为顶点是需要强制拆解为三角形后才计数的)。之所以只是说不直观而不是不确定,一个多边形含有多少顶点其实是可以计算出来的。但是没有人打算这么算。
并且在聊一个模型的时候,不会有人说清楚这个面是几边面的,直接说三角形计数就会很方便。
没人会说:我这个模型有3021个三角形,4811个多边形:其中有546个四边形,486个五边形…………
再加上,除了三角形面本身,大多面都需要拆分为数个三角形(和点与顶点的情况类似)。这种倍率关系,也导致用三角形计数,会更加的严谨。
除了方便传递顶点计数这种性能问题,在3D空间中,多边形和三角形还有一个更加重要的差别:
如上图,在3D空间中。四个点是不能保证共面的,如果以非共面的四个点构成一个面的话,这个面就不是“平”的。非平面在绝大多数的渲染引擎中都是无法处理的。
当然,上面的示例图比较夸张,且容易修正;但在实际CG建模的过程中:不平面的情况其实很普遍,而却大多数很轻微且不好手动修正。然而即使不平的很轻微,渲染引擎也处理不了;而且仔细想,上面那种情况其实有两种处理方式(作为课后作业大家想想w)。
如果是三个点,即使在3D空间中,也是绝对共面的。这就是为什么几乎所有的游戏引擎/渲染引擎中,都会强制把一个模型三角化,即:把所有面都分割为三角形。
就是因为这些种种,为了能更加定量的阐述一些内容,于是在学术的讨论时,就大多使用“顶点和三角形”。
在多少理解了顶点和三角形这两个基本概念,下面就可以开始介绍一些具体的干货了。
之前也提到过了,UV本质上就是一个从3D到2D的映射(说2D到3D也行);也就是在三维空间中的顶点内储存一个二维坐标。做到一个 uv(x,y,z)=(u,v) 这种函数映射。
如果觉得上面那个图太学术,从另一个角度看:UV展开其实就是制作纸模这种手工的反向操作。恰好一个CG模型在建立完毕后,其实也就是一个“空壳”。
没错,3D建模,尤其是CG方面的,建模出来的结果都是“空心儿”的:
于是一个从直观角度理解UV的过程就是把这个3D模型想象成一个橡胶皮,然后通过切割、拉扯等等操作,给映射到2D平面上。
既然包含切割和拉扯这种操作,在UV的基本操作中就会含有“接缝(Seam)”,“平铺(flatten)”,等等制作方法和原则。
UV这个东西是典型的一个概念少,原则多的部分。秉着这一系列专注于概念而不是实操的原则,UV其实能讲的也就这么多了。之后如果这一系列能发展到可以教授具体技艺的时候,会再展开讲。
这期在一开始写是没打算分上下的,但是发现只是讲明白顶点和三角形就需要一定的功夫。于是打算把这一块儿的重头:法线、顶点色这两个重点放在了 下篇 里面。 法线这个东西可以说是现代计算机图形中最重要的概念之一(我同时也认为是最“聪明”的之一),顶点色虽然在现代计算机图形中没有那么的突出(尤其是面对消费者),但是它曾经还是设计的关键部分之一,当然它在当代计算机图形中,也是渲染技术的关键技术之一。大家敬请期待~~
虽然这里主要是科普一些CG相关的知识,但是毕竟我现在还是一个独立开发者,这里做一些小小的广告!~
Itch.io, 主力的游戏发布,但是考虑到国内用户,在B博上也会有对应的更新。 B站,主要是当作B博去用,会有一些现在开发游戏的小更新什么的,未来稳定后可能会有一些视频之类的。
评论区
共 31 条评论热门最新