5

我想制作一个在屏幕上显示 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

任何想法都是有帮助的。谢谢!

4

0 回答 0