如何在ARKit中设置文本方向?

Tom*_*Tom 7 ios swift arkit

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

@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)
}
Run Code Online (Sandbox Code Playgroud)

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

样本1:

前面的三维字母

样本2:

侧面有3-D字母

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

ric*_*ter 6

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

tagNode.constraints = [SCNBillboardConstraint()]
Run Code Online (Sandbox Code Playgroud)


Jor*_*dan 4

我是否正确地说,当您点击时(无论您碰巧面向哪里),您希望文本面向相机,但随后保持静止?

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

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

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

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

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

希望这可以帮助。

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

  • 将“Float(1.57)”替换为“.pi / 2”会增加清晰度 (2认同)