在 3D 层/网格中组装节点的算法

标签 algorithm 3d mesh

这个问题可能有点抽象,它与任何库或语言无关。

想象在 3D 空间中有一层节点,随机分布在一个假想表面附近。

将这些节点组装成网格或柔性层的算法是什么,这样如果我们通过弹性反馈链接连接这些节点然后拉动一个节点,那么整个层就会开始弯曲和移动,而不是分解?

最简单的方法如下:只需将每个节点连接到它的 6-10 个最近的节点。如果节点放置是规则的,这将起作用,但如果由于某种原因节点分布中存在漏洞,则边缘节点可能只会从一侧连接到最近的节点。当你像这样拉动层时,孔开始增长,如两个不同球形层的屏幕截图所示,它们中都有孔:

Two layers of nodes with holes in them

那么:是否有一种算法可以在 3D 空间中为给定节点选择 N 个节点进行连接,从而防止孔的形成?如果孔洞已经形成,如果节点之间的连接是弹性拉动的,那么用什么算法来弥补它们?

请注意,图层在 3D 空间中具有“上下”方向,然后是“左、右、前、后”方向。 非常重要的是,每个单元格至少有一个左、右、前、后连接。但是,向上方向和向下方向也可能是空的。 我们可以假设六边形对称而不是立方体,具有相同的想法。

我认为理想的连接单元集应该是它们与给定单元的距离向量之和尽可能接近于零。但是,我什至想不出一种多项式方法来选择 N 个邻居的 M 个子集,以便它们的向量之和尽可能接近于零。如果直截了本地完成,这似乎是一个 NP 任务。

最佳答案

根据我对您的问题的理解,这是一个想法:将 3D 空间切割成多个层,例如 x 个单位高,并将节点分类到这些层中。想象这一层平放在一个表面上。假设我们从底部开始,对于在相当大范围内其下没有节点的所有节点中的每一个:

从这个节点开始。寻找它周围的一些节点。然而,当计算目标和我们的节点之间的距离时,它越接近平行于通过起始节点的 y 轴的线,我们对距离的补偿就越多(使用像高斯分布之类的函数),更远的地方是我们通过乘以一个大于 1 的因子来惩罚它。这样连接将是“定向”的,但允许一定程度的偏差,具体取决于您在函数中设置常量的方式。将我们的当前节点与具有最低“加权”距离的节点连接起来。对新节点重复这个过程,直到该节点在相当范围内没有在它之上的节点。

现在切换轴,在这种情况下从左边开始,做同样的事情。这取决于您编写“加权”函数的方式,可能会容忍不同程度的漏洞。一旦你完成了 x 轴和 y 轴,你就会得到类似扭曲网格的东西。可能会有一些节点未连接,因为它们对其他人不友好,但您可以将它们连接到最近的 4~6 个节点或做类似的事情。

如果您的节点在 3d 空间中以球形方式分散,您可能可以在所有 3 个轴上执行此过程:x、y 和 z。

关于在 3D 层/网格中组装节点的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44296004/

相关文章:

opengl - 网格颜色困惑可能是由于顶点法线计算错误

java - 如何降低装桶程序的时间复杂度?

unity3d - Unity:尝试复制 `mesh`时构建崩溃

algorithm - 生成包含连续辅音的英语单词列表

c# - Unity3d - 如何有效地从属于另一个游戏对象的另一个类调用方法

java - 用 Java 制作 3D 迷宫

three.js - 如何阻止 EffectComposer 破坏我的透明背景?

mesh - 有没有一种方法可以使一个网格的法线一致?

algorithm - 有多少间隔包含另一个间隔?

python - Networkx 哈密顿循环