【问题标题】:How can I set text orientation in ARKit?如何在 ARKit 中设置文本方向?
【发布时间】:2017-11-03 14:39:08
【问题描述】:

我正在使用 ARKit 创建一个简单的应用程序,在其中我将一些文本添加到场景中的点击位置:

@objc func tapped(sender: UITapGestureRecognizer){
    let sceneView = sender.view as! ARSCNView
    let tapLocation = sender.location(in: sceneView)
    let hitTest = sceneView.hitTest(tapLocation, types: .featurePoint)
    if !hitTest.isEmpty{
        self.addTag(tag: "A", hitTestResult: hitTest.first!)
    }
    else{
        print("no match")
    }
}

func addTag(tag: String, hitTestResult: ARHitTestResult){
    let tag = SCNText(string:tag, extrusionDepth: 0.1)
    tag.font = UIFont(name: "Optima", size: 1)
    tag.firstMaterial?.diffuse.contents = UIColor.red

    let tagNode = SCNNode(geometry: tag)

    let transform = hitTestResult.worldTransform
    let thirdColumn = transform.columns.3
    tagNode.position = SCNVector3(thirdColumn.x,thirdColumn.y - tagNode.boundingBox.max.y / 2,thirdColumn.z)
    print("\(thirdColumn.x) \(thirdColumn.y) \(thirdColumn.z)")
    self.sceneView.scene.rootNode.addChildNode(tagNode)
}

它有效,但我对文本的方向有疑问。当我用相机的原始位置添加它时,文本方向没问题,我可以看到正面的文本(示例 1)。但是当我将相机向左/向右转动并通过点击添加文本时,我可以从侧面看到添加的文本(示例 2)。

样本 1:

示例 2:

我知道应该有一些简单的技巧来解决它,但作为这个主题的初学者,我到目前为止找不到它。

【问题讨论】:

  • 您在放置文本对象时寻求什么类型的行为?您是希望文本在您四处移动时始终面向相机,还是希望它在首次放置时保持固定方向?

标签: ios swift arkit


【解决方案1】:

您希望文字始终面向相机? SCNBillboardConstraint是你的朋友:

tagNode.constraints = [SCNBillboardConstraint()]

【讨论】:

  • 我遇到了一个问题。我有两个 SCNNode,它们是场景文件中根节点的子节点,当我以编程方式将 SCNBillboardConstraint 添加到这些“文本节点”时,它们只会从屏幕上消失。 func addBillboardContraintsToText(object: VirtualObject) { guard let storeNode = object.childNodes.first else { return } for storeNode.childNodes 中的节点 { if let geometry = node.geometry, geometry.isKind(of: SCNText.self) { node.constraints = [SCNBillboardConstraint()] } } }
  • @Cyupa 请发布问题,而不是评论。
  • 我在这里添加了一个问题:stackoverflow.com/questions/49194597/…
【解决方案2】:

我是否正确地说您希望文本在您点击时(无论您碰巧面对的地方)面向相机,然后保持静止?

有多种方法可以调整任何节点的方向。对于这种情况,我建议在实例化文本时将文本节点的eulerAngles 设置为与相机的相同。

在您的addTag() 函数中添加:

let eulerAngles = self.sceneView.session.currentFrame?.camera.eulerAngles
tagNode.eulerAngles = SCNVector3(eulerAngles.x, eulerAngles.y, eulerAngles.z + .pi / 2)

额外的.pi / 2 用于确保文本方向正确,因为 ARKit 的默认设置是横向方向,因此文本看起来很有趣。这将应用围绕局部 z 轴的旋转。

使用节点的.localRotate() 或访问其transform 属性也是合理的(有些人可能认为它更好),但是我喜欢直接操作位置和eulerAngles 的方法。

希望这会有所帮助。

编辑:将Float(1.57) 替换为.pi / 2

【讨论】:

  • .pi / 2 替换Float(1.57) 会增加清晰度
  • 谢谢你,很抱歉现在才回复,我确实设法到达这里。
猜你喜欢
  • 1970-01-01
  • 2017-12-20
  • 1970-01-01
  • 2018-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-10
  • 1970-01-01
相关资源
最近更新 更多