7

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

这个答案建议使用该pivot属性。

但是,该pivot属性的文档在 SCNNode 页面上很少,在 SCNBox 页面上什么也没有。

有人能解释一下该pivot物业是如何运作的吗?

4

3 回答 3

18

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

例如,如果你有一个SCNBox,它的边界框是

  • 分钟:(-0.5 * width, -0.5 * height, -0.5 * length)
  • 最大限度:(+0.5 * width, +0.5 * height, +0.5 * length)
  • 中央:(0.0, 0.0, 0.0)

如果您希望 的lengthSCNBox在正 Z 轴上增加,那么您想要的是

  • 分钟:(-0.5 * width, -0.5 * height, 0.0)
  • 最大限度:(+0.5 * width, +0.5 * height, length)
  • 中央:(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而不是node您将获得想要的结果。

解决方案 2:枢轴

事实证明,这正是该pivot属性所做的:

node.pivot = SCNMatrix4MakeTranslation(0, 0, -0.5 * length);

一旦你在心里弄清楚了中间节点的变换,只需将它的设置为pivot属性。


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

anchorPoint这与 Core Animation 的on 属性非常相似CALayer,除了在 Core Animation 中,锚点被指定为相对于图层的边界框(从01作为图层宽度和高度的百分比),而在 SceneKit 中它是绝对的。

于 2017-03-05T19:34:59.730 回答
6

假设你有一个这样创建的盒子:

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

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

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

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

于 2017-03-03T11:42:58.243 回答
0

听起来你想增加 SCNBox(几何)的长度。所以你可以简单地增加长度属性。你提到的答案是关于pivot房产的。从文档中可以看出:

节点位置、旋转和缩放的轴心点。

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

于 2017-03-03T09:53:03.787 回答