该网站说明了如何进行。 http://drububu.com/miscellaneous/voxelizer/index.html但是我不明白如何在代码中实现它。
最佳答案
程序:
1)指定两个垂直方向,这些方向确定立方体的方向。为了方便起见,我将它们分别选择为X和Z轴。 X将是相交平面的法线,Y,Z将是该平面内的2D坐标轴。
2)找到包围网格的最小轴向长方体(AABB)。我敢肯定那会很容易。在这种情况下,您会得到6个数字,即[X1,X2,Y1,Y2,Z1,Z2]。
3)假设您选择立方体的尺寸为S;令H = S /2。从X X = X1 + H开始,构造一个具有法线(1、0、0)和中心(X,0、0)的平面。
4)与网格相交。有关C ++中数学和实现的详细信息,请参见此处:http://www.geometrictools.com/Documentation/ClipMesh.pdf
5)采取由相交产生的边缘。通过找到共享一个公共端点的对将它们连接起来,然后将它们插入一些双向链接的列表中。这样,可以将它们排序为一条路径。
6)找到该形状的最小封闭矩形,得到[Y1,Y2,Z1,Z2]
7)从Z = Z1 + H开始,创建一条从(X,Y1,Z)到(X,Y2,Z)的线。与所有线相交
路径中的边缘以获取点。遍历链接列表,以避免重复测试。
8)将点按其Y坐标排序。插入排序将执行:https://en.wikipedia.org/wiki/Insertion_sort
9)对于从Y = A + H开始的,具有Y坐标A和B的相邻点对,在(X,Y,Z)处放置一个大小为S的立方体,其中X和Z来自先前的步骤。
10)对每对点(如图所示)从步骤(9)重复,同时将Y每次增加S,直到Y> B-H。
11)从步骤(7)重复,同时将Z每次增加S,直到Z> Z2-H。
12)从步骤(3)重复,同时将X每次增加S,直到X> X2-H。
这样就完成了。免责声明:这可能不是一种有效的方法,但它可能是最简单的实现方法。