体素树生成器

问题描述 投票:0回答:1

我的挑战是随机生成一个看起来像这样的体素树:https://imgur.com/a/LT17der(不是我自己的照片中的体素工作)

现在我只是在寻找关于如何最好地创建主干的想法。我想我首先要设置主干的宽度和高度,并逐层添加每个块在坐标位置,并且在某种程度上随机性地确定块的放置位置。

任何想法和建议都表示赞赏 - 现在我希望保持简单。

c# unity3d voxel
1个回答
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是否不大于最大值,否则返回
  • 使用体素化算法,使用从outputbase的胶囊写base + extent,厚度等于0.5^depth,这样每个子树的厚度都比其父子厚两倍(这可能非常难,所以如果性能不是问题,只是在整个网格上天真地迭代,填充所有与线段[base; base + extent]的距离小于厚度的体素。不要忘记将浮点坐标映射到网格坐标,通过向向量的每个分量添加一半同一维度的网格大小)
  • 选择一个随机数的子树(> = 2)
  • 对于每个子树: 将随机水平角度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)

我既没有测试过这个算法,也没有实现它,并且它确实远不如你想要实现的那么漂亮,但我希望它对你有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.