将3D模型转换为体素场

7
我需要编写一些代码将四面体数组转换为体素场。让其工作起来应该很容易,但使其快速运行则不那么简单。 有人知道我可以使用哪些库或源代码吗?我相信肯定有人曾经做过这个。 编辑:算法还需要填充模型内部的体素,仅空壳是不够的。

1
指定您所说的“quad”是什么可能会有帮助。 - Sven Marnach
2
快速谷歌搜索“体素化”会显示很多东西。看看这个网址http://www.cs.princeton.edu/~min/binvox/。 - Alexandre C.
在图形学中,“quad”通常指由四个共面顶点定义的形状。 - 3Dave
2个回答

8

@Alexandre C.发布的voxelation链接看起来不错。

以下是我们将常规四边形/三角形模型转换为折射率/介电常数值的立方阵列,用于光子学/电磁仿真时如何解决此问题的简要概述。

  1. 创建场景的BSP树。(是的,真的)
  2. 在您的模型或解决方案空间上定期沿X、Y、Z进行迭代。(每个轴上的间隔应等于所需的体素尺寸。)
  3. 在x/y/z循环的每个点上,检查该点是否在BSP树中。如果它在实体内部,请在该点处创建一个体素,并根据源模型设置其属性(颜色、纹理坐标等)(从您的BSP节点中引用)。 (优化提示:如果您的内部最深循环沿Y轴(垂直轴)并且正在创建地形或XZ定向表面,则可以在创建体素时退出Y循环。)

  4. 保存

  5. 赚到钱!

构建BSP是唯一有点复杂的部分(但乍一看比它看起来容易得多),但它已经在网络上得到了详细的记录。这将适用于几乎任何模型形状,并且还为您提供了一个很好的树,您可以用它来进行碰撞检测和可见性确定等操作。

此外,请注意,整个过程应在编译时或使用专用工具(显然,会产生包含树和体素场的文件,您将在运行时使用该文件)中进行。如果您使用XNA,则很容易将所有内容导入内容管道。


我之前应该提到,但模型内部也需要填充像素。不过,如果表面是封闭的,我是否可以在撞击多边形后继续添加像素,直到撞击另一个多边形为止? - Hannesh
@Hannesh 是的。BSP会为您检查的每个点提供“内部”或“外部”的结果。您不必在进入模型后停止创建体素,也不必知道一个模型在哪里结束,下一个模型从哪里开始。这种方法的好处是,对于给定的XYZ值,您不必了解周围发生的任何事情。 - 3Dave
哦,真的吗?!:D 这正是我最担心的事情。我需要能够生成体素场的小块,这些块完全可能位于模型内部。我以前没有使用过BSP树,但我认为它们即将成为我的新朋友! - Hannesh

1

我无法想象它适用于模型的任何其他部分,除了外壳。 - Hannesh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接