这个网站解释了如何做到这一点。http://drububu.com/miscellaneous/voxelizer/index.html 但我不明白如何在代码中实现它。
1 回答
程序:
1) 指定两个 垂直方向,确定立方体的方向。为方便起见,我将分别选择它们作为 X 轴和 Z 轴。X 将是相交平面的法线,Y、Z 将是平面内的 2D 坐标轴。
2) 找到包围网格的最小轴向长方体 (AABB)。我敢肯定这很容易。在这种情况下,这会给你 6 个数字,[X1,X2,Y1,Y2,Z1,Z2]。
3)假设您选择具有维度 S 的立方体;令 H = S / 2。从 XX = 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 和 B,从 Y = A + H 开始,在 (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。
你完成了。免责声明:这可能不是一种有效的方法,但它可能是最简单和最简单的实现方法。