現在、GPSで取得した現在位置から目的の緯度経度の方向へ、3Dで描画した矢印を向けるアプリケーションを作成しています。
問題点は、目的地の方向を指し示す3D矢印はカメラプレビューの上に重ねてAR風に表現したいのですが、下画像1のようにカメラビューが映らないことです。
カメラが起動していないと思い、画像2においてcameraViewが上になる順番でaddViewすると、カメラは正常に起動していることが確認できました。
なので、おそらくmyGLSurfaceViewの背景が透明ではないため、上に描画されたmyGLSurfaceViewがカメラビューを隠してしまっているのではないかなと思っています。しかし、MainAcitivityにおいて下記の背景透明の設定をしているはずなので、どうしたものかなと途方に暮れている状況であります。
どなたか、誤っている点や修正方法を簡単でもいいのでアドバイスとして教えていただけないでしょうか。
よろしくお願いします。
java
1myGLSurface.getHolder().setFormat(PixelFormat.TRANSLUCENT);
図1 addView myGLSurface → cameraView → activity_main
図2 addView cameraView → myGLSurface → activity_main
MainActivity.java
java
1 2public class MainActivity extends AppCompatActivity implements LocationListener{ 3 //省略 4 5 @Override 6 protected void onCreate(Bundle savedInstanceState) { 7 super.onCreate(savedInstanceState); 8 FrameLayout layout = new FrameLayout(this); 9 setContentView(layout); 10 11 // Android M Permission check 12 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 13 if (this.checkSelfPermission(android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 14 requestPermissions(new String[]{android.Manifest.permission.ACCESS_COARSE_LOCATION}, PERMISSION_REQUEST_COARSE_LOCATION); 15 } 16 } 17 18 //ロケーションマネージャーを設定 19 locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 20 21 // Tell the cube renderer that we want to render a translucent version 22 myGLSurface = new MyGLSurface(this); 23 myGLSurface.setRenderer(myGLSurface); 24 myGLSurface.setFocusable(true); 25 // Use a surface format with an Alpha channel: 26 myGLSurface.getHolder().setFormat(PixelFormat.TRANSLUCENT); 27 layout.addView(myGLSurface); 28 29 cameraView = new CameraView(this); 30 layout.addView(cameraView); 31 32 View view = getLayoutInflater().inflate(R.layout.activity_main, null); 33 layout.addView(view); 34 35 ready = true; 36 37 TextView tvTargetLocaion = findViewById(R.id.tv_target_locaiton); 38 tvTargetLocaion.setText("Target location\n" + "Lat: " + targetLocation[0] + "\nLong: " + targetLocation[1]); 39 40 Button setTargetLocationButton = findViewById(R.id.set_location_button); 41 setTargetLocationButton.setOnClickListener(new View.OnClickListener(){ 42 @Override 43 public void onClick(View view){ 44 if (ready) targetLocation = currentLocation; 45 TextView tvTargetLocaion = findViewById(R.id.tv_target_locaiton); 46 tvTargetLocaion.setText("Target location\n" + "Lat: " + targetLocation[0] + "\nLong: " + targetLocation[1]); 47 } 48 }); 49 } 50 51 public void hideSystemUI() { 52 View decorView = getWindow().getDecorView(); 53 decorView.setSystemUiVisibility( 54 View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY 55 | View.SYSTEM_UI_FLAG_FULLSCREEN 56 | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION 57 | View.SYSTEM_UI_FLAG_LAYOUT_STABLE 58 | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION 59 | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 60 ); 61 } 62 63 private void calcTargetPosition(double[] location){ 64 double radian; 65 double degree; 66 radian = Math.atan2(targetLocation[0] - location[0], 67 targetLocation[1] - location[1]); 68 degree = Math.toDegrees(radian); //-180~180 69 degree = (degree < 0) ? degree + 360 : degree;//0~360に変換 70 targetDegree = magneticDegree - degree; 71 targetDegree = (targetDegree > 180)? - (360 - targetDegree) : targetDegree; 72 targetDegree = (targetDegree < -180)? (360 + targetDegree) : targetDegree; 73 Log.d("test", "targetDegree = " + targetDegree); 74 } 75 76 private float getCalcDegree(){ 77 double theta; 78 theta = fAttitude[0] - targetDegree; 79 theta = (theta > 180)? - (360 - theta) : theta; 80 theta = (theta < -180)? (360 + theta) : theta; 81 return (float)theta; 82 } 83 84 @Override 85 protected void onResume() { //アプリの再開時 86 super.onResume(); 87 hideSystemUI(); 88 89 if (ActivityCompat.checkSelfPermission(this, 90 Manifest.permission.ACCESS_FINE_LOCATION) != 91 PackageManager.PERMISSION_GRANTED){ 92 Log.d("test","return"); 93 return; 94 } 95 96 //開始時にGPS情報の更新をロケーションマネージャーに登録 97 Log.d("test","requestLocationUpdates"); 98 locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, minTime, minDistance, this); 99 locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, minTime, minDistance, this); 100 myGLSurface.onResume(); 101 } 102 103 @Override 104 protected void onPause() { //アプリの停止時 105 super.onPause(); 106 //終了時にロケーションマネージャーからGPS情報の更新を削除 107 locationManager.removeUpdates(this); 108 myGLSurface.onPause(); 109 } 110 111 //GPSの処理関連 112 //省略 113 114 //---------------------------------------------------------------------------------------------- 115 public class MyGLSurface extends GLSurfaceView implements GLSurfaceView.Renderer, SensorEventListener { 116 117 public MyGLSurface(Context context) { 118 super(context); 119 } 120 @Override 121 public void onSurfaceCreated(GL10 gl, EGLConfig config) { 122 Log.d("test","onSur Created + MatrixMode:" + gl.GL_MODELVIEW); 123 gl.glDisable(GL10.GL_DITHER); 124 gl.glMatrixMode(GL10.GL_PROJECTION); 125 gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, 126 GL10.GL_FASTEST); 127 128 gl.glClearColor(0,0,0,0); 129 gl.glEnable(GL10.GL_CULL_FACE); 130 gl.glShadeModel(GL10.GL_SMOOTH); 131 gl.glEnable(GL10.GL_DEPTH_TEST); 132 } 133 @Override 134 public void onDrawFrame(GL10 gl) { 135// Log.d("test", "onDrawFrame: "); 136 gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); //背面消し 137 //カメラの位置を設定 138 GLU.gluLookAt(gl, 0, 0, 5f, 0, 0, 0, 0, 1, 0); 139 gl.glMatrixMode(GL10.GL_MODELVIEW); //モデルビュー行列追加 140 gl.glLoadIdentity(); 141 gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 142 gl.glTranslatef(0,1.0f,-2.0f); 143 144 gl.glRotatef(getCalcDegree(),0,1.0f,0);//目標座標を指し示す 145 //端末傾きで矢印をx軸で回転 146 float ratio = (Math.abs(getCalcDegree())-90)/90; 147 gl.glRotatef(fAttitude[1]*Math.abs(ratio), -ratio ,0,0); 148// Log.d("test","getCalcDegree: " + getCalcDegree()); 149 150 arrow.draw(gl); 151 } 152 @Override 153 public void onSurfaceChanged(GL10 gl, int width, int height) { 154 Log.d("test","onSur Changed + MatrixMode:" + gl.GL_MODELVIEW); 155 gl.glViewport(0, 0, width, height); 156 gl.glLoadIdentity(); 157 GLU.gluPerspective(gl, 50f, (float)width / height, 0.01f, 100f); 158 159 //デプスバッファ 160 gl.glEnable(GL10.GL_DEPTH_TEST); 161 gl.glEnable(GL10.GL_CULL_FACE); 162 gl.glDepthFunc(GL10.GL_LEQUAL); 163 gl.glClearDepthf(1.0f); 164 165 //シェーディング 166 gl.glShadeModel(GL10.GL_SMOOTH); 167 } 168 169 //センサーの定義---------------------------------------------------------------------------- 170 //省略 171 } 172} 173
CameraView.java
java
1public class CameraView extends SurfaceView implements SurfaceHolder.Callback{ 2 private SurfaceHolder m_Holder; // ホルダーへの参照 3 private Camera m_Camera; 4 5 public CameraView(Context context) { 6 super(context); 7 8 m_Holder= getHolder(); 9 m_Holder.addCallback(this); 10 m_Holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 11 } 12 13 public void surfaceCreated(SurfaceHolder arg0){ 14 try{ 15 m_Camera = Camera.open(); 16 m_Camera.setPreviewDisplay(m_Holder); 17 } 18 catch(Exception e){ 19 20 } 21 } 22 23 public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) { 24 m_Camera.startPreview(); 25 } 26 27 public void surfaceDestroyed(SurfaceHolder holder) { 28 m_Camera.setPreviewCallback(null); 29 m_Camera.stopPreview(); 30 m_Camera.release(); 31 m_Camera = null; 32 } 33} 34
Arrow.java
java
1package com.sekaken.simplegps; 2 3import java.nio.ByteBuffer; 4import java.nio.ByteOrder; 5import java.nio.FloatBuffer; 6 7import javax.microedition.khronos.opengles.GL10; 8 9public class Arrow { 10 private FloatBuffer buffer; 11 12 public Arrow() { 13 float vertex[] = {//省略 14 }; 15 16 ByteBuffer vb = ByteBuffer.allocateDirect(vertex.length * 4); 17 vb.order(ByteOrder.nativeOrder()); 18 buffer = vb.asFloatBuffer(); 19 buffer.put(vertex); 20 buffer.position(0); 21 } 22 public void draw(GL10 gl) { 23 gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 24 gl.glVertexPointer(3, GL10.GL_FLOAT, 0, buffer); 25 26 gl.glPushMatrix(); 27 gl.glColor4f(1.0f,0,0,0); 28 //上面 29 gl.glColor4f(1.0f,0,0,0); 30 gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4); 31 gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 20, 4); 32 //側面 33 gl.glColor4f(0.8f,0,0,0); 34 gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 8, 12); 35 gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 28, 12); 36 //底面 37 gl.glColor4f(0.6f,0,0,0); 38 gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 4, 4); 39 gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 24, 4); 40 gl.glPopMatrix(); 41 } 42}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。