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

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

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

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

OpenGL

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

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

Q&A

解決済

1回答

1260閲覧

OpenGLのアクティビティに戻るたびにオブジェクトのサイズが変わる

nakatin

総合スコア12

Java

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

OpenGL

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

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

0グッド

0クリップ

投稿2019/08/01 18:11

最近からjava言語でandroidのアプリ開発を始めた初心者です。
作成中のアプリは、GLSurfaceアクティビティがonCreated,さらにスマホの戻るボタンが押された時にカメラでQRコードを読み取ってGLSurfaceアクティビティに戻ることが目的です。

問題点は、GLSurfaceアクティビティがonCreatedされた直後は矢印型の3Dオブジェクトのサイズが期待通りなのですが(画像1枚目)、端末の戻るボタンを押下してQRコード認識のためにカメラレイアウト起動後、3Dオブジェクトのサイズが変わってしまうことです(画像2枚目)。

発生原因と修正方法を簡単でもいいのでアドバイスとして教えていただけないでしょうか。
onCreatedされた直後
戻るボタン押下でいったんカメラが起動後(以降同じサイズ)

MainActivity

java

1省略 2QRコード⇒zxingライブラリ 3 4public class InductionActivity extends Activity { 5 6 private MyGLSurface myGLSurface = null; 7 8 //センサー 9 private SensorManager sensorManager = null; 10 //センサーのフラグ 11 private boolean sensorMRegisted = false; 12 private boolean sensorARegisted = false; 13 //センサーの値保持 14 private float[] magneticValues = new float[3]; 15 private float[] accelerometerValues = new float[3]; 16 17 //傾きの角度 -180 ~ 180 18 private float[] orientationValues = new float[3]; 19 private float[] fAttitude = new float[3]; 20 //回転行列 21 private static final int MATRIX_SIZE = 16; 22 float[] inR = new float[MATRIX_SIZE]; 23 float[] outR = new float[MATRIX_SIZE]; 24 float[] I = new float[MATRIX_SIZE]; 25 26 private Arrow arrow = new Arrow(); 27 private CameraView cameraView; 28 private QrData qrData; 29 30 @Override 31 protected void onCreate(Bundle savedInstanceState) { 32 super.onCreate(savedInstanceState); 33 scanBarcode(); 34 35 FrameLayout layout = new FrameLayout(this); 36 setContentView(layout); 37 38 // Tell the cube renderer that we want to render a translucent version 39 myGLSurface = new MyGLSurface(this); 40 myGLSurface.setRenderer(myGLSurface); 41 myGLSurface.setFocusable(true); 42 // Use a surface format with an Alpha channel: 43 myGLSurface.getHolder().setFormat(PixelFormat.TRANSLUCENT); 44 layout.addView(myGLSurface); 45 46 cameraView = new CameraView(this); 47 layout.addView(cameraView); 48 49 View view = getLayoutInflater().inflate(R.layout.activity_induction, null); 50 layout.addView(view); 51 52 } 53 54 public void scanBarcode() { 55 IntentIntegrator integrator = new IntentIntegrator(this); 56 integrator.initiateScan(); 57 } 58 59 @Override 60 protected void onActivityResult(int requestCode, int resultCode, Intent data) { 61 Log.d("IntentResult:","requestCode: " + requestCode + " resultCode: " + resultCode + " data: " + data); 62 IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data); 63 if(result != null) { 64 if(result.getContents() == null) { 65 } else { 66 qrData = new QrData(result.getContents(),this); 67 } 68 }else { 69 super.onActivityResult(requestCode, resultCode, data); 70 } 71 } 72 73 public void hideSystemUI() { 74 View decorView = getWindow().getDecorView(); 75 decorView.setSystemUiVisibility( 76 View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY 77 | View.SYSTEM_UI_FLAG_FULLSCREEN 78 | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION 79 | View.SYSTEM_UI_FLAG_LAYOUT_STABLE 80 | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION 81 | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 82 ); 83 } 84 85 @Override 86 public boolean onKeyDown(int keyCode, KeyEvent event) { 87 if(keyCode== KeyEvent.KEYCODE_BACK){ 88 scanBarcode(); 89 } 90 } 91 92 @Override 93 protected void onResume() { 94 super.onResume(); 95 hideSystemUI(); 96 myGLSurface.onResume(); 97 } 98 99 @Override 100 protected void onPause() { 101 super.onPause(); 102 myGLSurface.onPause(); 103 } 104 105 public class MyGLSurface extends GLSurfaceView implements GLSurfaceView.Renderer, SensorEventListener { 106 107 public MyGLSurface(Context context) { 108 super(context); 109 } 110 @Override 111 public void onSurfaceCreated(GL10 gl, EGLConfig config) { 112 gl.glDisable(GL10.GL_DITHER); 113 gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, 114 GL10.GL_FASTEST); 115 116 gl.glClearColor(0,0,0,0); 117 gl.glEnable(GL10.GL_CULL_FACE); 118 gl.glShadeModel(GL10.GL_SMOOTH); 119 gl.glEnable(GL10.GL_DEPTH_TEST); 120 } 121 @Override 122 public void onDrawFrame(GL10 gl) { 123 124 gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); //背面消し 125 //カメラの位置を設定 126 GLU.gluLookAt(gl, 0, 2f, 5f, 0, 0, 0, 0, 1, 0); 127 gl.glMatrixMode(GL10.GL_MODELVIEW); //モデルビュー行列追加 128 gl.glLoadIdentity(); 129 gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 130 gl.glTranslatef(0,1.0f,-2.0f); 131 132 //方角で矢印をy軸で回転 133 gl.glRotatef(fAttitude[0],0,1.0f,0); 134 //端末傾きで矢印をx軸で回転 135 136 float ratio = (Math.abs(fAttitude[0])-90)/90; 137 gl.glRotatef(fAttitude[1]*Math.abs(ratio), -ratio ,0,0); 138 139 arrow.draw(gl); 140 } 141 @Override 142 public void onSurfaceChanged(GL10 gl, int width, int height) { 143 gl.glViewport(0, 0, width, height); 144 gl.glMatrixMode(GL10.GL_PROJECTION); 145 GLU.gluPerspective(gl, 50f, (float)width / height, 0.01f, 100f); 146 147 //デプスバッファ 148 gl.glEnable(GL10.GL_DEPTH_TEST); 149 gl.glEnable(GL10.GL_CULL_FACE); 150 gl.glDepthFunc(GL10.GL_LEQUAL); 151 gl.glClearDepthf(1.0f); 152 153 //シェーディング 154 gl.glShadeModel(GL10.GL_SMOOTH); 155 } 156 157 @Override 158 public void onPause() { 159 super.onPause(); 160 161 //センサー解除 162 if (sensorMRegisted || sensorARegisted) { 163 sensorManager.unregisterListener(this); 164 sensorMRegisted = false; 165 sensorARegisted = false; 166 } 167 } 168 169 @Override 170 public void onResume() { 171 super.onResume(); 172 173 Log.d("test","onResume sensor resisterd"); 174 //センサーのインスタンス初期化 175 if (sensorManager == null) { 176 sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); 177 } 178 179 //磁界センサーのリスナー登録 180 List<Sensor> sensorsMagnetic = sensorManager.getSensorList(Sensor.TYPE_MAGNETIC_FIELD); 181 //加速度センサーのリスナー登録 182 List<Sensor> sensorsAcceler = sensorManager.getSensorList(Sensor.TYPE_ACCELEROMETER); 183 184 if (sensorsMagnetic.size() > 0 && sensorsAcceler.size() > 0) { 185 sensorMRegisted = sensorManager.registerListener(this, sensorsMagnetic.get(0), SensorManager.SENSOR_DELAY_GAME); 186 sensorARegisted = sensorManager.registerListener(this, sensorsAcceler.get(0), SensorManager.SENSOR_DELAY_GAME); 187 } else { 188 //センサーが不足していればメッセージを表示 189 Toast.makeText(getApplicationContext(), "Sensors are running short!", Toast.LENGTH_LONG).show(); 190 } 191 } 192 193 @Override 194 public void onSensorChanged(SensorEvent event) { 195 switch (event.sensor.getType()) { 196 case Sensor.TYPE_MAGNETIC_FIELD: 197 magneticValues = event.values.clone(); 198 break; 199 case Sensor.TYPE_ACCELEROMETER: 200 accelerometerValues = event.values.clone(); 201 break; 202 } 203 204 //センサーから得た値を端末の傾き角度に変換する処理 205 if (magneticValues != null && accelerometerValues != null) { 206 SensorManager.getRotationMatrix(inR, I, accelerometerValues, magneticValues); 207 //Activityの表示が縦固定の場合。横向きになる場合は要修正 208 SensorManager.remapCoordinateSystem(inR, SensorManager.AXIS_X, SensorManager.AXIS_Z, outR); 209 210 //SensorManager.getOrientation(outR, orientationValues); 211 SensorManager.getOrientation(outR, orientationValues) 212 //ラジアンを角度に変換 213 fAttitude[0] = (int) Math.toDegrees(orientationValues[0]); 214 fAttitude[1] = (int) Math.toDegrees(orientationValues[1]); 215 fAttitude[2] = (int) Math.toDegrees(orientationValues[2]); 216 } 217 } 218 219 @Override 220 public void onAccuracyChanged(Sensor sensor, int accuracy) { 221 } 222 }

Arrow.java

矢印の形をした3Dオブジェクト

java

1省略 2 3public class Arrow { 4 private FloatBuffer buffer; 5 6 public Arrow() { 7 float vertex[] = { 8 省略 9}; 10 ByteBuffer vb = ByteBuffer.allocateDirect(vertex.length * 4); 11 vb.order(ByteOrder.nativeOrder()); 12 buffer = vb.asFloatBuffer(); 13 buffer.put(vertex); 14 buffer.position(0); 15 } 16 public void draw(GL10 gl) { 17 gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 18 gl.glVertexPointer(3, GL10.GL_FLOAT, 0, buffer); 19 20 gl.glPushMatrix(); 21 gl.glColor4f(1.0f,0,0,0); 22 //上面 23 gl.glColor4f(1.0f,0,0,0); 24 gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4); 25 gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 20, 4); 26 //側面 27 gl.glColor4f(0.8f,0,0,0); 28 gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 8, 12); 29 gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 28, 12); 30 //底面 31 gl.glColor4f(0.6f,0,0,0); 32 gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 4, 4); 33 gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 24, 4); 34 gl.glPopMatrix(); 35 } 36}

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

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

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

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

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

guest

回答1

0

ベストアンサー

デバッグしてみないとわかりませんが、気になった点は、

java

1 @Override 2 public void onDrawFrame(GL10 gl) { 3 4 gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); //背面消し 5 //カメラの位置を設定 6 GLU.gluLookAt(gl, 0, 2f, 5f, 0, 0, 0, 0, 1, 0);

このgluLookAtのマトリクスは、どのマトリクスモードに設定する事を想定していますか?

マトリクスモードは、直前のglMatrixModeでの指定がずっと有効になるはずなので、onSurfaceChangedonDrawFrameと呼ばれた場合は(onSurfaceChangedで設定された)GL_PROJECTIONに、onSurfaceChangedonDrawFrameonDrawFrameと呼ばれた場合は(onDrawFrameで設定された)GL_MODELVIEWになり、動作が不安定になるような気がします。

投稿2019/08/01 19:44

katsuko

総合スコア3469

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問