Nano Hash - криптовалюты, майнинг, программирование

ARAnchor для SCNNode

Я пытаюсь получить привязку после добавления SCNNode в сцену ARSCNView. Насколько я понимаю, якорь должен создаваться автоматически, но я не могу его получить.

Ниже показано, как я его добавляю. Узел сохраняется в переменной с именем testNode.

let node = SCNNode()
node.geometry = SCNBox(width: 0.5, height: 0.1, length: 0.3, chamferRadius: 0)
node.geometry?.firstMaterial?.diffuse.contents = UIColor.green

sceneView.scene.rootNode.addChildNode(node)

testNode = node

Вот как я пытаюсь его восстановить. Он всегда печатает ноль.

if let testNode = testNode {
    print(sceneView.anchor(for: testNode))
}

Разве это не создает якорь? Если это так: есть ли другой метод, который я могу использовать для его получения?

27.03.2018

Ответы:


1

Если вы посмотрите на Apple Docs, там указано, что:

Чтобы отслеживать положение и ориентацию реальных или виртуальных объектов относительно камеры, создайте объекты привязки и используйте метод add(anchor:), чтобы добавить их в сеанс дополненной реальности.

Таким образом, я думаю, что, поскольку вы не используете PlaneDetection, вам нужно будет создать ARAnchor вручную, если это необходимо:

Всякий раз, когда вы размещаете виртуальный объект, всегда добавляйте ARAnchor, представляющий его положение и ориентацию, в ARSession. После перемещения виртуального объекта удалите привязку в старой позиции и создайте новую привязку в новой позиции. Добавление якоря сообщает ARKit, что положение важно, улучшая качество отслеживания мира в этой области и помогая виртуальным объектам оставаться на месте относительно поверхностей реального мира.

Вы можете узнать больше об этом в следующем потоке -inser">В чем разница между использованием ARAnchor для вставки узла и прямой вставкой узла?

В любом случае, чтобы вы начали, я начал с создания SCNNode под названием currentNode:

var currentNode: SCNNode?

Затем, используя UITapGestureRecognizer, я создал ARAnchor вручную в touchLocation:

@objc func handleTap(_ gesture: UITapGestureRecognizer){

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

        //2. If We Have Hit A Feature Point Get The Result
        if let hitTest = augmentedRealityView.hitTest(currentTouchLocation, types: [.featurePoint]).last {

            //2. Create An Anchore At The World Transform
            let anchor = ARAnchor(transform: hitTest.worldTransform)

            //3. Add It To The Scene
            augmentedRealitySession.add(anchor: anchor)


        }

 }

Добавив якорь, я использовал обратный вызов ARSCNViewDelegate для создания currentNode следующим образом:

func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {

        if currentNode == nil{
            currentNode = SCNNode()
            let nodeGeometry = SCNBox(width: 0.2, height: 0.2, length: 0.2, chamferRadius: 0)
            nodeGeometry.firstMaterial?.diffuse.contents = UIColor.cyan
            currentNode?.geometry = nodeGeometry
            currentNode?.position = SCNVector3(anchor.transform.columns.3.x, anchor.transform.columns.3.y, anchor.transform.columns.3.z)
            node.addChildNode(currentNode!)

        }
 }

Чтобы проверить, работает ли он, например, чтобы зарегистрировать соответствующий ARAnchor, я изменил метод tapGesture, чтобы включить это в конце:

if let anchorHitTest = augmentedRealityView.hitTest(currentTouchLocation, options: nil).first,{
            print(augmentedRealityView.anchor(for: anchorHitTest.node))
}

Что в моем ConsoleLog печатает:

Optional(<ARAnchor: 0x1c0535680 identifier="23CFF447-68E9-451D-A64D-17C972EB5F4B" transform=<translation=(-0.006610 -0.095542 -0.357221) rotation=(-0.00° 0.00° 0.00°)>>)

Надеюсь, поможет...

27.03.2018
  • Спасибо, это действительно работает с вашим кодом. То есть это означает, что простое добавление узла SceneKit не создает автоматически ARAnchor? 28.03.2018
  • Я так думаю, да :) 28.03.2018
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..