使用ARKit将SCNText添加到SCNScene

5

我刚开始学习ARKit和Scenekit。我读了一些关于Scenekit的资料,发现如果要添加文本,需要使用SCNText。

我试着这样写但是没有显示出来。

    guard let pointOfView = sceneView.pointOfView else { return }

    let text = SCNText(string: "Hello", extrusionDepth: 4)
    let textNode = SCNNode(geometry: text)
    textNode.geometry = text
    textNode.position = SCNVector3Make(pointOfView.position.x, pointOfView.position.y, pointOfView.position.z)
    sceneView.scene.rootNode.addChildNode(textNode)

当用户按下按钮时,我希望能在SCNScene上添加一些文本(比如“hello world”)。请问如何实现?

编辑

我看到了这段文本,但由于我还没有设置平面(或锚点),我无法像面对该文本一样查看它。请问该怎么做?


遇到了同样的问题。你解决了吗? - dmr07
1个回答

8

这里至少有两个问题。


如果将节点的位置设置为与相机相匹配,您可能看不到该节点的任何内容。您需要将物体放在相机前面才能看到它们。相机始终朝着其本地空间的-z方向查看。有很多方法可以进行必要的数学计算,但以下代码可能会很方便(由手机编写,因此结果可能有所不同):

textNode.simdPosition = pointOfView.simdPosition + pointOfView.simdWorldFront * 0.5

这应该将您的物体放在相机前半米处(或者准确地说,相机此时的位置,它不会跟随相机)。这是因为simdWorldFront 是向量 (0,0,-1),在本地空间中意味着相机节点所指向的方向,从本地空间转换到世界空间。
SCNText 的默认字体大小大约为16。但是,场景单位对应于ARKit中的米。而且,“文本框”以其左下角为锚定点。因此,很可能您的文本不可见,因为它高达十六米,并且偏右。
通过在节点上设置scalepivot 来使其内容更小是一种简单的处理方法。

0.5不起作用...“二元运算符'*'不能应用于类型为'() -> sims_float3'(又名'() -> float3')和'Double'的操作数” - zumzum
simdWorldFront是一个方法而不是属性,所以您需要在它后面加上(). (这可能是个错误,因为它与非SIMD的 worldFront 和其他属性不一致。请向Apple报告此问题)已编辑的答案。 - rickster
1
确实,这是一个错误 - simdWorldFront 在我发布此文时的测试版和最近的 Xcode 9.0 GM 版本之间成为一个属性(以匹配类似的 API)。 - rickster

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接