SCNNode childNodes的总高度

时间:2014-11-07 18:54:36

标签: ios swift refactoring scenekit

我目前正在使用以下内容来获取SCNNode中所有子节点的总高度。是否有更高效/更好/更短/更快捷的方式来做到这一点?

CGFloat(columnNode.childNodes.reduce(CGFloat()) {
    let geometry = $1.geometry! as SCNBox
    return $0 + geometry.height
})

1 个答案:

答案 0 :(得分:13)

是的,这也是一种能让你得到更正确答案的方法。求和所有子节点几何的高度......

  • 仅在几何图形为SCNBox
  • 时才有效
  • 不考虑子节点的变换(如果它们被移动,旋转或缩放会怎么样?)
  • 没有考虑父节点的变换(如果你想在场景空间中加高高度怎么办?)

你想要的是SCNBoundingVolume协议,它适用于所有节点和几何,并描述包含所有节点(及其子节点)内容的最小矩形或球形空间。

在Swift 3中,这非常简单:

let (min, max) = columnNode.boundingBox

在此之后,minmax是包含columnNode内所有内容的最小可能框的左下角和左上角的坐标,无论如何如何安排内容(以及涉及何种几何)。这些坐标在与columnNode.position相同的系统中表示,因此如果您要查找的“高度”位于该空间的y轴方向,则只需减去这两个向量的y坐标:

let height = max.y - min.y

在Swift 2中,它的语法有点奇怪,但它运作得很好:

var min = SCNVector3Zero
var max = SCNVector3Zero
columnNode.getBoundingBoxMin(&min, max: &max)