天行健 君子当自强而不息

三角网格(3)

 

三角网可在三角形或顶点级保存额外信息。

 

纹理映射坐标

纹理映射是将位图(称作"纹理图"或简称"纹理")贴到多边形表面的过程。这里只给出一个高度简化的解释:我们希望将2D纹理贴到多边形表面上,同时考虑多边形在摄像机空间的方向。对多边形中每个需要渲染的像素都要计算2D纹理映射坐标,这些坐标用以索引纹理图,从而为相应像素着色。

通常,在顶点保存纹理映射坐标,三角形面中其余各点的坐标通过插值进行计算。

 

表面法向量

许多应用程序中,网格上的各点都需要一个表面法向量。它可以用来:

(1)计算光照。

(2)进行背面剔除。

(3)模拟粒子在表面"弹跳"的效果。

(4)通过只考虑正面而加速碰撞检测。

表面法向量可能保存于三角形级或顶点级,或两者皆有。

三角形级法向量可以通过两向量叉乘的方法轻松获得,而顶点级法向量的计算则困难一些。首先,应注意到顶点处其实是没有法向量定义的,因为此处网格表面不连续。第二,三角网是对连续表面的逼近,所以我们实际想要的是连续表面的法向量。根据产生三角网的方法,这种信息不一定现成可得。如果网格是自动生成的,比如说从参数曲面上,则可以直接获得法向量。

若法向量没有提供,则必得有现成数据(顶点位置和三角形)生成。一个技巧是平均相邻三角形的表面法向量并将结果标准化。当然,这要求知道三角形法向量。一般可以假设三角形顶点以顺时针列出,通过叉乘计算外表面的法向量。如果顶点顺序不能假设时,可使用Glassner建议的方法。

通过平均三角形法向量求得顶点法向量是一种经验性方法,大多数情况下都能工作得很好。但是有必要指出,某些情况下,其结果并不是所期望的。最明显的例子是两个法向量刚好相反的三角形共享一个顶点。这种情形常发生在"公告板"物体上。"公告板"由两个三角形背靠背构成,它的两个法向量方向恰好相反,其平均值为0不能标准化。为解决这种问题,必须拆开所谓的"双面"三角形。

平均顶点法向量的另一个问题会在应用Gouraud着色时发生,这里给出一个简化的解释:光照是按顶点法向量逐点计算的。如果使用平均三角形法向量计算的顶点法向量,某些应该有尖锐边缘的地方会显得"过于平滑"。以最简单的盒子为例,边缘处应该有一个剧烈的关照变化。如果我们使用平均顶点法向量,这个剧烈变化会消失。如图14.8所示:

根本问题在于盒子边缘不连续,而这种不连续却不能很好的被表达,因为每个顶点只有一个法向量。其实仍然可以使用面拆分解决问题:换句话说,重复不连续处的顶点。这样做之后,人为的构造了一个不连续以防止顶点法向量被平均。这种"裂缝"在网格拓扑中可能会导致问题,但在如渲染、光线追踪等任务中没有问题。

另一个小问题是这种平均会导致结果向较多拥有相同法向量的三角形偏移。例如,若干三角形共享一个顶点,但其中两个共面。则平均出的法向量会发生偏移,因为共面三角形的法向量重复了两次,相比于其他法向量有更多"发言权"。于是,即使表面并未变化,也会使顶点法向量发生改变。我们可以修正此错误,但幸运的是实践中这并不是什么大问题,因为顶点法向量本来就是一种近似。

 

光照值

另一种常由顶点维护的信息是光照值。这些光照值用于沿表面的插值,典型的方法是Gouraud着色。有些时候,顶点处仅保存法向量,渲染时动态计算光照值。

 

拓扑与一致性

三角网格的拓扑是指当在三角网格中不考虑顶点位置与其他几何性质的逻辑连通性时,两个顶点数相同且三角形互联方式一致的三角网格为同拓扑的,即使它们对应的物体完全不同。从另一方面说,尽管形状不同,拉伸网格但不打破邻接性,我们得到的是同拓扑的网格。

有一种特殊网格称作封闭网络,又称作"流形"。概念上,封闭网格完美地覆盖物体表面,网格中没有间隙,从外面完全无法看到任何三角形的背面。这是一种重要的网格,它的点和边组成形式就像平面图,即如果将顶点当成平面点,用直线连接顶点,此封闭网格可以画在一个2D平面上,而且没有边交叉。平面图符合Euler方程:v-e+f=2,其中v为顶点数,e为边数,f为网格上的面数。

实践中,我们经常遇到拓扑异常的三角网格,导致网格不封闭:

(1)孤立顶点:顶点未被任何三角形使用。

(2)重复顶点:完全相同的顶点。使用这些点的三角形几何上相邻而逻辑上不相邻,多数情况下,我们不希望看到这种现象,应该删除。

(3)退化三角形:使用一顶点超过一次的三角形。意味着这个三角形没有面积,一般这种三角形应该删除。

(4)开放边:仅为一个三角形所使用。

(5)超过两个三角形共享的边:封闭网格中,任一边必须为两个三角形共享。

(6)重复面:网格中包含有两个或更多相同的面。这是不希望看到的,应该去掉多余面而只保留一个。

根据应用的不同,上述异常可能是严重的错误,也可能是小错误,或者无关紧要。


posted on 2008-03-02 15:28 lovedday 阅读(2072) 评论(2)  编辑 收藏 引用

评论

# re: 三角网格(3)[未登录] 2010-01-15 17:02 Jason

这几年从楼主的博客学到很多知识,非常感谢.  回复  更多评论   

# re: 三角网格(3)[未登录] 2010-01-15 17:02 Jason

祝新年如意吉祥!  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


公告

导航

统计

常用链接

随笔分类(178)

3D游戏编程相关链接

搜索

最新评论