Scenekit hitTestWithSegment возвращает только первое попадание (внезапно)

в основном hitTestWithSegment возвращает только первое попадание.

у меня есть несколько узлов, перемещающихся по оси Z в рядах от 1 до 3. похоже на игру, такую ​​как рок-группа. когда строка из 2 или более проходит через сегмент, она возвращает только первый узел слева.

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: to: vectors (3, 0, 0), (-3, 0, 0), и он снова работает

обращение сегмента должно изменить только то, какой узел возвращается первым, а не сколько.

редактировать: это не на iOS, это на Mac


person Mec Os    schedule 05.02.2018    source источник
comment
См. ответ на этот вопрос: stackoverflow.com/questions/ 46352867/ Другими словами, вам нужно установить параметр searchmode на все, начиная с ios 11.0.   -  person Xartec    schedule 05.02.2018
comment
спасибо, это работает. должен ли он быть предоставлен как ответ, а не комментарий?   -  person Mec Os    schedule 05.02.2018
comment
Я разместил его как комментарий, так как собирался сообщить о нем как о дубликате, но другой вопрос был не совсем таким же, хотя ответ был. Я опубликую это как ответ. Рад, что это сработало.   -  person Xartec    schedule 05.02.2018
comment
На мой взгляд, направление сегмента не должно играть здесь никакой роли, независимо от того, настроены ли параметры на возврат только первого совпадения или всех совпадений. Или я что-то пропустил?   -  person Jaykob    schedule 20.12.2018


Ответы (1)


Apple решила удивить всех в iOS 11, изменив стандартное поведение самых популярных функций. Начиная с IOS 11 вам нужно специально указать хиттесту искать все узлы, а не просто возвращать результат первого попадания:

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

Это вернет его к возврату массива результатов попадания, если были поражены несколько узлов.

person Xartec    schedule 05.02.2018
comment
Любая идея, почему hitTestWithSegment() ожидает строки в словаре параметров? Везде (например, в hitTest() SCNSceneRenderer) он ожидает соответствующие значения структуры, что имеет гораздо больше смысла... - person Jaykob; 20.12.2018