【问题标题】:hitTest(_:options:) for SCNNodes without physicsBody swift没有physicsBody swift的SCNNodes的hitTest(_:options:)
【发布时间】:2017-12-12 21:50:12
【问题描述】:

我正在尝试确定如何在不为我的 SCNNode 实际创建physicsBody 的情况下进行“hitTest”。

我可以为命中测试方法使用什么替代方法? (包括没有物理实体的节点)。我正在尝试选择屏幕触摸打开的第一个节点

问题,'命中测试'要求节点有一个physicsBody 如果我有一个physicsBody,这会起作用,但是在我添加physicsBody 之前,我需要对我的SCNNode 做一些事情。

我的“environmentContainer”确实有第一个 SCNNode;但是,“results.first”返回了第一个带有物理体的节点,我需要第一个节点(不管它是否有物理体)

case .began:
    let results = sceneView.hitTest(firstTouch!, options: [SCNHitTestOption.firstFoundOnly: true])
    if results.first != nil {
        if environmentContainer.childNodes.contains((results.first?.node)!)
        {
            firstDragTapOnSelectedNode = true
            print("firstDragTapOnSelectedNode = true")
        }
        else {
            // always returns false because 'results.first' is picking up the wrong node which is in a different SCNNode container
            print("firstDragTapOnSelectedNode = false")
        }
    }
case .ended:
    firstDragTapOnSelectedNode = false
default: break
}

注意:firstDragTapOnSelectedNode 初始化为 false

【问题讨论】:

    标签: ios swift collision-detection scenekit hittest


    【解决方案1】:

    默认情况下,SceneKit 命中测试针对几何进行测试。您可以将 SCNHitTestOption.boundingBoxOnly 设置为 true 以检查节点的边界框。 命中测试应该与 physicsBody 无关,只与几何和边界框有关。

    【讨论】:

    • 我在阅读您的帖子后检查了 hitTest 的文档(然后在本周剩下的时间里没有 wifi 区域),并确认它没有说任何关于需要physicsBody 的内容(必须得到它与我同时试验的 rayTestWithSegment 和 convexSweepTest 混合在一起),那么为什么我的代码不起作用?我认为“boundingBoxOnly”是一个很好的建议,但这似乎也无济于事......我唯一能够得到工作的是(奇怪地)摆脱如果“SCNHitTestOption.firstFoundOnly”,但其他一切都保持不变。
    • 在我添加 'SCNHitOption.firstFoundOnly' 选项之前和之后,'results.first != nil' 是否应该相同? (注意被点击的节点在屏幕的前台)
    • 有趣。在设置几何后,boundingBoxOnly 键按预期工作,我根本无法在没有几何的情况下进行命中测试。您的节点是否附加了几何图形?
    • 它确实有一个几何体(SCNBox 所以 boundingBoxOnly 不应该有所作为),正如你所说,它不需要物理体,但我只能让 hitTest 工作时它没有“SCNHitTestOption.firstFoundOnly”选项……我对此唯一的另一个想法是,对于所有几何节点,hitTest 的实现并不是按从最近到最远的顺序进行的。这不是一个大问题,因为我只是在用户交互触发器上执行 hitTest,所以它不会始终如一地发生,但仍然很奇怪。
    • ... 请注意,当我的节点漂浮在空中(没有物理体)且其前后没有其他节点时,当它有'SCNHitTestOption.firstFoundOnly' 选项也是,所以它让我认为这个特定选项是为了碰撞目的。只有当我不包含该选项时,我尝试选择的节点才是预期的“results.first.node”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-08
    • 1970-01-01
    • 2015-12-25
    • 2023-04-04
    • 2016-08-03
    • 1970-01-01
    相关资源
    最近更新 更多