\begingroup

我在 X 轴和 Y 轴上都有几个 -1 到 1 范围内的网格岛。我希望几何节点能够检测出任何岛,如果其中至少有一个点在两个轴上都超出了 -1 到 1 的范围,则删除该岛。我该如何实现这一点?

\endgroup


最佳答案
3

\begingroup

如果您有数千个或更多的网格岛,您可以避免重复区域,这将是一个救生员,如果您使用以下技巧:将满足删除标准的每个点移动到等于网格岛​​索引的坐标,然后对于每个顶点通过接近度检查是否移动了同一网格岛的某个顶点(至少一个):

\endgroup

12

  • \begingroup
    哦,虽然我做的基本上是一样的,但使用不等于节点检查某些东西是否超出范围,然后设置相应的Epsilon值要简单得多……我真是太蠢了:)
    \endgroup


    – 

  • \begingroup
    我个人喜欢累积文件的方法。使用岛屿索引作为位置对我来说有点不方便。此外,从计算的角度来看,接近度和设置位置看起来很昂贵
    \endgroup


    – 


  • \begingroup
    …虽然问题明确询问了 X 和 Y,我猜想这意味着它们是平面网格,因此检查 Z 值也无所谓 – 但是如果 Z 上的 -1 和 1 之外还有网格,但这些网格不应被删除,只有 X 和 Y 重要,那么你还是必须分别比较它们,然后再合并结果,这样与我的结果相比不会有太大差别。但我仍然很恼火,因为我没有想到“相等”和“epsilon” 😀
    \endgroup


    – 

  • \begingroup
    @Crantisz 实际上,时间并没有表明 Markus 的设置计算成本非常高,实际上比您的少很多……尤其是因为您的设置甚至没有执行问题中要求的操作……?它仅检查低于 0 的 Z 值,而问题是关于 -1 到 1 之外的 X 和 Y。
    \endgroup


    – 

  • \begingroup
    我认为条件在计算成本中只占很小一部分。只有一种方法可以检查 – 测试
    \endgroup


    – 

\begingroup

首先,我将一个Position节点插入到一个设置为Absolute的Vector Math节点中,这样所有位置值都将为正数,即如果您想检查值是否低于 -1 或高于 +1,您可以使用一个设置为Greater Than 1 的Compare节点。

因此,在获得绝对值后,我采用单独的 XYZ节点并比较 X 和 Y 的值(如果它们大于 1),然后将结果与设置为Or的布尔数学节点相结合,这样,如果任何 X 或 Y 值超出 -1 到 1 的范围,结果始终为真。

我将该值插入到“累积场”节点,将“网格岛”节点的“岛索引”插入到“组索引”,并将“总输出”用作“删除几何节点的选择”(我在这里将其设置为域,但它也适用于边)。

作为几何体,我有一个外部对象,该对象由由一些网格组成的对象信息节点引用,其中一些网格超出了 -1 到 1 的范围。

左侧是原始对象,四个网格岛的角在 X 或 Y 上的 -1 到 1 范围之外,标记为红色。右侧是几何节点修改器的结果。当然,如果网格更复杂或超出两个轴的范围,这也有效。

\endgroup

3

  • 1
    \begingroup
    哦,对了,累积领域……我觉得这个比我的性能更好!
    \endgroup


    – 

  • \begingroup
    @MarkusvonBroady 但只是一点点……
    \endgroup


    – 

  • \begingroup
    根据您的测试,速度几乎快 10 倍,但根据 Crantisz 的测试,速度快 20 倍以上
    \endgroup


    – 


\begingroup

下面是如何删除所有 Z 小于 0 的岛屿的示例:

基本上,它会循环遍历所有岛屿,如果 Z 位置的最小值大于 0,则将其收集起来。

\endgroup