2017-08-27 24 views
1

私は、iOS 11(ベータ版)でARKitとSceneKitを使用してiOSアプリケーションを作成しています。SCNNodeに追加情報を保存する方法は?

このアプリケーションは、拡張現実シーンに多くのアイテムを追加します。これらの項目のそれぞれを識別するために、私はMySCNNodeとしてSCNNodeをサブクラス化し、それにidフィールドを置く:

MySCNNode: SCNNode { 
    var id: Int 
    ...some initializer to assign value to the id 
} 

私もtouchesBeganデリゲートメソッドを実装しました。ユーザーがアイテムに触れると、対応するidを取得したいと思います。だから私は戻ってMySCNNodeからSCNNodeを対応するその項目のをキャストしようとした:

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

    // hitTest to retrieve item's id 
    if let touchLocation = touches.first?.location(in: sceneLocationView) { 
     DDLogDebug("received touch location") 
     if let hit = sceneLocationView.hitTest(touchLocation, options: nil).first { 
      DDLogDebug("received a hit") 
      if let scnNode = hit.node as? SCNNode { 
       DDLogDebug("received a scnNode)") 
        if let mySCNNode = scnNode as? MySCNNode { 
         DDLogDebug("received a MySCNNode") // ====> Never reaches here 
        } 

      } 


      return 
     } 


    } 


} 

しかし、SCNNodeからMySCNNodeにキャストするステップが戻っMySCNNodeにSCNNodeをキャストしようとしたとき、私は間違っているいくつかの場所を書いたの

起こることはありません上記のヒットテストで? SCNNodeに追加情報を格納し、後でそれを取得する代替手段はありますか?

は、私はあなたが正しい軌道に乗っていると思いますが、あなたは非常に多くのキャストを必要としない、あなたはif let s「を積み重ねる」場合、それは簡単です、あなたに

+0

:その後、

extension SCNNode { /// Returns parent node of specified type. /// /// - Returns: An optional 'SCNNode' of specified 'T' class type. func parentOfType<T: SCNNode>() -> T? { var node: SCNNode! = self repeat { if let node = node as? T { return node } node = node?.parent } while node != nil return nil } } 

と使用:あなたはSCNNode拡張子を追加することができます。 –

答えて

0

ありがとうございます。試してみてください:

if let touchLocation = touches.first?.location(in: sceneLocationView), 
    let hit = sceneLocationView.hitTest(touchLocation, options: nil).first, 
    let myNode = hit.node as? MySCNNode { 
    DDLogDebug("received a MySCNNode") 
} 
2

まず、idは必要ありません。代わりに、既存のname属性を使用できます。しかし、ノードのタイプをチェックしたい場合は、hitTest結果ノードが子から始まるため、ノードのタイプをチェックする必要があります。シーンビューでnameプロパティを使用します「これらの項目のそれぞれを識別するために、」

if let myNode = node.parentOfType() as? MySCNNode { 
    // do something 
} 
関連する問題