ios - 如果一个节点被缩放,包含的 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)
}
解决方案
我在这里错过了什么吗?
听起来像。根据文档,边界框是根据局部坐标系定义的,但是缩放等变换通常是通过调整局部坐标系映射到容器坐标系的方式来完成的。从SCNBoundingVolume
文档:
具有附加几何图形的节点的边界体积是几何图形的边界体积,在节点的局部空间中表示。
简而言之,您想知道文本相对于场景中的其他事物有多大,但您得到的是文本节点本地坐标系中的大小。如果您想知道不同坐标空间中的大小,则需要将节点的变换应用于边界框。
推荐阅读
- c++ - WinAPI GUI 看起来很奇怪。应使用默认的 Windows 样式
- c# - 嵌套 for 循环问题 - 需要帮助
- apache-zookeeper - 通过zookeeper连接时如何确定选择了哪个Apache Drill钻头?
- mongodb - 社交媒体网站如何为他们的帖子组合数据
- sed - 如何在 toml 配置文件中使用 SED 正则表达式?
- java - 升级我的 Fragment 的导航版本时出现问题(从 2.3.5 到 2.4.0-alpha03)
- firebase - 如何在一个查询列表数组中编写多个图像 URL。颤振火力基地
- c# - RDLC - 创建详细信息表,按发票对每一行的表进行拆分/分组
- java - 尽管使用了配置类,但背景图像没有出现在我的 Spring mvc 项目中
- java - AEM 6.5 @Reference(target = "(component.name=componentName)") 不工作