生成诸如盒子,圆锥体和所有引用的原始形状的边缘和面的方法是在创建顶点的同时生成它们。实际上,您应该以合理的方式创建顶点,以便轻松计算相应的边和面。
有一些算法将空间中的一组点作为输入并在其上计算一个所谓的“ 点集三角剖分 ”,但是点集三角剖分的问题是NP完全的,因此可以更快地制作边缘和面而不是只计算顶点并让算法完成工作。只是让您知道此解决方案存在。
除了这种效率不高的解决方案之外,我认为您只能按情况处理基元,如以下示例所示。
网格是顶点和面。除非网格物体包含不构成面的线,否则边将包含在面的描述中。顶点是3个浮点坐标的元组。边只是顶点的参考对,但是同样,您当然也不需要它们。假设您的顶点在一个索引数组中。那么,您的边缘可能就是该数组的索引对。在索引数组的情况下,面是引用顶点的三元组或索引的三元组。
您应该能够计算构成这些基本形状的每个顶点,边缘和面,因为能够对其进行计数意味着了解对象的属性,这有助于您设计使用其构建对象的方法,使用循环和其他工具,我们将看到。
锥体
对于具有n + 2个顶点,3n个边和2n个面的圆锥:
- 制作两个单独的顶点。
- 围绕其中一个顶点(基本顶点)在与前两个顶点之间的线段垂直的平面内绕一个圆。希望您可以使用三角法画一个圆,对吗?那已经是圆锥体的所有顶点了。这也是所有边的三分之一(圆中有n个边,总共有3n 个边)。
- 从基本顶点到圆中的n个顶点制作n条边。这样做时,您可以制作一半的面孔(即n张面孔)。
- 从尖端顶点到圆中的n个顶点制作n条边。这样做时,您可以制作另一半张面孔(即n张面孔)。
1)
2)
3)
4)
最终结果:
您还可以在运行构成圆的循环时创建边缘和面。同样的复杂性,同样的事情。在圆上创建一个顶点,将其存储到顶点数组中,如果需要,将相应的边(索引对)添加到索引对数组中,最后将对应的面添加到索引三元组数组中。移至下一个顶点。
缸筒:两次不做相同的工作,四边形
再次,对于管,它以顶点和圆开始,这将是圆柱体顶部或底部圆盘的中心:
- 制作一个顶点。
- 在顶点周围画一个圆。在圆的连续顶点之间,中心顶点和每个圆顶点之间添加边(如果需要边)。在由中心顶点构成的每个顶点三次和圆上的两个连续顶点之间添加面。
- 复制所有内容,然后按照所需圆柱体的长度在垂直于刚制作的底座的方向上平移副本。
- 链接顶部和底部。
要链接顶部和底部,必须在彼此面对的成对顶点之间成四边形。因此,请思考一下,为什么不使自己成为一个在四个顶点中构成两个三角形面的函数呢?
做完了 请注意,这一次我们使用了一个事实,即相同的结构(圆+中心)在圆柱体中出现两次,以作为捷径。我们不必手工制作所有的顶点,边和面,而与必要的圆锥体相反。
遵循这种懒惰原理,也可以只制作四分之一的圆并复制它,然后再次进行非常简单的变换即可制作一个完整的圆(对任何圆都有效,因此对圆锥也有效),但这对于没有那么复杂的形状。
您必须始终使用所制造对象的几何特性来简化其制造。即它们的对称性和不变性。
对于圆柱体,只需不制作基础顶点,只需制作圆,重复,平移副本,完成四边形即可。
球体和胶囊:增加了复杂性,但仍无法完成两次相同的工作
要创建胶囊,我们要创建一个UV球,将其分成两半,平移前半部分,然后将其与胶囊的侧面连接起来。
再次可以只制作一个球的八分之一(!!),然后将其复制并反转,然后沿另一个轴复制并反转结果,除了沿另一个轴等,以四个步骤得到一个完整的球(创建第八个) ,重复并反转3次)。可能会造成过大杀伤力,但比起圈来的情况要少。
一个简单的紫外线球:
实际上,我们实际上只制作了一半(例如),复制了一半,将副本上下颠倒,然后按照胶囊的长度进行平移:
我们链接上半部分和下半部分:
真正的(有点)艰苦的工作来自制作球体的三角学。属于UV球的所有顶点的集合可以描述为以下形式的所有点的集合:
其中R是球体的半径,对于某个正偶整数N,我们有一个常数
θ=×π/ N,
k和n是整数,其中k在0到2N-1之间变化,n在-N / 2到+ N / 2之间变化。
要制作半球或球的一半,您必须限制k和n所取值的集合。
如果k是实数而不仅仅是整数,那么您将得到一个整个球体,而不仅仅是其表面上的顶点。因此,我们在这里所做的是栅格化图元的表面方程。
可怕的圆环:毕竟我们已经很容易看到了!
同样,更多的三角函数,更多的顶点,更多的四边形,更多的对称性,更多的不变性...更多的几何!找出圆环表面的方程式,对其进行“栅格化”,使用圆环的(明显)对称性简化问题,最后遍历您刚刚定义的一组顶点,并在创建边缘和面时走!
看到?完全简单。