【问题标题】:Total height of SCNNode childNodesSCNNode 子节点的总高度
【发布时间】:2015-01-04 15:37:51
【问题描述】:

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

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

【问题讨论】:

    标签: ios swift refactoring scenekit


    【解决方案1】:

    是的,而且还有一种方法可以为您提供更正确的答案。将所有子节点的几何高度相加...

    • 仅当几何为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)
    

    【讨论】:

    • 太棒了!非常感谢您的详细解释
    • 感谢您的回答,但这似乎与规模无关?例如,如果您在计算高度之前执行columNode.scale = SCNVector3(x: 2, y: 2, z: 2),则高度保持不变而不是缩放。还是我们做错了什么?
    • 边界体积在节点自己的坐标系中表示。如果你想要一个相对于其他东西(比如父节点)的包围体,你必须convert那些最小和最大点。
    猜你喜欢
    • 1970-01-01
    • 2017-10-03
    • 2019-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-09
    • 2015-02-19
    相关资源
    最近更新 更多