gpt4 book ai didi

ios - 使用 ARKit 时不显示 UILabel 文本

转载 作者:可可西里 更新时间:2023-11-01 01:59:59 25 4
gpt4 key购买 nike

我以编程方式生成一组 UILabels,将它们附加到 SCNNodes,然后将它们放置在场景中。

问题是一些标签上的文字没有出现。这(看似)随机发生。

代码如下:

var labels = [SCNNode]()

var index: Int
var x: Float
var y: Float

let N = 3
for i in 0 ... N-1 {
for k in 0 ... N-1 {

let node = label()
labels.append(node)

index = labels.count - 1
x = Float(i) * 0.5 - 0.5
y = Float(k) * 0.5 - 0.5

sceneView.scene.rootNode.addChildNode(labels[index])

labels[index].position = SCNVector3Make(x, y, -1)
}
}

以及创建标签节点的方法:

func label() -> SCNNode {

let node = SCNNode()
let label = UILabel(frame: CGRect(x: CGFloat(0), y: CGFloat(0),
width: CGFloat(100), height: CGFloat(50)))

let plane = SCNPlane(width: 0.2, height: 0.1)

label.text = "test"
label.adjustsFontSizeToFitWidth = true

plane.firstMaterial?.diffuse.contents = label
node.geometry = plane

return node

}

标签本身总是正确显示,只是其中一些是空白的,没有文字。

我试过调整标签的大小、它所附着的平面的大小、字体大小等 - 似乎没有任何效果。

我也尝试过将标签创建包含在 DispatchQueue.main.async { ... } 中,这也没有帮助。

我对 Swift 和 iOS 比较陌生,所以很容易错过一些非常明显的东西。

提前致谢!

编辑:

(1) 设置 label.backgroundColor = UIColor.magenta 清楚地表明实际上标签没有被创建,但是节点/平面被创建了。

一些标签是白色的(即只有 SCNNode 被渲染),但是在短暂的延迟之后它们有时会变成洋红色并且文本会出现。不过,某些标签仍会丢失。

(2) 进一步看来,它与节点(标签)相对于相机的位置和方向有关。我创建了一个大的 (10x10) 标签网格,然后测试将相机放置在网格中不同的初始位置。节点出现的可能性似乎与节点与初始相机位置的距离直接相关。那些直接在摄像机前面的节点总是被渲染,而那些远离摄像机的节点几乎从不被渲染。

(3) 解决方法/技巧是将标签转换为图像,然后使用它们 - 代码位于 https://github.com/Jordan-Campbell/uiimage-arkit-testing如果有人感兴趣的话。

最佳答案

如果您在 AR 中标记事物,99% 的情况下最好在“屏幕空间” 中而不是在“透视”中这样做。

屏幕空间标签的好处:

  1. 始终可读,无论用户距离标签有多远
  2. 您可以使用常规 UILabel,无需将它们绘制到图像,然后将图像映射到 SCNPlane。
  3. 您的应用会有第一方的感觉,因为 Apple 在其所有 AR 应用中使用屏幕空间作为标签(请参阅测量)。
  4. 您将能够在 UILabel 上使用标准动画,在 Perspective 中处理内容时设置动画要复杂得多。

如果您对 Screen Space 感兴趣,请告诉我,我很乐意提供一些代码向您展示基础知识。

关于ios - 使用 ARKit 时不显示 UILabel 文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47406334/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com