1

シーンにノードを追加して、カメラに対する位置を維持しながら、シーンの向き/回転を維持したいと考えています。今までどこにいた...

画面をタップすると、シーンにアンカーが追加され、カメラの変換と同じ変換が行われます。次にdidUpdateNode、アンカー ノードの位置情報がセットアップされた で、モデルを含む子ノードを追加しますposition.z = -0.5。モデル ノードは、カメラの真正面のシーンに追加され、カメラの回転プロパティをミラーリングします。電話を下向きに斜めに傾けると、次のようになります。

ここに画像の説明を入力

アンカー ノードの回転データの影響を受けるモデル ノードは、カメラと同じように回転します。この特定のモデルは横向きに表示されます - 私は気にしません。これは単なるプレースホルダーです。また、デバッグ用の上部にある赤いボタンも無視してください。

ここまでは順調ですね。

これの代わりに私が望んでいるのは、回転情報が本質的に「リセット」されるため、代わりにカメラと同じ高さに表示され、デフォルトの正面向きの位置に面することです。カメラを別の角度に回転させて部屋の中を移動すると、別のモデルが別の位置に追加されますが、同じ高さと同じ方向になります。

それはこのように見えるかもしれません。画面をタップしてオブジェクトを追加したところ、カメラではなくシーンに合わせて標準の高さと回転で表示されたと想像してください。

ここに画像の説明を入力

ノードのeulerAnglesrotationおよびorientationプロパティをいじってみましたが、満足に動作させることができません。これまでのコードは次のとおりです。空のシーンを作成ship.scnし、標準の SceneKit プロジェクトをモデルとして使用しています。

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)
        }
    }
  }
}
4

1 に答える 1