ARKit 平面检测 - 类型 'ARView' 的值没有成员 'session'
ARKit Plane Detection - Value of type 'ARView' has no member 'session'
我正在尝试将平面检测添加到一个简单的 ARKit 应用程序中。我想将图片放在垂直平面上。
所以首先我需要检测平面,然后我可以添加我在 RealityKit 中创建的对象锚点。
但是问题是我不确定使用 ARKit 3 和 Xcode11 检测飞机并将其添加到我的场景的正确方法。
它应该很简单:
import ARKit
import RealityKit
@IBOutlet var arView: ARView!
override func viewDidLoad() {
super.viewDidLoad()
let arConfiguration = ARWorldTrackingConfiguration()
arConfiguration.planeDetection = .horizontal
arView.session.run(arConfiguration)
}
但是我收到以下错误:
Value of type 'ARView' has no member 'session'
我什至尝试了以下内容,Apple 在其 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)
}
}
如果您对基于 Interface Builder Storyboard 的 AR 应用程序使用 iOS Simulator
,或者如果您使用 iOS SwiftUI Preview
– 那么您无法实现 session-oriented ARView 的属性 和 锚定组件。如您所见,在这种情况下有很多错误。
在 Xcode 活动方案中选择模拟器时。
为您的 AR 应用程序使用 session-oriented 属性 的唯一方法是在 中选择真实的 iOS 或 iPadOS 设备Xcode Active Scheme
drop-down 菜单。
选择真实的 Apple 设备进行构建时。
installGestures()方法也是如此
iOS模拟器:
真实设备:
如果您的构建目标设置为模拟器,则会出现此错误。您需要 select 实际设备或通用 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)
我设法通过使用条件编译消除了这个问题。
#if !targetEnvironment(simulator)
return ARView(frame: .zero)
#else
return UIView(frame: .zero)
#endif
编译问题停止了,但我承认我在预览时仍然有问题。但我认为这与代码复杂性有关,而不是与此错误有关。
详细说明 Owen 的回答,我可以在 SwiftUI 中为我补充一点,整个 UIViewRepresentable 结构成为编译器 war 区域!这么多错误。
我找到了修复它的方法,也许它可以帮助其他人:
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
我正在尝试将平面检测添加到一个简单的 ARKit 应用程序中。我想将图片放在垂直平面上。
所以首先我需要检测平面,然后我可以添加我在 RealityKit 中创建的对象锚点。
但是问题是我不确定使用 ARKit 3 和 Xcode11 检测飞机并将其添加到我的场景的正确方法。
它应该很简单:
import ARKit
import RealityKit
@IBOutlet var arView: ARView!
override func viewDidLoad() {
super.viewDidLoad()
let arConfiguration = ARWorldTrackingConfiguration()
arConfiguration.planeDetection = .horizontal
arView.session.run(arConfiguration)
}
但是我收到以下错误:
Value of type 'ARView' has no member 'session'
我什至尝试了以下内容,Apple 在其 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)
}
}
如果您对基于 Interface Builder Storyboard 的 AR 应用程序使用 iOS Simulator
,或者如果您使用 iOS SwiftUI Preview
– 那么您无法实现 session-oriented ARView 的属性 和 锚定组件。如您所见,在这种情况下有很多错误。
在 Xcode 活动方案中选择模拟器时。
为您的 AR 应用程序使用 session-oriented 属性 的唯一方法是在 中选择真实的 iOS 或 iPadOS 设备Xcode Active Scheme
drop-down 菜单。
选择真实的 Apple 设备进行构建时。
installGestures()方法也是如此
iOS模拟器:
真实设备:
如果您的构建目标设置为模拟器,则会出现此错误。您需要 select 实际设备或通用 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)
我设法通过使用条件编译消除了这个问题。
#if !targetEnvironment(simulator)
return ARView(frame: .zero)
#else
return UIView(frame: .zero)
#endif
编译问题停止了,但我承认我在预览时仍然有问题。但我认为这与代码复杂性有关,而不是与此错误有关。
详细说明 Owen 的回答,我可以在 SwiftUI 中为我补充一点,整个 UIViewRepresentable 结构成为编译器 war 区域!这么多错误。 我找到了修复它的方法,也许它可以帮助其他人:
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