24

我正在尝试将平面检测添加到一个简单的 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) 中将其用作示例,

苹果演示

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

4 回答 4

51

如果您的构建目标设置为模拟器,则会收到此错误。您需要选择实际设备或通用 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)
于 2019-07-11T05:52:03.743 回答
4

在 Xcode 13.2 中不再有这样的问题了!



如果您使用iOS Simulator基于Interface Builder Storyboard的 AR 应用程序, 或者如果您使用iOS SwiftUI Preview– 那么您将无法为 ARView 实现面向会话的属性锚定组件。如您所见,在这种情况下有很多错误。

在 Xcode Active Scheme 中选择了 Simulator。

在此处输入图像描述


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

选择真正的 Apple 设备进行构建。

在此处输入图像描述


installGestures() 方法也是如此

iOS模拟器:

在此处输入图像描述

真实设备:

在此处输入图像描述

于 2019-07-10T15:26:48.860 回答
2

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

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

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

于 2020-08-15T02:03:20.350 回答
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
于 2021-07-23T11:01:54.650 回答