2017-12-05 3 views
0

私はARKitが新しく、私はタップ位置にSCNBoxを作成する例を試しています。私がしようとしていることは、最初のタッチで私はボックスを作成し、作成されたボックスの2番目のタップでシーンから削除する必要があります。私はヒットテストをしています。それはボックスを追加し続ける。私は、これは単純な作業ですけど、私はそれをARKit:ノードを表示/非表示にするためにタップを処理します

@objc func handleTap(sender: UITapGestureRecognizer) { 

    print("hande tapp") 
    guard let _ = sceneView.session.currentFrame 
     else { return } 

    guard let scnView = sceneView else { return } 
    let touchLocation = sender.location(in: scnView) 
    let hitTestResult = scnView.hitTest(touchLocation, types: [ .featurePoint]) 

    guard let pointOfView = sceneView.pointOfView else {return} 
    print("point \(pointOfView.name)") 

    if hitTestResult.count > 0 { 

     print("Hit") 

     if let _ = pointOfView as? ARBox { 

      print("Box Available") 
     } 

     else { 

      print("Adding box") 

      let transform = hitTestResult.first?.worldTransform.columns.3 
      let xPosition = transform?.x 
      let yPosition = transform?.y 
      let zPosition = transform?.z 
      let position = SCNVector3(xPosition!,yPosition!,zPosition!) 

      basketCount = basketCount + 1 
      let newBasket = ARBox(position: position) 
      newBasket.name = "basket\(basketCount)" 
      self.sceneView.scene.rootNode.addChildNode(newBasket) 
      boxNodes.append(newBasket) 

     } 
    } 
} 

答えて

0

sceneViewのpointOfViewを行うことができません、あなたのシーン全体をレンダリングするために使用されるものである、あなたのシーンのルートノードです。一般的なケースでは、通常、lights/cameraを持つ空のノードです。私はそれをARBox /またはSCNNodeの任意のタイプとしてキャストすべきだとは思わない。

あなたはおそらく試すことができますが(hitResultsがあなたのhitTestの結果である)以下のロジックです:

if hitResults.count > 0 { 
    if let node = hitResults.first?.node as SCNNode? (or ARBox) { 
    // node.removeFromParentNode() 
    // or make the node opaque if you don't want to remove 
else { 
    // add node. 
関連する問題