【问题标题】:How to overlay GLKView on top of UIImagePickerController如何在 UIImagePickerController 之上覆盖 GLKView
【发布时间】:2012-12-07 09:03:52
【问题描述】:

我正在尝试使用 GLKView 将 OpenGL ES 内容覆盖在使用 UIImagePickerController 的摄像头实时视频馈送之上。我已经阅读了几本教程、书籍和帖子,但仍然找不到答案。供您参考,我读过的一些帖子是hereherehere

在 viewDidLoad 中,我正在执行以下操作:

// Create an OpenGL ES 2.0 context and provide it to the view
// NOTE: viewOverlay is of class GLKView and a property of the view controller
viewOverlay.context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
viewOverlay.opaque = NO;
viewOverlay.backgroundColor=[UIColor clearColor];

// Make the new context current
[EAGLContext setCurrentContext:viewOverlay.context];

// Create a base effect that provides standard OpenGL ES 2.0
// Shading Language programs and set constants to be used for 
// all subsequent rendering
self.baseEffect = [[GLKBaseEffect alloc] init];
self.baseEffect.useConstantColor = GL_TRUE;
self.baseEffect.constantColor = GLKVector4Make(
  1.0f, // Red
  0.0f, // Green
  0.0f, // Blue
  1.0f);// Alpha

// Set the background color stored in the current context 
glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // background color

在 viewDidAppear 中我正在这样做:

    UIImagePickerController *uip;
    uip = [[UIImagePickerController alloc] init];
    uip.sourceType = UIImagePickerControllerSourceTypeCamera;
    uip.showsCameraControls = NO;
    uip.toolbarHidden = YES;
    uip.navigationBarHidden = YES;
    uip.wantsFullScreenLayout = YES;
    uip.cameraViewTransform = CGAffineTransformScale(uip.cameraViewTransform, CAMERA_TRANSFORM, CAMERA_TRANSFORM);
   [viewOverlay addSubview:uip.view];
   [viewOverlay sendSubviewToBack:uip.view];
   [viewOverlay bringSubviewToFront:viewOverlay];

如果我单步执行程序,我可以看到 OpenGL 对象被渲染一次。但是,当 UIImagePickerController 作为子视图添加时,它是屏幕上唯一的东西。如果我注释掉最后三行,则会渲染 OpenGL 对象,但当然相机是不可见的。

我希望将相机的视频图像呈现在我正在绘制的 OpenGL 对象的后面。创建增强现实效果。任何和所有的帮助将不胜感激!

迈克

【问题讨论】:

    标签: overlay uiimagepickercontroller eaglview


    【解决方案1】:

    您希望您的相机做什么 - 只是显示一个 AR 效果的相机视图,或者也实际使用/操作图像数据?如果您需要简单的 AR 显示器以外的任何东西,请使用 AVFoundation。

    我之前遇到过很多麻烦,并且阅读了您的相同帖子,因此我提供了两种解决方案:

    1) 使用容器视图

    在您的故事板文件中,创建一个 UIViewController,其中包含一个用于相机的 UIView 和一个顶部的 Container View,并带有一个连接到 GLKViewController 的 segue。将您的主 UIViewController 链接到您的相机代码,并将您的 GLKViewController 链接到您的 OpenGL ES 代码。当 UIViewController 可见时,容器内的 UIView 和 GLKView 都会单独加载和运行。

    2) 应用代理破解

    在应用委托中设置您的 UIImagePickerController,特别是方法:

    (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    

    然后,将子视图添加到您的窗口属性。这将始终确保您的相机在任何视图之前加载到您的窗口中,并确保它位于图层堆栈的底部。

    【讨论】:

    • 我只是想获得相机视图以获得简单的 AR 效果。我不想在相机视图中操纵任何东西。非常感谢您的意见!我会试试你的建议,然后告诉你进展如何。
    • 我尝试 #2 只是因为它看起来最快。它就像一个魅力!当我有时间时,我将实施#1。非常感谢,你为我节省了很多时间!!!
    • 没问题,这只是快速简单的技巧之一。一旦你真正需要使用相机输入,你肯定应该进入 AVFoundation。
    • 很高兴知道。我一定会这样做的。再次感谢!!
    • 我正在尝试使用您的第一个答案。你知道任何地方都有一个很好的教程或文档来实现容器吗?我以前使用过标签和导航容器,但不是这样。
    猜你喜欢
    • 2012-02-12
    • 1970-01-01
    • 1970-01-01
    • 2014-04-13
    • 1970-01-01
    • 2014-10-12
    • 1970-01-01
    • 1970-01-01
    • 2018-01-22
    相关资源
    最近更新 更多