硬件限制
这是一个硬件限制,而不是无法在技术上为 ARView 和 ARSCNView 运行 2 个单独的 ARSession。例如,如果您运行两个 ARView,您会看到两个视图中都存在实时摄像头信号,但跟踪不起作用。
工作解决方案
如果您从 ARView 的会话中激活 ARSCNView 的会话,那么两个视图都将起作用。但是,此解决方案适用于后置摄像头的配置。
sceneView.session = arView.session
代码
我在 iPhone X(Xcode 13.2.1,iOS 15.3.1)上构建它,应该说它运行良好。
import ARKit
import RealityKit
class ViewController: UIViewController {
var sceneView = ARSCNView(frame: .zero)
var arView = ARView(frame: .zero)
override func viewDidLoad() {
super.viewDidLoad()
// ARSCNView
sceneView.frame = CGRect(origin: CGPoint(x: 0, y: 0),
size: CGSize(width: 400, height: 400))
self.view.addSubview(sceneView)
sceneView.scene = SCNScene()
sceneView.autoenablesDefaultLighting = true
let sphere = SCNNode(geometry: SCNSphere(radius: 0.2))
sphere.position.z = -1.0
sceneView.scene.rootNode.addChildNode(sphere)
// SESSIONS
sceneView.session = arView.session
// ARView
arView.frame = CGRect(origin: CGPoint(x: 0, y: 405),
size: CGSize(width: 400, height: 400))
self.view.addSubview(arView)
let boxScene = try! Experience.loadBox()
arView.scene.anchors.append(boxScene)
}
}
让我们检查一个配置:
DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
print(self.arView.session.configuration!)
}
结果:
<ARWorldTrackingConfiguration: 0x282ce79c0
worldAlignment=Gravity
lightEstimation=Enabled
frameSemantics=None
videoFormat=< ARVideoFormat: 0x283ad9bd0
imageResolution=(1920, 1440)
framesPerSecond=(60)
captureDeviceType=AVCaptureDeviceTypeBuiltInWideAngleCamera
captureDevicePosition=(1) >
autoFocus=Enabled
environmentTexturing=Automatic
wantsHDREnvironmentTextures=Enabled
planeDetection=Horizontal
collaboration=Disabled
userFaceTracking=Disabled
sceneReconstruction=None
appClipCodeTracking=Disabled>