首页 > 解决方案 > 如果一个节点被缩放,包含的 scntext 边界框不是太正常,这是否正常?

问题描述

我一直在寻找使用 arkit 显示一些文本。为了实现这一点,我创建了一个SCNText对象,给它一个字体大小并缩小它。这似乎是调节其大小的推荐方法。

现在对于定位,我需要计算SCNText对象的高度。为此,有boundingBox一个返回(min, max)元组的方法。

问题是边界框参数仍然在没有缩放的情况下描述原始边界框。

我在这里错过了什么吗?我唯一的目标是获得一个大小合适的 3d 文本并知道它的高度。

谢谢!

private func displayBarValue(barNode: ARBarChartBar) {
    let barValueText = SCNText(string: String(barNode.value), extrusionDepth: 0.0)
    let fontSize = CGFloat(1)
    barValueText.font = UIFont (name: "Arial", size: fontSize)
    barValueText.firstMaterial!.isDoubleSided = true
    barValueText.firstMaterial!.diffuse.contents = UIColor.white

    let barValueLabel = SCNNode()
    barValueLabel.geometry = barValueText

    let scale = Float(0.05/fontSize)
    barValueLabel.scale = SCNVector3(scale, scale, scale)
    center(node: barValueLabel)

    let min = barValueLabel.boundingBox.min
    let max = barValueLabel.boundingBox.max
    let barValueLabelHeight = max.y - min.y
    let spaceBetweenBarAndText = Float(0.012)

    barValueLabel.position = SCNVector3(x: 0, y: barNode.barHeight/2+barValueLabelHeight/2+spaceBetweenBarAndText, z: 0)

    barNode.addChildNode(barValueLabel)
    }
}

func center(node: SCNNode) {
  let (min, max) = node.boundingBox
  let dx = min.x + 0.5 * (max.x - min.x)
  let dy = min.y + 0.5 * (max.y - min.y)
  let dz = min.z + 0.5 * (max.z - min.z)
  node.pivot = SCNMatrix4MakeTranslation(dx, dy, dz)
}

标签: iosswiftarkitbounding-boxscntext

解决方案


我在这里错过了什么吗?

听起来像。根据文档,边界框是根据局部坐标系定义的,但是缩放等变换通常是通过调整局部坐标系映射到容器坐标系的方式来完成的。从SCNBoundingVolume文档:

具有附加几何图形的节点的边界体积是几何图形的边界体积,在节点的局部空间中表示

简而言之,您想知道文本相对于场景中的其他事物有多大,但您得到的是文本节点本地坐标系中的大小。如果您想知道不同坐标空间中的大小,则需要将节点的变换应用于边界框。


推荐阅读