Scenekit hitTestWithSegment 只返回第一个命中(突然)

Posted

技术标签:

【中文标题】Scenekit hitTestWithSegment 只返回第一个命中(突然)【英文标题】:Scenekit hitTestWithSegment only returns first hit (all of a sudden) 【发布时间】:2018-07-15 17:45:04 【问题描述】:

基本上 hitTestWithSegment 只返回第一个命中。

我有多个节点在 Z 轴上按 1 到 3 行移动。类似于摇滚乐队之类的游戏。当一行2个或更多行通过segment时,只返回左边第一个节点。

hit = scene.rootNode.hitTestWithSegment(from: SCNVector3(-3, 0, 0) , to: SCNVector3(3, 0, 0), options: nil)

if hit.count > 0
   print(hit.count)

输出:1

我也尝试将选项设置为

[SCNHitTestOption.firstFoundOnly.rawValue: false]

我得到了同样的东西。

我不知道出了什么问题。 hitTestWithSegment 一直按预期工作,直到我今天打开 xcode。我没有做任何更改,没有软件更新,只是现在工作方式不同了。我剥离了所有代码,基本上只是命中测试,我一次只能获得 1 个命中

编辑:我找到了一种解决方法,但我不明白为什么它会起作用或为什么它首先会损坏。

我把我的 from: 换成了:vectors (3, 0, 0), (-3, 0, 0),它又可以工作了

反转段应该只改变首先返回的节点而不是多少。

编辑:这不是在 ios 上,而是在 Mac 上

【问题讨论】:

看这个问题的答案:***.com/questions/46352867/… 也就是说,从ios 11.0开始需要将searchmode选项设置为all。 谢谢,这行得通。它应该作为答案而不是评论提供吗? 我将它作为评论发布,因为我正准备将其报告为重复,但即使答案是,另一个问题也不完全相同。我会发布它作为答案。很高兴它成功了。 在我看来,片段的方向在这里不应该起任何作用,无论选项设置为仅返回第一个命中还是所有命中。还是我错过了什么? 【参考方案1】:

Apple 决定通过更改 hittest 函数的默认行为来让 IOS 11 中的每个人都大吃一惊。从 IOS 11 开始,您需要明确告诉 hittest 搜索所有节点,而不仅仅是返回第一个命中结果:

hitTestOptions[SCNHitTestOption.searchMode] = SCNHitTestSearchMode.all.rawValue as NSNumber

如果命中多个节点,这会将其设置为返回命中结果数组。

【讨论】:

知道为什么 hitTestWithSegment() 需要选项字典中的字符串吗?在其他任何地方(例如在 SCNSceneRenderer 的 hitTest() 中)它都需要适当的结构值,这更有意义......

以上是关于Scenekit hitTestWithSegment 只返回第一个命中(突然)的主要内容,如果未能解决你的问题,请参考以下文章

SceneKit - 线程 - 在哪个线程上做啥?

iOS之SceneKit.h文件简介

如何在 SceneKit 中使用 SCNBufferBindingBlock?

SceneKit - 如何获取 .dae 模型的动画?

Scenekit:动画时模型改变大小

将scenekit和spritekit组合在一个屏幕中