我想使用 org.opencv.android.javacameraview 作为 Android 手机的背景。然后我希望使用 opengl es 在其上方绘制一些增强现实 3d 模型。任何人都知道如何实现这一点。 opengl es 由 GLSurfaceView 驱动。
最佳答案
我使用 Rajawali,它是 OpenGL 的覆盖层。
我强烈建议您也使用它,因为它可以减轻 OpenGL 带来的很多痛苦。不管怎样,我下面写的确实涉及一些 Rajawali 代码,但原理应该是相似的,你应该能够挑选出你需要的。如果您在这里查看我的工作成果:
http://www.youtube.com/watch?v=yEioXZT-lv0
为此,我以编程方式创建相机 View ,而不是在布局 xml 中。我必须玩一会儿,但以下内容对我有用 - 这位于您的 Activity 的 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,而 RajawaliRenderer 又扩展了 GLSurfaceView.Renderer。可能最好查看后两者的源代码,而不是在这里重现。在我的 OpenGLRenderer 中,我在 initScene() 方法中设置了对象、相机等。我还添加了一些可以从 Activity 调用的方法来控制对象移动等。
我的 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);
}
我希望这会有所帮助 - 祝你好运!
关于java - 如何在android中使用opengl es绘制3d对象,以org.opencv.android.javacameraview作为背景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21721428/