我的挑战是随机生成一个看起来像这样的体素树:https://imgur.com/a/LT17der(不是我自己的照片中的体素工作)
现在我只是在寻找关于如何最好地创建主干的想法。我想我首先要设置主干的宽度和高度,并逐层添加每个块在坐标位置,并且在某种程度上随机性地确定块的放置位置。
任何想法和建议都表示赞赏 - 现在我希望保持简单。
我会尝试创建一个递归函数来生成体素树。它需要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)
检索(Beward,角度是循环的,因此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)
我既没有测试过这个算法,也没有实现它,并且它确实远不如你想要实现的那么漂亮,但我希望它对你有帮助。