我的挑战是随机生成看起来像这样的体素树:https://imgur.com/a/LT17der(不是我自己的照片体素作品)
目前,我只是在寻找有关如何最好地创建主干的想法。我当时以为我将从设置躯干的宽度和高度开始,然后将每个块逐层添加到坐标位置,并在一定程度上确定块的确切放置位置。
任何想法和建议都值得赞赏-目前,我希望将其保持简单。
答案 0 :(得分:0)
我将尝试使用递归函数来生成体素树。 需要3个参数:
在Unity3D C#中,它看起来像:
void fillTree(Vector3 base, Vector3 extent, bool[,,] output, int depth)
此递归函数的第一个调用将是
bool[,,] output = new bool[sizeX, sizeY, sizeZ];
fillTree(Vector3.zero, Vector3.up, output, 0)`.
此功能将:
depth
是否大于最大值,否则返回output
到base
的胶囊写base + extent
,其厚度等于0.5^depth
,这样每个子树是两倍厚度小于其父元素的厚度(这可能很难,因此,如果性能不成问题,请天真地遍历整个网格,填充到线段[base; base + extent]
的距离小于厚度的所有体素。别忘了通过在矢量的每个分量上添加相同尺寸的网格大小的一半来将浮动坐标映射到网格坐标)alpha
设置为接近父级的水平角,可以使用atan2(extent.z, extent.x)
进行检索(因为角度是循环的,所以1被认为接近359 )!。 depth
越大,新角度必须与父角度的距离越近(范围必须与0.5^depth
之类的东西成比例,与厚度相同)。beta
设置为小于父树的垂直角,以使分支看起来会掉落(可以将父树的垂直角计算为atan2(extent.y, sqrt(extent.x*extent.x + extent.z * extent.z))
)newExtent
计算子树(cos(alpha)*cos(beta), sin(beta), sin(alpha)*sin(beta))
的范围。归一化此向量,并将其乘以类似0.5^depth
fillTree(base + extent, newExtent, output, depth + 1)
我还没有测试过该算法,也没有实现它,可以肯定它不如您想要实现的漂亮,但是我希望它能对您有所帮助。