如果一个节点被缩放,包含的 scntext 边界框不是太正常,这是否正常?
Is it normal that if a node is scaled the contained bounding box of scntext is not too?
我一直在寻找使用 arkit 显示一些文本的方法。为此,我创建了一个 SCNText
对象,给它一个字体大小并按比例缩小。这似乎是调节其大小的推荐方法。
现在为了定位,我需要计算 SCNText
物体的高度。为此,有 boundingBox
方法 returns 一个 (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)
}
Am I missing something here?
听起来像。根据文档,边界框是根据 local 坐标系定义的,但是缩放等变换通常是通过调整局部坐标系映射到容器坐标的方式来完成的系统。来自 SCNBoundingVolume
文档:
The bounding volume of a node with an attached geometry is the bounding volume of the geometry, expressed in the node’s local space.
简而言之,您想知道文本相对于场景中其他事物的大小,但您得到的是文本节点局部坐标系中的大小。如果您想知道不同坐标下的大小 space,您需要将节点的变换应用于边界框。
我一直在寻找使用 arkit 显示一些文本的方法。为此,我创建了一个 SCNText
对象,给它一个字体大小并按比例缩小。这似乎是调节其大小的推荐方法。
现在为了定位,我需要计算 SCNText
物体的高度。为此,有 boundingBox
方法 returns 一个 (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)
}
Am I missing something here?
听起来像。根据文档,边界框是根据 local 坐标系定义的,但是缩放等变换通常是通过调整局部坐标系映射到容器坐标的方式来完成的系统。来自 SCNBoundingVolume
文档:
The bounding volume of a node with an attached geometry is the bounding volume of the geometry, expressed in the node’s local space.
简而言之,您想知道文本相对于场景中其他事物的大小,但您得到的是文本节点局部坐标系中的大小。如果您想知道不同坐标下的大小 space,您需要将节点的变换应用于边界框。