1

UIImagePickerController を使用してカメラからのライブ ビデオ フィードの上に、GLKView を使用して OpenGL ES コンテンツをオーバーレイしようとしています。いくつかのチュートリアル、本、投稿を読みましたが、まだ答えが見つかりません。参考までに、私が読んだ投稿のいくつかは、ここここ、およびここにあります。

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 オブジェクトが 1 回レンダリングされることがわかります。しかし、UIImagePickerController がサブビューとして追加されると、それが画面上の唯一のものになります。最後の 3 行をコメント アウトすると、OpenGL オブジェクトはレンダリングされますが、もちろんカメラは表示されません。

描画している OpenGL オブジェクトの背後にカメラのビデオ イメージをレンダリングしたいと思います。拡張現実効果の作成。どんな助けでも大歓迎です!

マイク

4

1 に答える 1

1

カメラに何をさせたいですか?ARエフェクトのカメラビューを表示するだけですか、それとも実際に画像データを使用/操作しますか?単純なARディスプレイ以外のものが必要な場合は、AVFoundationを使用してください。

私は以前にこれでたくさんの問題を抱えていて、あなたが持っているのと同じ投稿を読んだので、私は2つの解決策を提供します:

1)コンテナビューを使用する

ストーリーボードファイルで、カメラ用のUIViewを備えたUIViewControllerと、GLKViewControllerに接続されたセグエを備えたコンテナビューを作成します。メインのUIViewControllerをカメラコードにリンクし、GLKViewControllerをOpenGLESコードにリンクします。UIViewControllerが表示されている場合、コンテナ内のUIViewとGLKViewの両方が別々にロードおよび実行されます。

2)アプリデリゲートハック

アプリデリゲート内にUIImagePickerControllerを設定します。具体的には、次のメソッドを使用します。

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

次に、サブビューをウィンドウプロパティに追加します。これにより、ビューの前にカメラがウィンドウにロードされ、レイヤースタックの一番下にあることが常に確認されます。

于 2012-12-23T12:24:13.987 に答える