'OpenGL'에 해당되는 글 8

  1. 2009.07.26 [Android] Camera와 OpenGL 동시에 표시하기 14
  2. 2009.07.25 [Android] OpenGL 로 Sensor 이용하기

  Camera와 OpenGL 동시에 표시하기

  안드로이드에서 카메라와 OpenGL을 동시에 표시하는 

  것을 구현하려고 했더니 잘안되어서 검색을 좀 해봤습니다. 

  해당 이슈는 이미 Google groups 에서 논의되었었는데

  
  제목으로 검색하시면 찾을 수 있습니다.

  제가 처음 시도한 것처럼 카메라 Preview 를 먼저 보이게 하고

  투명한 배경의 OpenGL 화면을 보이게 하려고 했는데

  카메라만 보인다는 내용입니다.

  저역시 카메라만 보이는 것을 확인할 수 있었는데,

  Julius 라는 사람이 쓴 답글을 보면 순서를 거꾸로 하여

  OpenGL을 먼저하고 나중에 카메라를 더하라는 것이 있었습니다.

  그렇게 해보니 신기하게도 카메라 영상과 OpenGL 이 겹쳐져 나오더군요.

  <<디바이스 실행화면>>



  아래의 코드대로 해보시면 아시겠지만, 1.5 버전의 에뮬레이터에서

  투명한 배경이 동작하지 않는 것을 확인했습니다. 

  제가 설치한 에뮬레이터의 버전 문제일지 모르겠으나, 투명이 아니라 

  백색화면에 그래픽 객체는 나오지 않더군요. 

  또다른 구글그룹스의 내용에는 멀티 SurfaceView 를 권장하지 않는다고

  안드로이드 프레임웍 엔지니어가 답글을 달았군요.

  코드는 Cube.java 와 CubeRenderer.java 를 참조하고 있습니다.

  public class camGL extends Activity {

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);


        requestWindowFeature(Window.FEATURE_NO_TITLE);

        this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

        

        Preview mPreview = new Preview(this); 

        

        mRenderer = new CubeRenderer(true);

        

        mGLSurfaceView = new GLSurfaceView(this);

        //translucent

        mGLSurfaceView.setEGLConfigChooser(8, 8, 8, 8, 16, 0);

        mGLSurfaceView.getHolder().setFormat(PixelFormat.RGBA_8888);

        mGLSurfaceView.setRenderer(mRenderer);

        

     //OpenGL 먼저 표시하기

        setContentView(mGLSurfaceView); 

     //그 다음 카메라 표시하기

        addContentView(mPreview, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

        

    }

    

    private GLSurfaceView mGLSurfaceView;

    private CubeRenderer mRenderer;


    @Override

    protected void onResume() {

        super.onResume();

        

    }


    @Override

    protected void onPause() {

        super.onPause();

        

    }

    

}

//////////////////////////////

// camer preview

////////////////////////////

class Preview extends SurfaceView implements SurfaceHolder.Callback { 

    SurfaceHolder mHolder

    Camera mCamera

    

    boolean mPreviewRunning = false;

    

    Preview(Context context) { 

        super(context); 

        mHolder = getHolder(); 

        mHolder.addCallback(this); 

        mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 

        

    } 


    Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() {

        public void onPictureTaken(byte[] data, Camera c) {

            mCamera.startPreview();

        }

    };

    

    public void surfaceCreated(SurfaceHolder holder) { 

        mCamera = Camera.open(); 

        try{

        mCamera.setPreviewDisplay(holder);

         if (false) throw new IOException(); 

        }catch (IOException e){

        //do something

        }

    } 


    public void surfaceDestroyed(SurfaceHolder holder) { 

        mCamera.stopPreview();

        mPreviewRunning = false;//// added

        mCamera = null

    } 


    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 

     if (mPreviewRunning) {    ///added

            mCamera.stopPreview();

        }

    

        Camera.Parameters parameters = mCamera.getParameters(); 

        parameters.setPreviewSize(w, h); 

        mCamera.setParameters(parameters);

        mCamera.startPreview(); 

        //

        try{

        mCamera.setPreviewDisplay(holder);

         if (false) throw new IOException(); 

        }catch (IOException e){

        //do something

        }

        mCamera.startPreview();

