\begingroup

我想挤出一些面,然后随机旋转挤出的“顶部”面的中心。到目前为止,我有一个“设置位置”节点,用于从“挤出”节点选择顶部面。我使用“矢量旋转”来获取旋转,并且可以通过计算设置为面的域来使用“位置”节点设置中心。

唯一的问题是,随机数是针对每个顶点独立计算的,因此面变得非平面。

我尝试使用域上的评估来获取随机数,但似乎不起作用。

\endgroup


最佳答案
4

\begingroup

由于一个顶点属于多个面,因此对面域的评估实际上是在顶面和侧面之间进行插值,从而产生不同的结果。


无“重复区域”的新解决方案

由于重复区域非常昂贵,因此最好只使用。但为了避免顶面和侧面之间的插值,我们使用“角面”来精确选择我们要从哪个面获取位置和旋转


旧解决方案

使用“重复区域”从来都不是一个好的解决方案,但我认为在这种情况下这是可行的方法。

在这里,我们循环每个原始面并单独挤压它们。这样,我们可以取顶点的平均值并评估单个面上的事物。(如果您希望“臂”与顶面一起旋转,这也允许您分离原始面并取其中心)

(如果您使用的是 Blender 4.3,则可以使用“Foreach 元素”而不是重复区域,这样可以丢弃一些节点)


包含两种解决方案的文件

\endgroup

10

  • \begingroup
    我不太同意Repeat Zone,尤其是如果它在顶点上循环,并且它可以像 stib 的解决方案那样更简单。此外,从性能角度来看,我猜你的解决方案会比 stib 的更昂贵。我更不鼓励使用For Each,开发人员已经警告过它的成本,如果属性可以完成工作,则应避免使用它:
    \endgroup


    – 


  • 1
    \begingroup
    @Lutzi,这就是为什么我一开始就说“使用重复区域从来都不是一个好的解决方案”(从性能角度来看,我的答案很糟糕)。但是,如果你仔细看看另一个解决方案,你会发现它并不准确。旋转中心不在顶面的中心(由于顶面和侧面之间的插值),随机值也被插值衰减了。对于 OP 来说,这可能已经足够了,但仍然不准确。
    \endgroup


    – 


  • \begingroup
    我也不同意,重复区域是一个很棒的工具。在这种情况下,它正在做一些属性可以实现的事情,并且需要更多的资源。所以,我不鼓励任何读者在这种情况下使用循环节点,尤其是对于较重的几何图形。
    \endgroup


    – 

  • \begingroup
    嗯……我刚刚通过测试确认了:另一个解决方案并不准确。旋转中心不在顶面的中心。结果与要求的“不同”。但是,这些面是平面的。要使用属性获得正确的结果,需要将顶部属性转移到侧面属性(不仅包括旋转,还包括位置)
    \endgroup


    – 


  • \begingroup
    抱歉,我一开始没搞明白这个问题。现在我明白了,目前我同意重复区域似乎是更好的方法。我会尝试找到一个仅使用属性的解决方案,那会很棒。
    \endgroup


    – 

\begingroup

无需数学运算的仅限字段的解决方案

这是我的做法。它使用字段,这应该会占用较少的资源。我不建议使用Repeat Zone(或即将推出的For Each),尤其是对于较重的几何图形。这会消耗更多资源。

我们可以捕捉面域上的面位置和法线,然后使用它们来旋转顶点的位置。

我们必须计算挤压后的位置。挤压是沿着面法线进行的,我们将法线向量缩放与挤压相同的量,然后我们就可以得到面将具有的位置。

Daniel Möller 指出的问题在这里通过在挤压前捕获位置和旋转来解决,从而避免插值问题。基本上整个挤压区域都知道它应该属于哪个面。它应该适用于任何网格。

以下是节点和动画。感谢 Markus von Broady 压缩我的节点并找到最小设置。

\endgroup

8

  • \begingroup
    由于 Daniel Möller提到的插值数学,您的法线可以工作,但您的面位置不能工作。您需要进行矢量数学:按评估顶点的面邻居数进行缩放。要查看问题,请在设置之前尝试使用“变换几何”将立方体移离原点。
    \endgroup


    – 


  • \begingroup
    啊啊,我刚刚点击了一下,我的解决方案确实有误,Suzanne 的头像有问题。我会努力改正的。
    \endgroup


    – 

  • \begingroup
    @MarkusvonBroady 我还更新了我的解决方案,这样就无需进行任何数学运算了。我认为这是我们目前得到的最简单的解决方案?我希望它最简单,而且有效。
    \endgroup


    – 

  • 2
    \begingroup
    太棒了!你在挤压之前捕获了所需的内容,这样所有挤压的几何体都有一份副本,因此平均值采用相同的值,因此插值给出原始值。以下设置简化为仅 10 个节点(+ 变换用于测试 + 三角剖分用于更好的三角剖分)
    \endgroup


    – 


  • 1
    \begingroup
    哦,太好了!我正在更新,谢谢你的意见!
    \endgroup


    – 

\begingroup

诀窍是将随机旋转存储为每个面的命名属性。看起来有点笨拙,但因为它为每个面存储了一个旋转向量,所以它有效。

\endgroup

1

  • 2
    \begingroup
    虽然您的答案比我的要清晰得多,但我相信命名属性也正在被插值(如原始问题中所述),这就是为什么您需要更大的值(2.5,而不是 1.3)来实现较小的旋转。由于所有相邻面的旋转为零,因此插值最终在所有顶点中相等。我猜所需的旋转值应该乘以 3(始终有两个侧面和一个与顶点相连的顶面)
    \endgroup


    – 


\begingroup

下的评论中说得对

[…]命名属性也将被插值(如原始问题中所述),这就是为什么您需要更大的值(2.5,而不是 1.3)来实现较小的旋转。由于所有相邻面的旋转均为零,因此插值在所有顶点中最终相等。我猜所需的旋转值应该乘以 3(始终有两个侧面和一个与顶点相连的顶面)

插值会对所有周围的面进行平均:

x =1+2+3+ +nn=1+2+3++nn

x = {x_1 + x_2 + x_3 + … + x_n \over n}

您可以将未选定的值乘以零(方便地用布尔值转换为一或零):

x =1× 0 +2× 1 +3× 0 + n=2n=1×0+2×1+3×0+n=2n

x = {x_1×0 + x_2×1 + x_3×0 + … \over n} = {x_2\over n}

因此,要获得实际选定的值,请将其乘以nnn

这里有太多的答案,所以我决定添加额外的怪癖,使其成为一个纯粹的领域:

(SE 图片托管

现在你可以像这样使用它:

\endgroup

2

  • \begingroup
    哇哦!太棒了。纯字段比命名属性更快吗?
    \endgroup


    – 

  • 3
    \begingroup
    @DanielMöller 我认为差异(无论哪个更快)并不大,更重要的是您不会遇到名称冲突。但是,我说的“纯”只是意味着组中没有几何套接字,因此您可以使用它来计算位置而无需实际修改它们,这可能对有效地链接操作有用,但我不知道这对任何人是否有用。
    \endgroup


    –