ARKit平面检测 - 类型'ARView'的值没有成员'session'

25
我正在尝试将平面检测添加到一个简单的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' 的值没有成员 'session'

我甚至尝试了苹果在他们的WWDC演示中使用的以下示例(4:27):

苹果演示

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

尝试创建 AnchorEntity 时,我收到以下错误:
Expression type 'AnchorEntity' is ambiguous without more context
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)
    }
}

在 Xcode 13.2 中不再存在这样的问题。 - Andy Jazz
4个回答

52

如果您的构建目标设置为模拟器,则会出现此错误。您需要选择实际设备或通用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)

如果我选择了真实设备,但仍然出现错误怎么办? - colin
你是如何创建RealityKit ARView的,是通过代码还是使用storyboard? - GayleDDS
代码。在我从Xcode 12.3降级回12.2之后,出现了错误。由于版本12.3存在许多冻结问题,我不得不降级。除了RealityKit错误之外,一切都按预期工作。 - colin
1
你是否进行了整体的清理和重建? - GayleDDS
1
我曾经遇到过预览等奇怪的问题。你可以尝试的一件事是删除DerivedData目录中的文件夹。打开DerivedData目录,请执行以下操作。菜单Xcode - 首选项... - 位置(选项卡)- Derived Data部分,然后单击箭头。 - GayleDDS
显示剩余2条评论

4
如果你在基于Interface Builder Storyboard的AR应用中使用iOS模拟器,或者使用iOS SwiftUI预览,则无法为ARView实现面向会话的属性和锚定组件。在这种情况下,你会看到有很多错误。
当在Xcode活动方案中选择模拟器时。

enter image description here


唯一使用会话导向属性来创建您的AR应用的方法是在Xcode Active Scheme下拉菜单中选择一个真实的iOS或iPadOS设备。

当选择真实的苹果设备进行构建时。

enter image description here


installGestures()方法同样适用

iOS模拟器:

enter image description here

真实设备:

enter image description here


然而,使用ARSCNView它可以正常运行,不过我不确定问题出在哪里。 - Jaz King
@JazKing,ARSCNView是基于两个元素 - ARKit和SceneKit的共生视图,正如你所说,它肯定可以正常运行。在ARSCNView中,ARSession(必须由开发人员设置),ARFrames和ARAnchors来自ARKit,而模型来自SceneKit。然而,ARView是一个视图,其中会自动由RealityKit应用程序管理会话,并且此处的任何锚点都可以更改会话的设置。它在ARView中“无法正常运行”的原因在于其本质 - Xcode的模拟器不支持锚定并且不支持用于锚定模型的手势。RealityKit模型必须被锚定。 - Andy Jazz

2
我使用条件编译成功地解决了这个问题。
#if !targetEnvironment(simulator)
    return ARView(frame: .zero)
#else
    return UIView(frame: .zero)
#endif

编译问题已经解决,但我必须承认我仍然在预览方面遇到了一些问题。但我认为这更与代码复杂性有关,而不是与此错误有关。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接