AREnvironmentProbeAnchor отсутствуют в якорях ARFrame - PullRequest
1 голос
/ 05 апреля 2019

Я не могу понять, как работает AREnvironmentProbeAnchor, когда режим automatic.Я предполагаю, что ARKit создает для меня диапазон якорей с текстурой, но я их не вижу.

Я добавил в конфигурацию:

session.configuration.environmentTexturing = AREnvironmentTexturingAutomatic;

Теперь я делаю цикл по всемякоря в рамке и ищу AREnvironmentProbeAnchor:

for (ARAnchor* anchor in frame.anchors) {
    if ([anchor isKindOfClass:[AREnvironmentProbeAnchor class]]) {
        NSLog(@"found");
    }
}

Что может быть не так?

Спасибо!

1 Ответ

1 голос
/ 06 апреля 2019

Вы должны использовать if-statement внутри метода экземпляра renderer(_:didAdd:for:), например. Любой ARAnchor должен принадлежать SCNNode. Попробуйте этот код, чтобы узнать, как он работает (извините, он в Swift, а не в Objective-C):

import UIKit
import SceneKit
import ARKit

class ViewController: UIViewController, ARSCNViewDelegate {

    @IBOutlet var sceneView: ARSCNView!

    override func viewDidLoad() {
        super.viewDidLoad()
        sceneView.delegate = self
        let scene = SCNScene(named: "art.scnassets/yourScene.scn")!

        let sphereNode = SCNNode(geometry: SCNSphere(radius: 0.05))
        sphereNode.position = SCNVector3(x: 0, y: -0.5, z: -1)
        let reflectiveMaterial = SCNMaterial()
        reflectiveMaterial.lightingModel = .physicallyBased
        reflectiveMaterial.metalness.contents = 1.0
        reflectiveMaterial.roughness.contents = 0
        sphereNode.geometry?.firstMaterial = reflectiveMaterial

        let moveLeft = SCNAction.moveBy(x: 0.25, y: 0, z: 0.25, duration: 2)
        moveLeft.timingMode = .easeInEaseOut;
        let moveRight = SCNAction.moveBy(x: -0.25, y: 0, z: -0.25, duration: 2)
        moveRight.timingMode = .easeInEaseOut;
        let moveSequence = SCNAction.sequence([moveLeft, moveRight])
        let moveLoop = SCNAction.repeatForever(moveSequence)
        sphereNode.runAction(moveLoop)

        sceneView.scene = scene
        sceneView.scene.rootNode.addChildNode(sphereNode)
    }
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        let configuration = ARWorldTrackingConfiguration()
        configuration.environmentTexturing = .automatic
        sceneView.session.run(configuration)
    }
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        sceneView.session.pause()
    }
    func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
        guard anchor is AREnvironmentProbeAnchor else {
            print("Environment anchor is NOT FOUND")
            return
        }
        print("It's", anchor.isKind(of: AREnvironmentProbeAnchor.self))
    }
}

Результат:

// It's true

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

...