Как наложить GLKView поверх UIImagePickerController

Я пытаюсь наложить содержимое OpenGL ES, используя GLKView, поверх прямой видеотрансляции с камеры с помощью UIImagePickerController. Я прочитал несколько руководств, книг и сообщений, но до сих пор не могу найти ответ. К вашему сведению, некоторые из прочитанных мною сообщений: здесь, здесь и здесь.

В 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, которые я рисую. Создание эффекта дополненной реальности. Любая помощь будет принята с благодарностью!

Майк


person MikeyE    schedule 07.12.2012    source источник


Ответы (1)


Что вы хотите, чтобы ваша камера делала — просто отображала вид с камеры для эффекта AR или фактически использовала / манипулировала данными изображения? Если вам нужно что-то кроме простого AR-дисплея, используйте AVFoundation.

Раньше у меня было много проблем с этим, и я читал те же сообщения, что и вы, поэтому я предлагаю два решения:

1) Используйте представление контейнера

В файле раскадровки создайте UIViewController с UIView для камеры и Container View сверху с переходом, подключенным к GLKViewController. Свяжите свой основной UIViewController с кодом вашей камеры и свяжите свой GLKViewController с вашим кодом OpenGL ES. И UIView, и GLKView внутри контейнера будут загружаться и работать отдельно, когда UIViewController виден.

2) Взлом делегата приложения

Настройте свой UIImagePickerController внутри делегата приложения, в частности метод:

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

Затем добавьте подвид в свойство окна. Это всегда гарантирует, что ваша камера загружается в ваше окно перед любым просмотром, и гарантирует, что она находится внизу стека слоев.

person Ricardo RendonCepeda    schedule 23.12.2012
comment
Я просто пытаюсь получить вид с камеры для простого эффекта AR. Я не пытаюсь манипулировать чем-либо в поле зрения камеры. Большое спасибо за вклад! Я попробую ваши предложения и дам вам знать, как это происходит. - person MikeyE; 09.01.2013
comment
Я попробовал № 2 только потому, что он выглядел самым быстрым. Оно работало завораживающе! Я реализую # 1 позже, когда у меня будет время. Большое спасибо, вы сэкономили мне столько времени!!! - person MikeyE; 09.01.2013
comment
Нет проблем, это всего лишь один из тех быстрых и легких трюков. Как только вам действительно понадобится использовать вход с камеры, вы обязательно должны перейти в AVFoundation. - person Ricardo RendonCepeda; 09.01.2013
comment
Хорошо знать. Я обязательно это сделаю. Еще раз спасибо!! - person MikeyE; 11.01.2013
comment
Я пытаюсь использовать ваш 1-й ответ. Знаете ли вы где-нибудь хороший учебник или документацию по реализации контейнера? Раньше я использовал вкладки и контейнеры навигации, но не так. - person MikeyE; 17.01.2013
comment
Не совсем. Возможно, вы захотите просмотреть этот поток в качестве отправной точки: stackoverflow.com /вопросы/7755498/ - person Ricardo RendonCepeda; 17.01.2013
comment
Сделаю. Спасибо за информацию. Я работаю над альтернативным методом, основанным на вашем решении № 1. Выложу, когда заработаю. - person MikeyE; 21.01.2013