簡體   English   中英

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

[英]How can I set text orientation in 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)
}

它有效,但我對文本的方向有問題。 當我用相機的原始位置添加它時,文本方向正常,我可以正面看到文本(樣本1)。 但是當我向左/向右轉動相機並通過點擊添加文本時,我可以從側面看到添加的文本(示例2)。

樣本1:

前面的三維字母

樣本2:

側面有3-D字母

我知道應該有一些簡單的技巧來解決它,但作為這個主題的初學者我到目前為止找不到它。

您希望文本始終面向相機嗎? SCNBillboardConstraint是你的朋友:

tagNode.constraints = [SCNBillboardConstraint()]

我是否正確地說當你點擊(無論你碰巧面對的地方)時你想要文本面對鏡頭,但是然后保持靜止?

有許多方法可以調整任何節點的方向。 對於這種情況,我建議在實例化文本時簡單地將文本節點的eulerAngles設置為等於攝像機的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的方法。

希望這可以幫助。

編輯:用.pi / 2替換Float(1.57)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM