2017-07-01 8 views
0

ノードをシーンに追加し、カメラに対して位置を維持しながら向きや回転を維持したいシーンのこれまでのところ...SceneKit/ARKitシーンにノードを追加して位置を保持するが、向きや回転をリセットするには

私は画面をタップすると、シーンのアンカーをカメラのトランスフォームと同じ変換で追加します。そして、didUpdateNodeでは、アンカーノードの位置情報が設定されているので、position.z = -0.5というモデルを含む子ノードを追加します。モデルノードは、カメラの直前のシーンに追加され、カメラの回転プロパティを反映します。下向き角度で傾斜電話で、これはそうようになります。

enter image description here

アンカーノードの回転データによって影響を受けるモデルノードは、カメラと同じように回転されます。この特定のモデルはその側に現れます - 私はそれを心配していません、それはちょうどプレースホルダーです。また、上の赤いボタンを無視してください。これはデバッグ用です。

これまでのところ、とても良いです。

回転情報が基本的に「リセット」されているため、代わりにカメラと同じ高さに表示され、デフォルトの正面位置に向いています。カメラを別に回転させて部屋の周りを動かすと、別のモデルが異なる位置に追加されますが、同じ高さと同じ向きになります。

これは次のようなものです。私は単にオブジェクトを追加するために画面をタップしたと仮定し、標準の高さで表示され、カメラではなくシーンに関連する回転が表示されます。

enter image description here

私は、ノードのeulerAnglesrotationorientationプロパティで遊んで試してみたが、これが満足に動作させることはできません。ここで私は今のところ..私は空白のシーンを作成しているコードです、と私はモデルとして標準SceneKitプロジェクトからship.scnを使用しています:

class ViewController: UIViewController, ARSCNViewDelegate { 
    @IBOutlet var sceneView: ARSCNView! 

    var anchors = [ARAnchor]()  

    override func viewDidLoad() { 
    super.viewDidLoad() 

    // Set the view's delegate 
    sceneView.delegate = self 

    // Show statistics such as fps and timing information 
    sceneView.showsStatistics = true 

    // Create a new scene 
    let scene = SCNScene(named: "scene.scn")! 

    // Set the scene to the view 
    sceneView.scene = scene 
    } 

    override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(animated) 

    // Create a session configuration 
    let configuration = ARWorldTrackingSessionConfiguration() 
    configuration.planeDetection = .horizontal 

    // Run the view's session 
    sceneView.session.run(configuration) 
    } 

    override func viewWillDisappear(_ animated: Bool) { 
    super.viewWillDisappear(animated) 

    // Pause the view's session 
    sceneView.session.pause() 
    } 

    func renderer(_ renderer: SCNSceneRenderer, didUpdate node: SCNNode, for anchor: ARAnchor) { 
    if anchors.contains(anchor) { 
     // Create a new scene 
     let scene = SCNScene(named: "art.scnassets/ship.scn")! 
     let shipNode = scene.rootNode.childNode(withName: "ship", recursively: true)! 
     shipNode.position.z = -5 
     node.addChildNode(shipNode) 
    } 

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
    super.touchesBegan(touches, with: event) 

     if let currentFrame = sceneView.session.currentFrame { 
     let translation = matrix_identity_float4x4 
     let transform = simd_mul(currentFrame.camera.transform, translation) 
     let anchor = ARAnchor(transform: transform) 

     anchors.append(anchor) 
     sceneView.session.add(anchor: anchor) 
     } 
    } 
    } 
} 
+0

モデルの位置について:正確に何をリセットしたいですか?飛行機があなたのカメラの高さに現れるようにしますか?一定の一定の高さで?飛行機は常にカメラの北に見えるのですか?カメラの前で?モデルの方向性について:カメラと無関係な定数(常に北、常に垂直)やミックス(常にカメラに直面している、常に垂直な)のようにしたいですか? – Guig

+1

['SCNTransformConstraint'](https://developer.apple.com/documentation/scenekit/scntransformconstraint)を見てください。 – orangenkopf

+0

@Guig理想的には、z座標が南から北へ、x座標が西から東へと変化する世界でフラット・プレーンを作成したいので、最初のノードでそれを作成しようとしています。私は北の位置に合わせて飛行機を得るための詳細を除外しました。なぜならそれはコアの位置が関係しているからです。それは次のステップです。今は、床にまっすぐに座っているかのように、横向きで、回転しないで横になっている必要があります。 – Andrew

答えて

0

私は何かが足りないか、あなただけの各モデルをしたいですかカメラの向きにかかわらず、同じ向きにすることはできますか?

それぞれのモデルの向きを、セッションの実行開始時に追加されたノードと同じに設定できますか?

例セッションが開始されるときに、シーンを可視または非表示にしてノードを追加し、その向きを保存してから、後でもう一度使用しますか?

関連する問題