iPad Swift Playgrounds не запускает код ARKit/вылетает

Я экспериментировал с ARKit на Swift Playgrounds. Я написал стартовый код, но когда я его запускаю, ничего не происходит. Вместо оценки кода он отображает всплывающее окно, которое показывает все проблемы в коде. Ошибка в коде

Я знаю, что код, который я использую, работает, потому что я использовал тот же код на iPad со старой версией Swift Playgrounds, и код работает отлично. Кажется, это проблема либо со Swift Playgrounds 3, либо со Swift 5.

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

Я использую Swift Playgrounds 3.0 и iPad 6-го поколения. Игровая площадка использует ARKit, UIKit, SceneKit и PlaygroundSupport.

Наконец, вот немного кода.

// Code inside modules can be shared between pages and other source files.
import ARKit
import SceneKit
import UIKit
extension ARSCNView {
    public func setup(){
        antialiasingMode = .multisampling4X
        automaticallyUpdatesLighting = false
        preferredFramesPerSecond = 60
        contentScaleFactor = 1.0
        if let camera = pointOfView?.camera {
            camera.wantsHDR = true
            camera.wantsExposureAdaptation = true
            camera.exposureOffset = -1
            camera.minimumExposure = -1
            camera.maximumExposure = 3
        }
    }
}
public class vc : UIViewController, ARSessionDelegate, ARSCNViewDelegate {
    var arscn : ARSCNView!
    var scene : SCNScene!
    public override func loadView() {
        arscn = ARSCNView(frame: CGRect(x: 0, y: 0, width: 768, height: 1024))
        arscn.delegate = self
        arscn.setup()
        scene = SCNScene()
        arscn.scene = scene
        var config = ARWorldTrackingConfiguration()
        config.planeDetection = .horizontal
        arscn.session.delegate = self
        self.view = arscn
        arscn.session.run(configåå)
    }
    public func session(_ session: ARSession, didFailWithError error: Error) {
        // Present an error message to the user
    }

    public func sessionWasInterrupted(_ session: ARSession) {
        // Inform the user that the session has been interrupted, for example, by presenting an overlay
    }

    public func sessionInterruptionEnded(_ session: ARSession) {
        // Reset tracking and/or remove existing anchors if consistent tracking is required
    }
}

Наконец, обратите внимание, что я представляю живое представление на главной странице игровой площадки и помещаю класс в общий код.


person AlexH    schedule 23.09.2019    source источник
comment
Исправлять вопрос после получения ответа - очень плохая идея!   -  person Andy Fedoroff    schedule 24.09.2019
comment
я снял эту часть   -  person AlexH    schedule 25.09.2019


Ответы (2)


Используйте UpperCamelCasing для имен классов и добавьте две строки кода внизу.

Этот код подходит для iPad Swift Playgrounds и macOS Playground:

import ARKit
import PlaygroundSupport

class LiveVC: UIViewController, ARSessionDelegate, ARSCNViewDelegate {

    let scene = SCNScene()
    var arscn = ARSCNView(frame: CGRect(x: 0,
                                        y: 0,
                                    width: 640,
                                   height: 360))

    override func viewDidLoad() {

        super.viewDidLoad()
        arscn.delegate = self
        arscn.session.delegate = self
        arscn.scene = scene

        let config = ARWorldTrackingConfiguration()
        config.planeDetection = [.horizontal]
        arscn.session.run(config)
    }

    func session(_ session: ARSession, didFailWithError error: Error) {}
    func sessionWasInterrupted(_ session: ARSession) {}
    func sessionInterruptionEnded(_ session: ARSession) {}
}

PlaygroundPage.current.liveView = LiveVC().arscn
PlaygroundPage.current.needsIndefiniteExecution = true

P.S. Совет для Playground на macOS (хотя при использовании модуля ARKit в этом нет особого смысла):

Чтобы включить Live View в Playground 11.0, используйте следующий ярлык:

Команда+Опция+Возврат

person Andy Fedoroff    schedule 23.09.2019
comment
Я сделал это, и игровая площадка побежала. Однако это привело к пустому экрану. Итак, я добавил ARSCNView в качестве подвида основного вида. Это вызвало viewDidLoad и привело к уведомлению с запросом на доступ к камере. Затем он потерпел крах. Любые идеи? Спасибо за отличный совет. - person AlexH; 24.09.2019
comment
Исправление вопроса после ответа - не лучшая идея... Это все строки вашего кода? Или у вас что-то другое? - person Andy Fedoroff; 24.09.2019
comment
Я отменил исправление, и да, это весь мой код. - person AlexH; 25.09.2019

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

import ARKit
import SceneKit
import UIKit
import PlaygroundSupport

public class LiveVC: UIViewController, ARSessionDelegate, ARSCNViewDelegate {

    let scene = SCNScene()
    public var arscn = ARSCNView(frame: CGRect(x: 0,y: 0,width: 640,height: 360))

    override public func viewDidLoad() {
        super.viewDidLoad()
        arscn.delegate = self
        arscn.session.delegate = self
        arscn.scene = scene
        let config = ARWorldTrackingConfiguration()
        config.planeDetection = [.horizontal]
        arscn.session.run(config)
        view.addSubview(arscn)
    }
    public func session(_ session: ARSession, didFailWithError error: Error) {}
    public func sessionWasInterrupted(_ session: ARSession) {}
    public func sessionInterruptionEnded(_ session: ARSession) {}
}
var vc = LiveVC()
PlaygroundPage.current.liveView = vc
PlaygroundPage.current.needsIndefiniteExecution = true
person AlexH    schedule 24.09.2019