如何在android中使用opengl es绘制3d对象,以org.opencv.android.javacameraview为背景

时间:2014-02-12 07:32:10

标签: java android opencv opengl-es

我想在android手机中使用org.opencv.android.javacameraview作为背景。然后我希望使用opengl es在它上面绘制一些增强现实3d模型。任何人都知道如何实现这一点。操作系统是从GLSurfaceView驱动的。

2 个答案:

答案 0 :(得分:1)

我使用的是Rajawali,它是OpenGL的叠加层。

http://www.rozengain.com/blog/2011/08/23/announcing-rajawali-an-opengl-es-2-0-based-3d-framework-for-android/

我强烈建议你也使用它,因为它需要很多OpenGL的痛苦。无论如何,我在下面提到的确涉及一些Rajawali代码,但原则应该类似,你应该能够找出你需要的东西。如果你看看我的工作成果:

http://www.youtube.com/watch?v=yEioXZT-lv0

要做到这一点,我以编程方式而不是布局xml创建摄像机视图。我不得不玩一下,但以下对我有用 - 这是你的onCreate方法的活动:

mOpenCvCameraView = (CameraBridgeViewBase) new JavaCameraView(this, -1);
    mOpenCvCameraView.setCvCameraViewListener(this);

    mLayout.addView(mOpenCvCameraView);

    mSurfaceView.setZOrderMediaOverlay(true);
    setGLBackgroundTransparent(true);
    mRenderer = new OpenGLRenderer(this);
    mRenderer.setSurfaceView(mSurfaceView);
    super.setRenderer(mRenderer);

mRenderer.setCameraPosition(0, 0, 20);

OpenGLRenderer扩展了RajawaliRenderer,后者又扩展了GLSurfaceView.Renderer。可能最好查看后两者的源代码而不是在这里重现。在我的OpenGLRenderer中,我在initScene()方法中设置了对象,相机等。我还添加了许多方法,可以从Activity调用来控制对象移动等。

我的活动使用下面列出的关键元素扩展了RajawaliActivity:

public class RajawaliActivity extends Activity {
protected GLSurfaceView mSurfaceView;
protected FrameLayout mLayout;
protected boolean mUsesCoverageAa;
private RajawaliRenderer mRajRenderer;
protected boolean checkOpenGLVersion = true;
protected boolean mDeferGLSurfaceViewCreation = false;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if(!mDeferGLSurfaceViewCreation)
        createSurfaceView();
}

protected void createSurfaceView()
{
    mSurfaceView = new GLSurfaceView(this);

    ActivityManager am = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);

    mSurfaceView.setEGLContextClientVersion(2);

    mLayout = new FrameLayout(this);
    mLayout.addView(mSurfaceView);


    setContentView(mLayout);
}

我希望这有帮助 - 祝你好运!

答案 1 :(得分:0)

您可以在onCreate()方法中执行此操作。请记住MyGLSurfaceView构造函数中的setFormat(PixelFormat.TRANSLUCENT)

    mGLView = new MyGLSurfaceView(this);
    setContentView(mGLView);

    mOpenCvCameraView = (CameraBridgeViewBase) new JavaCameraView(this, -1);
    mOpenCvCameraView.setCvCameraViewListener(this);
    addContentView(mOpenCvCameraView, new LayoutParams(
            LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));