【问题标题】:iPad Swift Playgrounds won’t run ARKit code/crashesiPad Swift Playgrounds 不会运行 ARKit 代码/崩溃
【发布时间】:2020-01-23 22:00:08
【问题描述】:

我一直在 Swift Playgrounds 上试验 ARKit。我已经编写了启动代码,但是当我运行它时,什么也没有发生。它不评估代码,而是显示显示代码中任何问题的弹出窗口。

我知道我使用的代码有效,因为我在运行旧版本 Swift Playgrounds 的 iPad 上使用了相同的代码,并且代码运行良好。这似乎是 Swift Playgrounds 3 或 Swift 5 的问题。

这是有趣的部分。当我删除运行ARWorldTrackingConfiguration 初始化程序的代码行以及使视图控制器成为会话和场景的委托的代码时,代码运行得很好。当我把它放回去时,它又犯了同样的错误。我不知道出了什么问题。

我在第 6 代 iPad 上运行 Swift Playgrounds 3.0。 Playground 使用 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
    }
}

最后,请注意,我在 Playground 主页面中呈现实时视图,并将课程放入共享代码中。

【问题讨论】:

  • 得到答案后纠正问题是非常糟糕的主意!
  • 我把那部分去掉了

标签: swift ipad augmented-reality arkit swift-playground


【解决方案1】:

我想出了一种方法来完成这项工作。我所要做的就是将视图控制器分配给一个变量,然后呈现该变量。我不完全确定为什么会这样,我只知道它确实有效。

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

【讨论】:

    【解决方案2】:

    使用UpperCamelCasing作为类名并在底部添加两个代码字符串

    此代码适用于macOS Xcode PlaygroundiPad Swift Playgrounds

    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. macOS 上 Playground 的提示(虽然在使用 ARKit 模块时没有多大意义):

    要在 Xcode Playground 11.0 及更高版本中打开 Live View,请使用以下快捷方式:

    命令+选项+返回

    【讨论】:

    • 我这样做了,操场跑了。但是,这导致了一个空白屏幕。所以,我添加了ARSCNView 作为主视图的子视图。这触发了viewDidLoad 并导致通知要求访问相机。然后它继续崩溃。有任何想法吗?感谢您的宝贵建议。
    • 在回答后更正问题不是一个好主意...是所有代码行吗?还是你有别的事情?
    • 我已经撤消了更正,是的,这就是我的全部代码
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多