【问题标题】:How to create a border for SCNNode to indicate its selection in iOS 11 ARKit-Scenekit?如何为 SCNNode 创建边框以指示其在 iOS 11 ARKit-Scenekit 中的选择?
【发布时间】:2018-02-14 20:55:11
【问题描述】:

如何绘制边框以突出显示 SCNNode 并向用户指示该节点已被选中? 在我的项目中,用户可以放置多个虚拟对象,并且用户可以随时选择任何对象。选择后,我应该向用户显示突出显示的 3D 对象。有没有办法直接实现这一点或在 SCNNode 上画一个边框?

【问题讨论】:

  • 小技巧:打开 Xcode,从SceneKit 模板创建一个新项目,打开 VC,向下滚动。点击节点时,您会看到突出显示节点的代码。

标签: scenekit ios11 arkit xcode9beta6


【解决方案1】:

您需要在sceneView 中添加点击手势识别器。

// add a tap gesture recognizer
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(handleTap(_:)))
scnView.addGestureRecognizer(tapGesture)

然后,处理点击并突出显示节点:

@objc
func handleTap(_ gestureRecognize: UIGestureRecognizer) {
    // retrieve the SCNView
    let scnView = self.view as! SCNView

    // check what nodes are tapped
    let p = gestureRecognize.location(in: scnView)
    let hitResults = scnView.hitTest(p, options: [:])
    // check that we clicked on at least one object
    if hitResults.count > 0 {
        // retrieved the first clicked object
        let result = hitResults[0]

        // get its material
        let material = result.node.geometry!.firstMaterial!

        // highlight it
        SCNTransaction.begin()
        SCNTransaction.animationDuration = 0.5

        // on completion - unhighlight
        SCNTransaction.completionBlock = {
            SCNTransaction.begin()
            SCNTransaction.animationDuration = 0.5

            material.emission.contents = UIColor.black

            SCNTransaction.commit()
        }

        material.emission.contents = UIColor.red

        SCNTransaction.commit()
    }
}

上面的 sn-p 突出显示整个节点。如果这是您要查找的内容,则必须对其进行调整以仅突出显示边框。

免责声明:
此代码直接取自打开新游戏 (SceneKit) 项目时创建的 Xcode 模板代码。

【讨论】:

  • 由于我是scenekit的新手,您能告诉我如何单独突出边框吗?
  • 如果我有多个子节点怎么办?然后,如果您点击多个子节点,则会突出显示不同的不同子节点。
  • 当然,因为这段代码突出显示了被点击的那个!
猜你喜欢
  • 2018-02-28
  • 2017-11-27
  • 2018-04-22
  • 2018-06-08
  • 2018-02-28
  • 2020-04-01
  • 2017-12-03
  • 2018-02-05
  • 1970-01-01
相关资源
最近更新 更多