Как добавить узел в ARKit Scene в зависимости от того, где находится центр устройства при нажатии кнопки? - PullRequest
1 голос
/ 15 марта 2020

Завершающий быстрый новичок, изо всех сил пытающийся добавить узлы в сцену одним нажатием кнопки.

Я знаю, что могу использовать жест касания, чтобы получить координаты касания и выполнить тест удара, а затем поместить объект в трехмерное пространство. где постучал. Однако я хочу показать сферу или перекрестие в центре экрана устройства, и при нажатии кнопки в нижней части экрана происходит то же самое поведение при получении той же информации, которую дал бы жест касания. (По крайней мере, я думаю, что это то, что я Мне нужно сделать здесь, я не уверен.)

После загрузки моей сцены я добавляю маленькую Сферу к дочернему узлу камеры, например:

sphereNode = SCNNode(geometry: SCNSphere(radius: 0.020))
sphereNode?.position = SCNVector3Make(0, 0, -2)
sceneView.pointOfView?.addChildNode(sphereNode!)

Это местами сфера в центре экрана немного впереди камеры. Когда я перемещаю устройство по комнате, сфера остается в середине, как и ожидалось. Я хочу иметь возможность нажать кнопку, а затем получить информацию, которую дал бы жест касания, чтобы выполнить проверку удара и поместить новую сферу в сцену в этом месте. Если нет другого лучшего способа сделать это?

Требуемое поведение очень похоже на поведение измерительного приложения iOS. Точка измерения всегда находится в центре экрана, затем при нажатии Добавить новую точку добавляется.

1 Ответ

0 голосов
/ 27 марта 2020

Ваш подход к использованию hitTest (_: types:) - это путь к go. Я думаю, что связанный, из ARSession, является наиболее простым.

Поскольку вы хотите выполнить тест из центра экрана, а аргумент CGPoint, ожидаемый hitTest(_:types:), нормализован координатное пространство, от (0,0, 0,0) до (1,0, 1,0), все, что вам нужно сделать, это передать (0,5, 0,5).

Вот код:

func buttonAction() {
  guard let currentFrame = session.currentFrame,
    let hitTest = currentFrame.hitTest(CGPoint(x: 0.5, y: 0.5), types: .featurePoint).last else {
    return
  }
  let anchor = ARAnchor(transform: hitTest.worldTransform)
  session.add(anchor: anchor)
}

После добавлена ​​привязка, вы можете добавить узел, используя ARSCNViewDelegate метод рендерер (_: nodeFor:) . По сути, этот метод будет вызываться при добавлении привязки к сеансу.

Кстати, поскольку кажется, что вы используете ARSCNView , вы можете получить доступ к сеансу AR. как это sceneView.session.

...