        mPreviewRunning = true///added

    } 


}

Interesting/ANDROID | Posted by hyena0 2009. 7. 25. 00:10

[Android] OpenGL 로 Sensor 이용하기


  OpenGL 로 Sensor 이용하기

  안드로이드 개발자 페이지에 있는 

  TouchRotateActivity.java 파일을 기반으로 

  나침반 센서를 이용해서 OpenGL 이미지를 회전 시키는 

  코드로 수정해봤습니다.

  Cube.java 파일은 마찬가지로 개발자 페이지에 있는 것을 

  참조하시면 됩니다.



  public class SensorRotateActivity extends Activity {


   @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);


        mGLSurfaceView = new SensorSurfaceView(this);

        

        setContentView(mGLSurfaceView);

        mGLSurfaceView.requestFocus();

        mGLSurfaceView.setFocusableInTouchMode(true);

        //

        mSensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE); 

        

    }


    @Override

    protected void onResume() {

        super.onResume();

        mGLSurfaceView.onResume();

        //sensor

        mSensorManager.registerListener(mListener,

    mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION),

               SensorManager.SENSOR_DELAY_FASTEST);

    }


    @Override

    protected void onPause() {

        super.onPause();

        mGLSurfaceView.onPause();

    }

    

    // Sensor Stop 추가

    @Override

    protected void onStop()

    {

      mSensorManager.unregisterListener(mListener);

      super.onStop();

    }


    private SensorSurfaceView mGLSurfaceView;

    

    //Acc sensor

    //private static final String TAG = "Compass";


private SensorManager mSensorManager;

private final SensorEventListener mListener = new SensorEventListener() {

public void onSensorChanged(SensorEvent sensorEvent) {

float x = sensorEvent.values[2]; //0 - head , 1 - Pitch, 2 - roll

float y = sensorEvent.values[1]; 

//set scale

x = - x ;

y = - y ;

mGLSurfaceView.onSensor(x,y);

}

public void onAccuracyChanged(Sensor sensor, int accuracy) {

}

};

}


/**

 * Implement a simple rotation control by sensor.

 *

 */

class SensorSurfaceView extends GLSurfaceView {


    public SensorSurfaceView(Context context) {

        super(context);

        mRenderer = new CubeRenderer();

        setRenderer(mRenderer);

        setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);

    }


    public void onSensor(float x, float y){

    mRenderer.mAngleX = x; 

        mRenderer.mAngleY = y;

        requestRender();

    }

    


    /**

     * Render a cube. -> Cube.java 참조할 것 

     */

    private class CubeRenderer implements GLSurfaceView.Renderer {

        public CubeRenderer() {

            mCube = new Cube();

        }


        public void onDrawFrame(GL10 gl) {

           

            gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);


            gl.glMatrixMode(GL10.GL_MODELVIEW);

            gl.glLoadIdentity();

            gl.glTranslatef(0, 0, -3.0f);

            gl.glRotatef(mAngleX, 0, 1, 0);

            gl.glRotatef(mAngleY, 1, 0, 0);


            gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);

            gl.glEnableClientState(GL10.GL_COLOR_ARRAY);


            mCube.draw(gl);

        }


        public int[] getConfigSpec() {

            

            int[] configSpec = {

                    EGL10.EGL_DEPTH_SIZE,   16,

                    EGL10.EGL_NONE

            };

            return configSpec;

        }


        public void onSurfaceChanged(GL10 gl, int width, int height) {

             gl.glViewport(0, 0, width, height);


             float ratio = (float) width / height;

             gl.glMatrixMode(GL10.GL_PROJECTION);

             gl.glLoadIdentity();

             gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);

        }


        public void onSurfaceCreated(GL10 gl, EGLConfig config) {

            

             gl.glDisable(GL10.GL_DITHER);


             gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT,

                     GL10.GL_FASTEST);


             gl.glClearColor(1,1,1,1);

             gl.glEnable(GL10.GL_CULL_FACE);

             gl.glShadeModel(GL10.GL_SMOOTH);

             gl.glEnable(GL10.GL_DEPTH_TEST);

        }

        private Cube mCube;

        public float mAngleX;

        public float mAngleY;

    }


    private CubeRenderer mRenderer;

}