有人可以建议我对3d模型进行体素化的方法吗?

时间:2015-10-29 20:30:20

标签: javascript 3d voxel voxels

本网站介绍了如何做到这一点。 http://drububu.com/miscellaneous/voxelizer/index.html但我无法理解如何在代码中实现它。

1 个答案:

答案 0 :(得分:0)

步骤:

1)指定两个 垂直方向,这些方向决定了多维数据集的方向。为方便起见,我将分别选择它们作为X轴和Z轴。 X将是交叉平面的法线,Y,Z将是平面内的2D坐标轴。

enter image description here

2)找到包围网格的最小轴向长方体(AABB)。我相信这很容易。在这种情况下,它会给你6个数字,[X1,X2,Y1,Y2,Z1,Z2]。

3)说你选择你的立方体有尺寸S;设H = S / 2.从X X = X1 + H开始,构造一个具有法线(1,0,0)和中心(X,0,0)的平面。

enter image description here

4)将网格与其相交。有关数学和数学的详细信息,请参见此处用C ++实现:http://www.geometrictools.com/Documentation/ClipMesh.pdf

5)取交叉点产生的边缘。 通过查找共享公共端点的对,并将它们插入到一些双向链接列表中来加入。通过这种方式,他们可以按顺序排列。

enter image description here

6)找到这个形状的最小包围矩形,给你[Y1,Y2,Z1,Z2]

7)从Z = Z1 + H开始,创建一条从(X,Y1,Z)到(X,Y2,Z)的直线。将此行与所有相交 获取点的路径中的边。沿着链接列表走,以避免重复测试。

enter image description here

8)将点对其Y坐标进行排序。插入排序将执行:https://en.wikipedia.org/wiki/Insertion_sort

9)对于相邻的点,Y坐标为A和B,从Y = A + H开始,将一个大小为S的立方体放在(X,Y,Z)X处和Z来自前面的步骤。

10)对于每对点(如图所示)从步骤(9)重复,同时每次将Y递增S,直到Y> 0。 B - H.

enter image description here

11)从步骤(7)开始重复,同时每次将Z递增S,直到Z> 1。 Z2 - H.

12)从步骤(3)开始重复,同时每次将X递增S,直到X> 1。 X2 - H.

你已经完成了。免责声明:这可能不是一种有效的方式,但它可能是最简单,最简单的实现方式。