如何生成行进立方体三角形表?我知道,我可以使用预先计算的,但我对如何生成表感兴趣。
似乎原作者通过在纸上对所有内容进行三角测量来生成它,但有没有一种方法可以在代码中生成它?
边缘表是直截了当的,但我不知道是否有一种简单的方法来获取三角形表,即使忽略了不明确的情况。
答案 0 :(得分:0)
以下是算法的原始说明:http://paulbourke.net/geometry/polygonise/
答案 1 :(得分:0)
这是一种方法:
从顶点和边缘点开始。现在,如果打开了一个顶点,则在该顶点附近放置三个边点。为每个顶点执行此操作。
现在,记下连接在其上的顶点的边。移除位于其上的边缘点。
利用这些边缘点制作一个三角形阵列。
这样,您可以使用循环256次的for循环制作一个三角形表,实际上,使用此方法甚至可能不需要三角形表。
为了对其进行测试:
您可以在Google中搜索“行军立方体组合”,
尝试使用我告诉您的方法。有用。 不过,只有一件事,由于它的绘制方式,我在进行测试时感到困惑。无论如何,享受! :)
编辑:通过这种方式,您可以使用任何方式渲染三角形。 人们使用不同的三角表。 使用这种方法,您不必弄清楚边缘点的编号是多少。您可以按自己的方式使用它,这样您就不必浪费时间弄清楚。
答案 2 :(得分:0)
另一种解决方案 (请勿直视,直到我告诉您这样做为止) (或者因为我没有时间完成它,否则您会看到未完成的消息)
我不会真正引用代码。
行进立方体三角形列表从一个立方体开始。
如果您有一个立方体,或者可以制造一个立方体,为方便起见,我建议您使用一个立方体。用钢笔或记号笔将其角落和边缘整齐地编号。 请不要不定期地计数。使计数“可编程”。
一个立方体有8个角。让我们将每个角想象为一个灯泡。 因此,三角形列表会为打开和关闭的灯泡的每种组合生成三角形。 即256个组合。 ((2个灯泡条件)^(8个灯泡)= 256个组合) 但是如何生成三角形列表?
对于每种组合,我们都有一个唯一的多维数据集。 让我们从这样的组合开始
/7.on-----8.off
/ | /|
3.off----4.on/ |
| 5.on ------| 6.off
| / | /
|/ |/
1.on------2.off
我们可以列出拐角或灯泡的列表。
bulb 1, bulb 2, bulb 3 - bulb 8
然后告诉他们是打开还是关闭
on, off, off... off
编号方式的确取决于您的需求。虽然我会建议一种有组织的方式。点订单有40,320个组合。
对于此示例,我使用的是惯常的顺序。
我们可以将此灯泡状态列表转换为二进制数。关表示0,开表示1。
10011010 in binary = 154th index of table
也许您知道所有这些:P
2。 创建一个由12个元素组成的边缘点数组。 对于新手(不冒犯法):边缘点->边缘上的点。
int[] edgePoints = new int[12] {0,0,0,0,0,0,0,0,0,0,0,0} //12 elements
然后启用边缘点。对于每个拐角点,启用其相邻的边缘点。 如果完成此迭代,请检查某个点是否已启用1次以上。如果有,请禁用它。如果尚未启用,则将其禁用。
现在您有了有效的边缘点。存储在数组或列表中。现在让我们制作三角形。
这是我们可以使用的一些数组。
List<int> validVertexIndices = new List<int>(); //add the valids
List<int> usedVertices = new List<int>();
List<int> oldVertices = new List<int>();
List<int[]> usedTris = new List<int[]>();
让我们开始做一个三角形。 该程序并不真正知道如何连接点。 (制作三角形),让我们从一个随机点开始。 (最好从最低的索引开始)
usedVertices.Add(your random point index);
然后检查到起点的最近点。 为此,迭代除起点以外的所有要点。检查起点和其他所有点之间的距离。 (假设每个点的x,y,z位置是0.5的完美倍数)(例如0、0.5、1.0)
如果起点和另一个点之间的距离是所有其他距离中最短的,那么那两个就是第一个三角形的前两个点。
usedVertices.Add(That second point to be used);
然后将最接近第二点的点,而不是第一点或第二点。这是第三点。
usedVertices.Add(The third point);
然后您可以注册三角形。
usedTris.Add(usedVertices.ToArray());
oldVertices.Add(usedVertices);
usedVertices = new List<int>();
现在其他三角形。有很多规则。您可以简单地对第一个三角形重复该过程,除了这次,您必须重置迭代并在违反规则的情况下更改一个点。您可以将第一个点更改为未使用的下一个点。然后第二点和第三点如果失败。
三个主要规则是: 1.三角形不应与之前的三角形相同。 2.三角形不应相交。 那里有交集算法,但由于它们太长,我不能将它们放在这里。 3.检查它是否覆盖了启用的角点。 -获取所有相邻的已启用拐角点的平均距离,并查看其是否平行并且与当前三角形的法线方向相同。
这很复杂,可能不会成功,但是您已经有了一套规则。
继续这样做,直到达到n(n-1)/2
次为止。然后,您保证拥有三角形。 (其中n =启用的边缘点数);
然后,为每个三角形创建一个克隆,以使其法线反转。
然后在那里拥有它。可能不太像,所以最好找到一个来源。
大声笑,请不要建立和训练神经网络来制作一个只是折磨的xD。