如果一个节点被缩放,则包含的scntext的边界框不会太大,这正常吗



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

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

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

我是不是遗漏了什么?我唯一的目标是得到一个合适大小的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)
}

我这里遗漏了什么吗?

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

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

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

最新更新