如何生成行进立方体三角形表?

时间:2017-06-26 07:43:15

标签: triangulation marching-cubes

如何生成行进立方体三角形表?我知道,我可以使用预先计算的,但我对如何生成表感兴趣。

似乎原作者通过在纸上对所有内容进行三角测量来生成它,但有没有一种方法可以在代码中生成它?

边缘表是直截了当的,但我不知道是否有一种简单的方法来获取三角形表,即使忽略了不明确的情况。

3 个答案:

答案 0 :(得分:0)

以下是算法的原始说明:http://paulbourke.net/geometry/polygonise/

答案 1 :(得分:0)

这是一种方法:

从顶点和边缘点开始。现在,如果打开了一个顶点,则在该顶点附近放置三个边点。为每个顶点执行此操作。

现在,记下连接在其上的顶点的边。移除位于其上的边缘点。

利用这些边缘点制作一个三角形阵列。

这样,您可以使用循环256次的for循环制作一个三角形表,实际上,使用此方法甚至可能不需要三角形表。

为了对其进行测试:

尝试使用我告诉您的方法。有用。 不过,只有一件事,由于它的绘制方式,我在进行测试时感到困惑。无论如何,享受! :)

编辑:通过这种方式,您可以使用任何方式渲染三角形。 人们使用不同的三角表。 使用这种方法,您不必弄清楚边缘点的编号是多少。您可以按自己的方式使用它,这样您就不必浪费时间弄清楚。

答案 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。