SceneKit:了解SCNNode的pivot属性

Cra*_*lot 4 scenekit scnnode scnscene

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

这个答案建议玩pivot房产.

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

有人可以解释该pivot物业的运作方式吗?

mnu*_*ges 12

更改节点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)

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


解决方案1:中间节点

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

在您的情况下,您将需要更改节点层次结构

- parentNode
  | - node
  |   * geometry
  |   * transform = SCNMatrix4MakeScale(...)
Run Code Online (Sandbox Code Playgroud)

- parentNode
  | - intermediateNode
  |   * transform = SCNMatrix4MakeScale(...)
  |   | - node
  |   |   * geometry
  |   |   * transform = SCNMatrix4MakeTranslation(0, 0, +0.5 * length)
Run Code Online (Sandbox Code Playgroud)

使用这个新的层次结构,边界框的中心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);
Run Code Online (Sandbox Code Playgroud)

一旦您精神上想出了中间节点的变换,只需将其反转设置为pivot属性即可.


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

这是非常相似的核心动画的anchorPoint财产CALayer,所不同的是在核心动画锚点被指定为相对于该层的边界框(从进入01作为层的宽度和高度的百分比),而在SceneKit它是绝对的.

  • 非常感谢您的详细解释。SceneKit 很棒,但令人沮丧,因为文档太差了,我知道这不是你的错。由于它太新了,如果你遇到困难,没有多少专家可以提供帮助。Apple 是否计划在未来投入更多资源来增强 SceneKit 文档? (2认同)

Jam*_*s P 5

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

SCNBox(width: 1, height: 1, length: 1, chamferRadius: 0)
Run Code Online (Sandbox Code Playgroud)

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

boxNode.pivot = SCNMatrix4MakeTranslation(0, 0, -0.5)
Run Code Online (Sandbox Code Playgroud)

现在,枢轴点将位于对象的中心X,中心Y和零Z。如果现在缩放框,则框将仅沿Z轴正方向增长。