Невозможно интерпретировать поведение pointcloud в Arkit при измерении приложений IOS - PullRequest
0 голосов
/ 18 мая 2018

Я новичок в разработке приложений IOS, и я только начал создавать примеры приложений Arkit из Github.

Одна вещь, которую я попробовал, была по этой ссылке: https://github.com/ttaulli/MeasureAR

Этов основном измеряет расстояние между двумя точками.Когда я запустил это приложение на своем IPhone, я увидел облако точек (набор 3D очков вокруг объекта, который я хотел измерить).Что я не мог понять, так это то, почему две выбранные точки для измерения были не из облака точек?

Я также хотел бы знать следующие вещи:

1) какова точная цель точкиОблако для приложений измерения Arkit?

2) Зависит ли плотность облака точек от цвета объекта (приложения в основном работают на живой камере). Существуют ли другие факторы, влияющие на это облако точек?

Я также был бы рад, если бы кто-нибудь предоставил мне другие примеры измерительных приложений Arkit, в которых пользователю предлагалось выбрать две точки из pointcloud.

Заранее спасибо!

1 Ответ

0 голосов
/ 18 мая 2018

pointCloud, на который вы ссылаетесь, на самом деле является частью ARSCNDebugOptions, а именно:

Варианты рисования оверлейного контента для отладки отслеживания AR в представлении SceneKit.

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

augmentedRealityView.debugOptions = ARSCNDebugOptions.showFeaturePoints 

A featurePoint, поэтому Apple определяется как:

Точка автоматическиидентифицируется ARKit как часть непрерывной поверхности, но без соответствующей привязки.

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

Как вы увидите, featurePoints отображаются в виде желтых точек в ARSCNView, и плохое извлечение объектовобычно вызвано:

(a) Плохое освещение,

(b) Отсутствие текстуры,

(c) Неустойчивое движение устройства пользователя.

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

В основном featurePoints существуют, чтобы помочь вам визуализировать пригодностьдля размещения объектов, например, чем больше FeaturePoints, тем больше текстур или объектов в окружающей среде.

Вам не нужно видеть их как таковые, так как ARKit использует их под капотом, для таких вещей, как выполнение ARSCNHitTest.

Исходя из этого, можно использовать featurePoints в сочетании с ARSCNHitTest, который:

Выполняет поиск реальных объектов или якорей AR в захваченном изображении с камеры.соответствует точке в представлении SceneKit.

Результаты этого hitTest могут затем позволить вам разместить виртуальный контент, например:

/// Performs An ARHitTest So We Can Place An SCNNode
    ///
    /// - Parameter gesture: UITapGestureRecognizer
    @objc func placeVideoNode(_ gesture: UITapGestureRecognizer){

        //1. Get The Current Location Of The Tap
        let currentTouchLocation = gesture.location(in: self.augmentedRealityView)

        //2. Perform An ARHitTest To Search For Any Feature Points
        guard  let hitTest = self.augmentedRealityView.hitTest(currentTouchLocation, types: .featurePoint ).first else { return }

        //3. If We Have Hit A Feature Point Get Its World Transform
        let hitTestTransform = hitTest.worldTransform.columns.3

        //4. Convert To SCNVector3
        let coordinatesToPlaceModel = SCNVector3(hitTestTransform.x, hitTestTransform.y, hitTestTransform.z)

        //5. Create An SCNNode & Add It At The Position Retrieved
        let sphereNode = SCNNode()
        let sphereGeometry = SCNSphere(radius: 0.1)
        sphereGeometry.firstMaterial?.diffuse.contents = UIColor.cyan
        sphereNode.geometry = sphereGeometry
        sphereNode.position = coordinatesToPlaceModel

        self.augmentedRealityView.scene.rootNode.addChildNode(sphereNode)

    }

Вы можете технически измерить расстояние между featurePoints, но этобыло бы действительно бессмысленно, так как они постоянно меняются, и цель измерительного приложения состоит в измерениирасстояние между двумя или более фиксированными точками.

В Интернете есть бесчисленное множество руководств по ARKit и по созданию измерительного приложения.

Надеюсь, это поможет вам немного лучше понять.

Обновление:

Существует ARPointCloud, который представляет собой:

Набор точек в мировом координатном пространстве сеанса AR.

Идоступ к которому можно получить с помощью свойства:

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

Однако,как вы и просили, это в основном то, что вы видите, когда устанавливаете debugOptions.

Если вам интересно и вы хотите получить featurePoints, вы можете сделать это, используя currentFrame ARSession, например::

 func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval) {

  //1. Check Our Frame Is Valid & That We Have Received Our Raw Feature Points
  guard let currentFrame = self.augmentedRealitySession.currentFrame,
     let featurePointsArray = currentFrame.rawFeaturePoints?.points else { return }

 }

Пример этого можно увидеть здесь: Визуализация необработанных характерных точек

...