ARKit平面检测-类型“ ARView”的值没有成员“会话”

时间:2019-07-10 14:36:17

标签: ios swift augmented-reality arkit realitykit

我正在尝试将平面检测添加到一个简单的ARKit应用中。我想将图片放在垂直平面上。

因此,首先我需要检测平面,然后可以添加在RealityKit中创建的对象锚。

但是问题是我不确定使用ARKit 3和Xcode 11将平面检测到并将其添加到场景中的正确方法。

它应该很简单:

import ARKit
import RealityKit

@IBOutlet var arView: ARView!

override func viewDidLoad() {
    super.viewDidLoad()

    let arConfiguration = ARWorldTrackingConfiguration()
    arConfiguration.planeDetection = .horizontal
    arView.session.run(arConfiguration)
} 

但是出现以下错误:

  

“ ARView”类型的值没有成员“会话”

我什至尝试了以下内容,Apple在其WWDC演示(4:27)中将其用作示例,

Apple Demo

let anchor = AnchorEntity(plane: .verticle, minimumBounds: [0.2, 0.2])
arView.scene.addAnchor(anchor)

但是尝试创建AnchorEntity时出现以下错误

  

表达类型'AnchorEntity'是模棱两可的,没有更多上下文

import UIKit
import RealityKit
import ARKit

class ViewController: UIViewController {

    @IBOutlet var arView: ARView!

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        // Create a session configuration
    }

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    func addFrame() {
        // Load the "Box" scene from the "Experience" Reality File
        let boxAnchor = try! Experience.loadBox()

        // Add the box anchor to the scene
        arView.scene.anchors.append(boxAnchor)
    }
}

4 个答案:

答案 0 :(得分:1)

如果将构建目标设置为Simulator,则会出现此错误。您需要选择“实际设备”或“通用iOS设备”。

我已经为此花了很多时间,现在添加以下评论

    // If the following line fails to compile "Value of type 'ARView' has no member 'session'"
    // You need to select a Real Device or Generic iOS Device and not a simulator
    arView.session.run(configuration)

答案 1 :(得分:1)

我设法通过条件编译消除了这个问题。

#if !targetEnvironment(simulator)
    return ARView(frame: .zero)
#else
    return UIView(frame: .zero)
#endif

编译问题停止了,但是我承认预览仍然有问题。但是我认为这与代码复杂性而不是与该错误有关。

答案 2 :(得分:0)

您可以在ARView / arView.session及更高版本中使用 run(config) 类及其属性,例如macOS15iOS13方法。在macOS 10.14 Mojave和iOS12中,使用 ARSCNView

@IBOutlet var arScnView: ARSCNView!

arScnView.session.run(arConfiguration)

这是RealityKit的官方documentation

P.S。在Beta版软件中,错误很可能发生

  

如果您正在运行最新版本的OS和Xcode,但仍然出现错误,则有一个简单的解释:这是一个Beta版软件。您可以检查 Apple Game 是否包含与您的here相同的代码字符串(用于运行配置)。

目前,Apple RealityKit工程师尚未在Xcode 11 beta 3中为session类实现ARView属性。

enter image description here

答案 3 :(得分:0)

详细说明 Owen 的答案,我可以在 SwiftUI 中为我补充一点,整个 UIViewRepresentable 结构变成了编译器战区!这么多错误。 我找到了这种方法来修复它,也许它可以帮助其他人:


struct ARVideoPlayerContainer: UIViewRepresentable {
    // If I am on a real device execute my code
    #if !targetEnvironment(simulator)
    [...]
    #else
    // on the simulator execute a fake conformance to UIViewRepresentable... 
    func makeUIView(context: Context) -> UIView { UIView() }
    func updateUIView(_ uiView: UIView, context: Context) {}
    #endif