SceneKit:了解SCNNode的pivot属性

时间:2017-03-03 00:18:52

标签: scenekit scnnode scnscene

目标是增加SCNBox的长度,使其仅在正z方向上增长。

This answer建议使用pivot属性。

但是,pivot属性的文档在SCNNode页面上是稀疏的,SCNBox页面上没有任何内容。

有人可以解释pivot属性的工作原理吗?

3 个答案:

答案 0 :(得分:11)

更改节点pivot在概念上与在此节点及其父节点之间插入中间节点相同。这在不同情况下很有用。一个例子是当节点的几何中心不在你预期的位置时。

例如,如果您有SCNBox,则其边界框为

  • min:(-0.5 * width, -0.5 * height, -0.5 * length)
  • max:(+0.5 * width, +0.5 * height, +0.5 * length)
  • center:(0.0, 0.0, 0.0)

如果您希望length的{​​{1}}仅在正Z轴上增加,那么您想要的是

  • min:SCNBox
  • max:(-0.5 * width, -0.5 * height, 0.0)
  • center:(+0.5 * width, +0.5 * height, length)

几何体的边界框永远不会改变,但是有一些方法可以安排节点并更改它们的边界框。

解决方案1:中间节点

处理变换时的一个常见解决方案是使用中间节点来更好地理解变换的应用方式。

在您的情况下,您需要从

更改节点层次结构
(0.0, 0.0, +0.5 * length)

- parentNode
  | - node
  |   * geometry
  |   * transform = SCNMatrix4MakeScale(...)

使用此新层次结构,- parentNode | - intermediateNode | * transform = SCNMatrix4MakeScale(...) | | - node | | * geometry | | * transform = SCNMatrix4MakeTranslation(0, 0, +0.5 * length) 的边界框的中心仍为node,但(0.0, 0.0, 0.0)的边界框的中心为intermediateNode

通过缩放(0.0, 0.0, +0.5 * length)代替intermediateNode,您将获得想要的结果。

解决方案2:转轴

事实证明,这正是node属性的作用:

pivot

一旦你精神上想出了中间节点的变换,只需将其 反向 设置为node.pivot = SCNMatrix4MakeTranslation(0, 0, -0.5 * length); 属性。

您可以在此处找到有关pivot媒体资源的更多信息:https://developer.apple.com/reference/scenekit/scnnode/1408044-pivot

这与核心动画在pivot上的anchorPoint属性非常相似,只是在核心动画中,锚点被指定为相对于图层的边界框(去从CALayer0占图层宽度和高度的百分比),而在SceneKit中,它是绝对的。

答案 1 :(得分:4)

假设您有一个像这样创建的框:

SCNBox(width: 1, height: 1, length: 1, chamferRadius: 0)

枢轴点将位于该框的中心,您现在想要将其移动到其中一个边缘。这可以通过将枢轴节点转换0.5来完成。 (这是盒子宽度的一半或中心和边缘之间的距离。)

boxNode.pivot = SCNMatrix4MakeTranslation(0, 0, -0.5)

现在,枢轴点将位于对象的中心X,中心Y和零Z处。如果你现在缩放框,它只会在正Z方向上增长。

答案 2 :(得分:0)

听起来想要增加SCNBox(几何体)的长度。所以你可以简单地增加length属性。您提到的答案是pivot属性。正如您从文档中看到的那样:

  

节点位置,旋转和比例的轴心点。

例如,通过将枢轴设置为平移变换,您可以将包含球体几何体的节点相对于球体放置在地板上而不是相对于其中心的位置进行定位。