我想创建一个在屏幕上显示AR的应用程序,并同时记录它。 最简单的想法就是从iOS11的新屏幕录制功能中记录它,但是你无法控制录制行为,所以这不适合我。 使用ReplayKit是一个好主意,我实际上尝试过,但我无法使它适用于未知错误。我正在以不同的方式研究这个问题,所以让我在这里排除这个话题。
我采用的方法之一是使用ARSCNView进行查看,最重要的是有一个专门用于录制的独立SCNRenderer。
这种方法似乎很好,因为它在屏幕上显示模型并记录到文件中 但是渲染结果很奇怪,SCNRenderer的渲染效果不同,有点似乎隐藏的平面移除不起作用。 (请参见下图。角上的图像是SCNRenderer的渲染结果,与记录到文件的内容完全相同。) 我不能在这里展示,但动画也出错了。
当然,我打算以相同的方式为两者设置所有内容,但还有更多的设置参数或需要考虑的事项吗? 或者给出模型的方式是错误的?
场景/渲染器设置的代码如下所示。两个渲染器之间的同步是在ARKit的委托方法中完成的,这里没有显示。
// sceneView is instance variable, which is an ARSCNView
sceneView.delegate = self
//
// Create a empty scenes and wrapper nodes
//
sceneView.scene = SCNScene(named: "art.scnassets/scene.dae")!
secondaryScene = SCNScene(named: "art.scnassets/scene.dae")!
charNode = SCNNode();
sceneView.scene.rootNode.addChildNode(charNode)
charNode2 = SCNNode();
secondaryScene.rootNode.addChildNode(charNode2);
//
// Load the model
//
let url = Bundle.main.url(forResource: "art.scnassets/idle",withExtension: "dae");
let scene = try! SCNScene(url: url!, options: nil);
for child in idleScene.rootNode.childNodes {
charNode.addChildNode(child)
}
// Create exactly the same scene as a new instance.
// (Sharing same instance makes app crash)
let scene2 = try! SCNScene(url: url!, options: nil);
for child in idleScene2.rootNode.childNodes {
charNode2.addChildNode(child)
}
//
// Run the AR session
//
let configuration = ARWorldTrackingSessionConfiguration()
self.sceneView.session.run(configuration)
self.sceneView.session.delegate = self;
//
// Prepare OpenGL
//
let group = GPUImageContext.sharedImageProcessing().context.sharegroup
self.eaglContext = EAGLContext(api: .openGLES2, sharegroup: group! )
let options = ["preferredRenderingAPI": SCNRenderingAPI.openGLES2]
// Secondary renderer for rendering to an OpenGL framebuffer
self.secondaryRenderer = SCNRenderer(context: self.eaglContext, options: options)
self.secondaryRenderer?.scene = secondaryScene
任何想法都有帮助。 谢谢!