[我有一个应用程序,可以在其中检测图像并在检测到的图像上方的平面上显示UI。以前,我已经成功地在SceneKit ARKit应用程序的平面上显示UIViewController。我正在尝试在检测到的图像上的平面上显示SwiftUI视图。
这是我的代码。
func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? {
// After detecting the image marker
let node = SCNNode()
guard let imageAnchor = anchor as? ARImageAnchor else { return nil }
guard let imageName = imageAnchor.name else { return nil }
let plane = SCNPlane(width: imageAnchor.referenceImage.physicalSize.width,
height: imageAnchor.referenceImage.physicalSize.height)
let planeNode = SCNNode(geometry: plane)
planeNode.eulerAngles.x = -.pi / 2
arViewController = createARController(node: planeNode)
node.addChildNode(planeNode)
return node
}
func createARController(node: SCNNode) -> ARViewController {
let arVC = UIStoryboard(name: "ARStoryboard", bundle: nil).instantiateInitialViewController() as! ARViewController
DispatchQueue.main.async {
arVC.planeNode = node
arVC.willMove(toParent: self)
self.addChild(arVC)
arVC.view.frame = CGRect(x: 0, y: 0, width: 500, height: 500)
self.view.addSubview(arVC.view)
}
self.show(viewController: arVC, on: node)
return arVC
}
private func show(viewController: ARViewController, on node: SCNNode) {
let material = SCNMaterial()
material.diffuse.contents = viewController.view
node.geometry?.materials = [material]
DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(1)) {
// add child vc with swiftui view here.
viewController.addARView()
}
}
class ARViewController: UIViewController {
var planeNode: SCNNode?
@IBOutlet weak var containerView: UIView!
override func viewDidLoad() {
super.viewDidLoad()
print("ARViewController loaded")
// Do any additional setup after loading the view.
}
func addARView() {
let controller = UIHostingController(rootView: SwiftUIARView())
self.addChild(controller)
controller.view.frame = self.view.frame
view.addSubview(controller.view)
controller.didMove(toParent: self)
}
}
如果我在ARViewController上有一个UIKit按钮,则可以看到该按钮,但是当调用addARView()函数来初始化UIHostingController时,我只会看到呈现的黑色视图。实际视图永远不会被渲染。难道我做错了什么?还是暂时不可能?
有人在ARKit SceneKit应用中渲染SwiftUI视图有运气吗?