当前位置:嗨网首页>书籍在线阅读

04-环面

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

6.2.1 环面

用于产生环面的算法可以在各种网站上找到。Paul Baker逐步描述了定义圆形切片,然后围绕圆圈旋转切片以形成环面的方法[PP07]。图6.8显示了侧面和上面的两种视图。

153.png

图6.8 构建一个环面

生成环面顶点位置的方式与构建球体的方式有很大不同。对于环面,算法将一个顶点定位到原点的右侧,然后在XY平面上的圆中让这个顶点围绕Z轴旋转,以形成“环”。然后,将这个环“向外”移动“内半径”那么长的距离。在构建这些顶点时,为每个顶点计算纹理坐标和法向量。还会额外为每个顶点生成与环面表面相切的向量(称为切向量)。

围绕Y轴旋转最初的这个环,形成用来构成环面的其他环的顶点。通过围绕Y轴旋转最初的环的切向量和法向量来计算每个结果顶点的切向量和法向量。在顶点创建之后,逐个环地遍历所有顶点,并且对于每个顶点生成两个三角形。两个三角形的六个索引表条目的生成方式和之前的球体类似。

我们为剩余的环选择纹理坐标的策略,是将它们排列成使得纹理图像的S轴环绕环面的水平周边的一半,然后再对另一半重复。当我们绕Y轴旋转生成环时,我们指定一个从1开始并增加到指定精度的变量环(再次称为“prec”)。然后我们将S纹理坐标值设置为ring2.0/prec,使S的取值范围介于0.0和2.0之间,然后每当纹理坐标大于1.0时减去1.0。这种方法的动机是避免纹理图像在水平方向上过度“拉伸”。反之,如果我们确实希望纹理完全围绕环面拉伸,我们只须从纹理坐标计算中删除“2.0”乘数即可。

在C++/OpenGL中构建Torus类可以用与Sphere类几乎完全相同的方式完成。但是,我们有机会利用OpenGL对顶点索引的支持来利用我们在构建环面时创建的索引(我们也可以为球体做到这一点,但我们没有这样做)。对于具有数千个顶点的超大型模型,使用OpenGL索引可以提高性能,因此我们将描述如何执行此操作。