2017-10-25 5 views
6

私は私がタップ位置にシーンにいくつかのテキストを追加するARKitとシンプルなアプリ作成しています:それは作品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:

3-D letter from the front

サンプル2:

3-D letter from the side

私はそれを解決するためにいくつかの簡単なトリックがあるはずです知っているが、このトピックの初心者として、私はできませんでしたこれまでのところそれを見つけてください。

+0

テキストオブジェクトを配置するときにどのような動作を求めていますか?移動中にテキストが常にカメラの方に向くようにしたいのですか、または最初に配置されたときの方向に固定されたままにしますか? – dbn

答えて

2

は、私は(あなたが直面することが起こる場所)あなたがタップするとテキストがカメラに直面したいと言って、正しいが、その後、静止したままですか?

ノードの向きを調整するには、いくつかの方法があります。この場合は、単にテキストノードのeulerAnglesを、カメラのものと同じに設定することをお勧めします(テキストをインスタンス化する時点で)。 ARKitでデフォルト横向き用であるため、テキストが面白い出てくるよう

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

追加.pi/2は、テキストを確実にするために存在しているが、正しい向きである:あなたが追加addTag()機能で

。これは、ローカルz軸を中心に回転を適用します。

ノードの.localRotate()を使用するか、そのtransformプロパティにアクセスすることも考えられますが、私はpositionとeulerAnglesの両方を直接操作する方法が好きです。

これが役に立ちます。

EDIT:Float(1.57).pi/2に置き換えます。

+2

'Float(1.57)'を '.pi/2'に置き換える明快さを追加してください – dbn

+1

ありがとう、私はここにnoewdaysを取得するために管理されました。 – Tom

2

いつもテキストがカメラに向くようにしたいですか? SCNBillboardConstraintはあなたの友達です:

tagNode.constraints = [SCNBillboardConstraint()] 
+0

私は問題に直面しています。シーンファイルからルートノードのサブファイルである2つのSCNNodeがあり、これらの "テキストノード"にプログラムでSCNBillboardConstraintを追加すると、画面から消えてしまいます。 FUNC addBillboardContraintsToText(オブジェクト:VirtualObject){ ガードgeometry.isKind(の、storeNode.childNodes { LET形状は= node.geometry場合におけるノードのstoreNode = object.childNodes.first他{ リターン} をみましょう。 SCNText.self){ ノード。制約= [SCNBillboardConstraint()] } } } – Cyupa

+0

@Cyupa質問を投稿してください、コメントではありません。 – rickster

+0

私はここに質問を追加しました:https://stackoverflow.com/questions/49194597/adding-a-scnbillboardconstraint-makes-the-node-dissapear – Cyupa

関連する問題