我正在尝试将平面检测添加到一个简单的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)
}
}
答案 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)
类及其属性,例如macOS15
和iOS13
方法。在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
属性。
答案 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