【发布时间】:2010-10-03 07:09:27
【问题描述】:
我有一组共面连接的三角形,即二维网格。现在我需要在 z 轴上将它挤出几个单位。网格由一组顶点定义,渲染器通过匹配三角形数组来理解这些顶点。
示例网格:
顶点:(0,0,0), (10,0,0), (10,10,0), (0,10,0)
所以这里我们有一个 2D 正方形。现在我需要在该列表中添加更多顶点和三角形来制作拉伸形状。三角形必须是顺时针方向,否则会被背面剔除。
有没有一个简单的算法呢?谢谢。
【问题讨论】:
我有一组共面连接的三角形,即二维网格。现在我需要在 z 轴上将它挤出几个单位。网格由一组顶点定义,渲染器通过匹配三角形数组来理解这些顶点。
示例网格:
顶点:(0,0,0), (10,0,0), (10,10,0), (0,10,0)
所以这里我们有一个 2D 正方形。现在我需要在该列表中添加更多顶点和三角形来制作拉伸形状。三角形必须是顺时针方向,否则会被背面剔除。
有没有一个简单的算法呢?谢谢。
【问题讨论】:
假设您要拉伸距离 z,您需要按照以下步骤操作:
0) 设 n 为原始顶点数(在您的示例中为 4)
1) 对于顶点数组中的每个顶点,将 (0,0,z) 添加到其中,并将结果添加到顶点数组中,总共 2*n 个顶点。因此,对于您的示例,您将添加顶点 (0,0,z), (10,0,z), (10,10,z), (0,10,z) 到您的顶点数组中,总共2*4=8 个顶点。
2) 为您的原始网格创建边界(相对于内部)边缘列表。为此,请创建所有三角形边的列表(每个三角形的 3 条边按顺时针顺序排列)。然后删除成对的相等但相反的边缘(这些是内部边缘)。对于您的示例,您将从 6 条边开始,并在删除边对 (3,1) 和 (1,3) 后以 4 条边结束。
3) 为三角形列表中的每个三角形 (a,b,c) 创建一个对应的三角形 (a+n,b+n,c+n)。这些将是突出的面
4) 最后,您要创建拉伸形状的侧面。对于您在步骤 2 中创建的边界边列表中的每条边 (a,b),添加三角形 (a,b,b+n) 和 (b+n,a+n,a)
就是这样。假设我没有错别字,你也没有错别字,你现在应该有你想要的网格了。
【讨论】: