質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

1回答

1905閲覧

カメラビューの上にOpenGLを表示したいが、カメラビューが表示されない

nakatin

総合スコア12

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2019/11/06 08:40

現在、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}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

myGLSurface.setRenderer(myGLSurface)の前に下記設定を行うことで背景が透明化された。
ただし、openGLオブジェクトの矢印も半透明になってしまった。

java

1myGLSurface.setEGLConfigChooser(8, 8, 8, 8, 16, 0); 2myGLSurface.getHolder().setFormat(PixelFormat.TRANSLUCENT);

投稿2019/11/06 23:34

nakatin

総合スコア12

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問